我想获得每个Android设备唯一的设备ID。我目前正在开发平板电脑设备。想获得唯一的设备ID并存储相应的值......
所以,我想知道如果我使用TelephonyManager.getDeviceId(),平板电脑设备是否会返回一个值... ???或者是否有任何其他值对每个设备都是唯一的?
答案 0 :(得分:57)
TelephonyManger.getDeviceId()返回唯一的设备ID,例如GSM的IMEI和CDMA手机的MEID或ESN。
final TelephonyManager mTelephony = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
String myAndroidDeviceId = mTelephony.getDeviceId();
但我建议使用:
Settings.Secure.ANDROID_ID ,将Android ID作为唯一的64位十六进制字符串返回。
String myAndroidDeviceId = Secure.getString(getApplicationContext().getContentResolver(), Secure.ANDROID_ID);
有时 TelephonyManger.getDeviceId()将返回null,因此为了确保您将使用此方法的唯一ID:
public String getUniqueID(){
String myAndroidDeviceId = "";
TelephonyManager mTelephony = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
if (mTelephony.getDeviceId() != null){
myAndroidDeviceId = mTelephony.getDeviceId();
}else{
myAndroidDeviceId = Secure.getString(getApplicationContext().getContentResolver(), Secure.ANDROID_ID);
}
return myAndroidDeviceId;
}
答案 1 :(得分:9)
这是不是重复的问题。事实证明,Google的CTS要求TelephonyManager的getPhoneType必须为none,并且对于非电话设备,TelephonyManager的getDeviceId需要为null。
所以要获得IMEI,请尝试使用:
String imei = SystemProperties.get("ro.gsm.imei")
不幸的是,SystemProperties是Android操作系统中的非公共类,这意味着常规应用程序无法公开使用它。请尝试查看此帖子以获取访问权限:Where is android.os.SystemProperties
答案 2 :(得分:2)
自Android 8以来,一切都发生了变化。您应该使用Build.getSerial()
来获取设备的序列号并添加权限READ_PHONE_STATE
。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
serial = Build.getSerial(); // Requires permission READ_PHONE_STATE
} else {
serial = Build.SERIAL; // Will return 'unknown' for device >= Build.VERSION_CODES.O
}
以这种方式获取IMEI或MEID:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
String imei = tm.getImei(); // Requires permission READ_PHONE_STATE
serial = imei == null ? tm.getMeid() : imei; // Requires permission READ_PHONE_STATE
} else {
serial = tm.getDeviceId(); // Requires permission READ_PHONE_STATE
}