随着Android对安全性的重视,并试图使新的android版本更加安全,开发人员很难跟上新的安全特性,并找到新的方法来使他们的应用程序与旧功能兼容。
这个问题是关于NewAndroid10!中的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号码?
发布于 2019-09-19 11:41:47
只有设备所有者应用程序才能读取唯一标识符,否则应用程序必须是带有READ_PRIVILEGED_PHONE_STATE的系统应用程序。对于一个普通的应用程序,你不能请求这个许可。
发布于 2020-01-06 08:11:00
Android 10限制开发者访问IMEI号码。
您可以通过获取软件ID来获得另一种解决方案。您可以使用软件id作为唯一的id。请找到下面的代码,我在应用程序中使用。
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;
}发布于 2019-09-30 08:54:19
要获得唯一标识符,可以使用FirebaseInstanceId.getInstance().getId();或String uniqueID = UUID.randomUUID().toString();。在这里查看一下最佳实践https://developer.android.com/training/articles/user-data-ids#java
https://stackoverflow.com/questions/57993401
复制相似问题