由于Android十分重视安全性并试图使新的android版本更加安全,因此开发人员很难及时了解新的安全功能并寻找替代方法以使其应用程序与旧功能兼容。
>这个问题与新Android 10中的IMEI有关! 使用下面的代码,旧方法超级容易获得IMEI号码
String deviceId = "";
if (Build.VERSION.SDK_INT >= 26) {
if (telMgr.getPhoneType() == TelephonyManager.PHONE_TYPE_CDMA) {
deviceId = telMgr.getMeid();
} else if (telMgr.getPhoneType() == TelephonyManager.PHONE_TYPE_GSM) {
deviceId = telMgr.getImei();
} else {
deviceId = ""; // default!!!
}
} else {
deviceId = telMgr.getDeviceId();
}
在新版Android 10中,现在只能获取IMEI号。根据android文档
应用必须具有READ_PRIVILEGED_PHONE_STATE特权,才能访问设备的不可重置标识符,包括IMEI和序列号。
问题是,当我们尝试使用以下命令询问运行时权限
android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE
我的编译器无法识别此权限,并且在此行出现错误,但是当我在清单文件中询问此权限时,它会识别此行,但是通过警告该权限仅适用于系统应用程序。
我想使我的应用程序与Android 10兼容,并希望获得IMEI。如何在不成为设备所有者或个人资料所有者的情况下获取Android 10中的IMEI号码?
答案 0 :(得分:1)
仅设备所有者应用可以读取唯一标识符,或者您的应用必须是带有READ_PRIVILEGED_PHONE_STATE
的系统应用。您不能要求普通应用程序具有此权限。
答案 1 :(得分:1)
要获取唯一标识符,可以使用FirebaseInstanceId.getInstance().getId();
或String uniqueID = UUID.randomUUID().toString();
。在此处查看最佳做法https://developer.android.com/training/articles/user-data-ids#java
答案 2 :(得分:0)
Android 10限制开发人员访问IMEI号码。
您可以通过获取软件ID获得替代解决方案。您可以将软件ID用作唯一ID。请在我在Application中使用以下代码。
public static String getDeviceId(Context context) {
String deviceId;
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
deviceId = Settings.Secure.getString(context.getContentResolver(),Settings.Secure.ANDROID_ID);
}else {
final TelephonyManager mTelephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
if (mTelephony.getDeviceId() != null) {
deviceId = mTelephony.getDeviceId();
} else {
deviceId = Settings.Secure.getString(
context.getContentResolver(),
Settings.Secure.ANDROID_ID);
}
}
return deviceId;
}