網上有很多方法,我這裏做個總結,以下是用多部手機測試得來的結果:
1.小結:
1.Android 9及以上無法獲取sn,Android 9以下不需要權限即可獲取
2.獲取到的參數相對穩定不變
3.不同手機參數長度可能不同
補充:新增獲取方法:Build.getSerial()
1.可以獲取到多數Android 9及以上手機sn
2.sn獲取值與實際值可能不符(少數)
3.使用此方法有侷限性,SDK編譯版本26起步:compileSdkVersion 26
2.獲取代碼:
/**
* 獲取SN
* @return
*/
public static String getSN() {
String serial = "";
//通過android.os獲取sn號
try {
serial = android.os.Build.SERIAL;
if (!serial.equals("")&&!serial.equals("unknown"))return serial;
}catch (Exception e){
serial="";
}
//通過反射獲取sn號
try {
Class<?> c =Class.forName("android.os.SystemProperties");
Method get =c.getMethod("get", String.class);
serial = (String)get.invoke(c, "ro.serialno");
if (!serial.equals("")&&!serial.equals("unknown"))return serial;
//9.0及以上無法獲取到sn,此方法爲補充,能夠獲取到多數高版本手機 sn
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)serial = Build.getSerial();
} catch (Exception e) {
serial="";
}
return serial;
}
3.不同手機的獲取結果:
注:這裏所說的權限是
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
華爲Android7.0:
無論是否有權限:
sn獲取:XPUDU173230257** 參數穩定
sn獲取:XPUDU173230257**
vivo Android7.1:
無論是否有權限:
sn獲取:BIEQ9TEYOFUOO7** 參數穩定
sn獲取:BIEQ9TEYOFUOO7**
酷派 Android7.1:
無論是否有權限:
sn獲取:1dabb4** 參數穩定
sn獲取:1dabb4**
華爲Android8.0:
無論是否有權限:
sn獲取:SNMBB183055041** 參數穩定
sn獲取:SNMBB183055041**
華爲Android8.0:
無論是否有權限:
sn獲取:68U5T184030156** 參數穩定
sn獲取:68U5T184030156**
vivo 8.1
無論是否有權限,均獲取不到
無論是否有權限:
sn獲取:KZ9DBQKBVGCIYH** 參數穩定
sn獲取:KZ9DBQKBVGCIYH**
oppo 9.0
無論是否有權限,均獲取不到
sn:unknown
vivo 9.0
無論是否有權限,均獲取不到
sn:unknown
三星 9.0
無論是否有權限,均獲取不到
sn:unknown
華爲Android10
無論是否有權限,均獲取不到
sn:unknown
華爲Android10
無論是否有權限,均獲取不到
sn:unknown
4.嘗試獲取Android 9及以上版本的 sn
//新增方法:
//使用此方法有侷限性,SDK編譯版本26起步:compileSdkVersion 26
serial = Build.getSerial();
Log.e(TAG, "sn:"+getSN());
測試結果:
OPPO 9.0
無權限時:sn:
有權限時:sn:RK55JFEQ4LM74T**
vivo 9.0
無權限時:sn:
有權限時:sn:42858e**
三星 9.0
無權限時:sn:
有權限時:sn:483fce** (與實際值不符,但唯一)
華爲Android10
無權限時:sn:
有權限時:sn:8UJ4C19B270175**
華爲Android10
無權限時:sn:
有權限時:sn:unknown