我想获取每个 Android 设备唯一的设备 ID。我目前正在为平板设备开发。想要获取唯一的设备 id 并存储相应的值...
所以,我想知道如果我使用 TelephonyManager.getDeviceId()...,平板设备是否会返回一个值......?或者是否有任何其他值对每个设备都是唯一的???
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;
}
这不是一个重复的问题。事实证明,Google 的 CTS 要求 TelephonyManager 的 getPhoneType 必须为 none,非电话设备的 TelephonyManager 的 getDeviceId 必须为 null。
所以要获取IMEI,请尝试使用:
String imei = SystemProperties.get("ro.gsm.imei")
不幸的是,SystemProperties 是 Android 操作系统中的一个非公共类,这意味着它对常规应用程序不公开。尝试查看这篇文章以获得访问它的帮助:android.os.SystemProperties 在哪里
自 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
}