You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 19:22:47