manifest.json声明权限仅为打包前提,不触发弹窗;真正弹窗需运行时调用plus.android.requestPermissions或uni.authorize,且权限名必须带android.permission.前缀,声明与调用须严格一一对应。

plus.android.requestPermissions 或小程序的 uni.authorize。不配 manifest 会打包失败,只配 manifest 不调 API 则完全不会弹窗。
manifest.json 中 Android 权限必须写全限定名
Android 权限字段必须带 android.permission. 前缀,比如 android.permission.CAMERA,不能简写成 CAMERA 或 camera。否则 HBuilderX 打包时不会报错,但生成的 APK 在 Android 6.0+ 上会因权限未声明而直接拒绝调用,plus.android.requestPermissions 回调里的 deniedAlways 可能为空,容易误判为“用户没点”,实际是系统压根不认这个权限。
- 正确写法:
"android.permission.ACCESS_FINE_LOCATION" - 错误写法:
"ACCESS_FINE_LOCATION"、"location"、"fine_location" - 常见遗漏项:
android.permission.READ_EXTERNAL_STORAGE和android.permission.WRITE_EXTERNAL_STORAGE在 Android 10+ 需配合requestLegacyExternalStorage使用(仅调试期),正式上架建议迁移到Scoped Storage方案
微信小程序 requiredPrivateInfos 必须精准匹配接口名
微信小程序的隐私接口声明不是“开个权限就行”,而是按具体 API 名精确登记。比如你只调 uni.getLocation,manifest.json 的 requiredPrivateInfos 就只能写 "getLocation";如果还用了 uni.chooseLocation,必须一并加上,漏一个就会在真机上静默失败,控制台无报错,只返回 errCode: -1。
- 合法值仅限微信文档明确列出的接口名:
"getLocation"、"chooseLocation"、"getPhoneNumber"、"getUserInfo"等 - 不能写别名或驼峰变体,比如
"getlocation"、"get_user_location"、"uniGetLocation"都无效 -
permission.scope.userLocation.desc字段必须存在且非空,否则审核可能被拒(尤其华为、小米应用商店)
App 启动时不要自动触发权限申请
很多开发者在 App.vue 的 onLaunch 里直接调 plus.android.requestPermissions,结果用户还没看到隐私协议就弹出系统权限框——这在华为、OPPO、vivo 等厂商的应用市场审核中属于高危行为,直接驳回。
- 合规做法:先展示自定义弹窗(含隐私政策链接 + “同意并继续”按钮),用户点击同意后,再在下一页或首页
onShow中调用权限申请 - 避免在
onLaunch或冷启动阶段调用任何涉及READ_PHONE_STATE、GET_ACCOUNTS、READ_EXTERNAL_STORAGE的 API - 安卓 13+ 新增
POST_NOTIFICATIONS权限,必须单独申请,不能和其他权限一起批量请求,否则部分机型会忽略
权限配置与平台字段强绑定,跨平台不通用
manifest.json 里不同平台的权限配置互不影响,也绝不共享。你在 app-plus.distribute.android.permissions 里写的权限,对微信小程序完全无效;同理,mp-weixin.requiredPrivateInfos 对 App 打包毫无作用。
- App 权限路径:
app-plus → distribute → android → permissions - 微信小程序路径:
mp-weixin → requiredPrivateInfos+permission子节点 - H5 平台无需声明权限,所有浏览器 API(如
navigator.geolocation)由浏览器自行弹窗,manifest 中对应字段留空即可 - 支付宝小程序用
mp-alipay.permission,字段结构和微信不同,不能照搬


















