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
相关产品推荐
相关产品推荐

