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

Android 10获取IMEI报错:用户10170不符合访问设备标识符要求求助

问题根本原因

Android 10(API 等级 29)开始,系统对IMEI、MEID、设备序列号等不可重置的设备标识符做了严格的访问限制,普通第三方应用无论是否申请权限都无法获取这类信息:

  • android.permission.READ_PRIVILEGED_PHONE_STATE属于系统级特权权限,仅对预装在系统/system/priv-app目录的应用、和系统签名一致的应用开放,普通第三方应用即使在AndroidManifest中声明该权限也无法被授予
  • 即便是已经拿到READ_PHONE_STATE动态权限,从Android 10开始,第三方应用调用getImei()、getDeviceId()等获取设备标识符的接口,也会直接抛出权限异常,只有设备所有者、配置文件所有者、具备特殊运营商权限的系统应用才有权限调用这类接口。
可行解决方案

根据你的应用场景选择对应方案:

场景1:开发普通第三方应用上架应用市场

直接放弃获取IMEI,改用Android官方推荐的合规替代标识即可:

  • 若需要统计广告、跨应用用户标识,使用广告ID(Advertising ID),该标识支持用户手动在系统设置中重置,符合全球隐私合规要求
  • 若仅需要应用内唯一用户标识,使用ANDROID_ID即可,该值在应用安装后到用户恢复出厂设置/卸载重装前保持唯一,且无需申请额外权限,获取代码示例:
String androidId = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID);

场景2:开发系统级定制应用(仅用于预装ROM、定制设备内部使用)

满足以下任意一个条件即可正常获取IMEI:

  • 将应用预装到设备系统的/system/priv-app目录下,系统会自动授予你声明的READ_PRIVILEGED_PHONE_STATE特权权限
  • 使用对应设备ROM的系统签名文件对你的应用进行签名,签名后即可获得该特权权限。
兼容低版本补充说明

如果你的应用需要兼容Android 9及以下版本,保留原有READ_PHONE_STATE权限的动态申请逻辑即可,Android 6.0到Android 9的设备上,只要用户授权该权限,就可以正常调用getImei()方法获取IMEI。


内容的提问来源于stack exchange,提问作者lewis machilika

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 22:27:01