Android 10中Android开发者无法获取IMEI

4

由于安卓非常注重安全,并且试图使新的安卓版本更加安全,因此对于开发者来说,随着新的安全特性的出现以及寻找旧方法的替代方案,让他们的应用程序兼容旧特性变得越来越困难。

这个问题是关于新版安卓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号码现在已被限制。根据安卓文档:

应用程序必须拥有READ_PRIVILEGED_PHONE_STATE特权权限,才能访问设备的不可重置标识符,包括IMEI和序列号。

问题在于,当我们尝试使用以下代码请求运行时权限时

  android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE

我的编译器无法识别这些权限,我在这一行代码上得到了错误提示。但是当我在清单文件中申请这些权限时,它能够识别这行代码,并警告说这些权限仅适用于系统应用。

我希望使我的应用与Android 10兼容,并获取IMEI。如何在Android 10中获取IMEI号码,而不需要成为设备所有者或配置文件所有者?


1
除非您正在开发系统级应用程序,否则无法在Android 10中访问IMEI。但是,您可以使用其他唯一标识符:https://developer.android.com/training/articles/user-data-ids - Nikos Hidalgo
1
可能是重复的问题:我在Android Q中获取IMEI为空? - Nikos Hidalgo
3个回答

3

只有设备所有者应用程序可以读取唯一标识符,或者您的应用程序必须是具有READ_PRIVILEGED_PHONE_STATE的系统应用程序。 普通应用程序无法请求此权限。


在Android 10中,使用设备所有者应用程序可以获取IMEI吗? - Ahmad
是的,你可以做到。 - greywolf82
有没有可能在没有 root 的情况下通过编程方式获取此权限? - Ahmad
不,你不能这样做。 - greywolf82
最新的补丁太难root了 :/ 请问您有什么建议可以让我更容易地进行root操作吗? - Ahmad

3

Android 10限制了开发者访问IMEI号码。

您可以通过获取软件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;

}

谢谢,它有效了并且拯救了我的一天。 - Priya Vasoya
"deviceId = Settings.Secure.getString(context.getContentResolver(),Settings.Secure.ANDROID_ID);" 这一行足以获取设备ID信息。 普通应用程序无法获得READ_PRIVILEGED_PHONE_STATE权限。 - Ranjithkumar

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接