Android 11(API 30)设备获取唯一标识符及代码报错求助
Android 11 获取设备唯一标识符问题解决指南
先搞定你遇到的空指针异常
你代码里直接把Context context设为null,调用context.getSystemService()肯定会触发空指针。解决起来很简单,给方法传入一个有效的Context实例就行——比如当前Activity的上下文,或者Application的上下文:
修改后的IMEI获取方法(先提一句权限问题):
public String getIMEI(Context context) { TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); try { return telephonyManager.getImei(); } catch (SecurityException e) { Log.e("IMEI Error", "无法获取IMEI:权限不足或系统限制", e); return null; } }
调用的时候,在Activity里直接传this就行:
String imei = getIMEI(this);
重要提醒:Android 11 普通应用拿不到IMEI
从Android 11(API 30)开始,普通第三方应用完全无法获取IMEI、MEID这类电话硬件标识符,哪怕你申请了READ_PHONE_STATE权限也没用。只有系统预装应用或者拿到READ_PRIVILEGED_PHONE_STATE特殊权限的应用才能获取,这个权限普通开发者根本拿不到。
替代方案:用Android ID当唯一标识符
既然你只需要一种唯一标识,推荐用Android ID,它不需要任何特殊权限,大部分场景下够用:
public String getAndroidID(Context context) { return Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID); }
调用示例:
String androidId = getAndroidID(this);
补充:Android ID是一个64位字符串,同一设备上所有应用拿到的ID都一样,除非用户恢复出厂设置或者刷机,否则不会变动。
关于MAC地址的说明
Android 11及以上也把MAC地址的获取给限制死了,普通应用只能拿到02:00:00:00:00:00这种虚拟值,完全没法当唯一标识用,别折腾这个了。
内容的提问来源于stack exchange,提问作者matchaLover
相关产品推荐
相关产品推荐

