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

Android11下React Native模块获取ro.serialno属性报Access denied错误如何解决

Android 11读取ro.serialno属性权限报错解决方案

报错原因

Android 10(API 29)及以上系统对不可重置的设备标识符做了严格权限限制:

  • 普通第三方应用即使声明了READ_PHONE_STATE权限,也无法读取ro.serialno系统属性
  • 你Manifest中声明的READ_PRIVILEGED_PHONE_STATE是系统级特权权限,只有预装在系统特权分区、使用系统签名的应用才能正常获取,普通应用添加该权限也不会生效

可用解决方案

你可以根据自己的业务场景选择对应方案:

  • 方案1:降低targetSdkVersion(仅适合不上架Google Play的应用)
    将项目的targetSdkVersion降到28(Android 9),同时在代码中动态申请READ_PHONE_STATE危险权限,用户授权后即可正常读取ro.serialno属性。注意目前Google Play要求上架应用的targetSdkVersion不低于33,该方案仅适合国内分发的应用。
  • 方案2:替换标识符方案(最推荐)
    移除业务逻辑中对ro.serialno的依赖,改用Android官方推荐的标识符替代:
    • 广告ID(Advertising ID):适合跨应用的用户标识场景,用户可重置
    • App Set ID:适合同一开发者多应用的关联标识场景
    • 本地生成UUID:在App首次启动时生成UUID存入沙盒,可满足单应用内的唯一标识需求
  • 方案3:更新第三方依赖
    如果你依赖的第三方SDK(比如Manifest中声明的支付SDK)内部读取ro.serialno导致报错,联系SDK厂商提供适配Android 10+的版本,移除对该系统属性的读取逻辑即可。
  • 方案4:系统级应用适配
    如果你的应用是定制ROM预装应用、可拿到系统签名,给应用添加系统签名后,READ_PRIVILEGED_PHONE_STATE权限即可生效,可正常读取ro.serialno属性。

内容的提问来源于stack exchange,提问作者Zdeněk Dolák

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 06:33:03