manifest.json权限修改需配对、写对、重打包三者缺一不可;android权限须用全限定名数组声明于app-plus.distribute.android.permissions;微信小程序requiredprivateinfos须与api调用名精准匹配;改完必须重新发行或云打包;权限声明不等于自动弹窗,需配合运行时api调用且字符串字节级一致。

manifest.json 里改权限不是“保存就生效”,必须配对、写对、再重打包,三者缺一不可。漏一个字符、少一个前缀、没重新发行,真机上就静默失败——连错误提示都不会有。
manifest.json 的 Android 权限必须用全限定名数组
Android 权限声明位置在 app-plus.distribute.android.permissions,值必须是字符串数组,每个元素带完整前缀:"android.permission.CAMERA"、"android.permission.ACCESS_FINE_LOCATION"。
- ❌ 错误写法:
"CAMERA"、"camera"、{"android.permission.CAMERA": {}}(对象格式会被 HBuilderX 忽略) - ❌ 错误写法:
"ACCESS_FINE_LOCATION"(缺android.permission.前缀) - ✅ 正确写法:
["android.permission.CAMERA", "android.permission.RECORD_AUDIO"] - ⚠️ 注意:
READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE在 Android 10+ 已被限制,正式包建议改用MANAGE_EXTERNAL_STORAGE或迁移到 Scoped Storage
微信小程序 requiredPrivateInfos 必须精准匹配 API 名
mp-weixin 节点下的 requiredPrivateInfos 不是开关,而是白名单。你代码里调了哪个 uni.xxx,这里就必须写对应字符串,大小写、下划线、拼写全得一字不差。
- 只用
uni.getLocation→requiredPrivateInfos只能填"getLocation" - 还用了
uni.chooseLocation→ 必须同时加"chooseLocation",漏一个就返回errCode: -1,控制台无提示 - 必须配
permission.scope.userLocation.desc字段,且不能为空,否则华为/小米商店审核大概率拒掉
改完 manifest.json 后必须重新「发行」或「云打包」
可视化界面勾选只是快捷方式,最终仍转成源码里的数组;手动改了 JSON 源码后,HBuilderX 不会自动触发重建逻辑。
- 本地调试:改完需点击菜单栏「发行」→「原生App-本地打包」或「云打包」
- CLI 项目:运行
npm run build:app-plus或对应打包命令 - ⚠️ 编辑后仅保存、刷新、重启 HBuilderX 或重编译 H5/小程序,不会更新 AndroidManifest.xml,权限依然无效
权限声明 ≠ 自动弹窗,必须配合运行时调用
manifest.json 只是告诉系统“我可能要用”,真正触发弹窗的是代码里调用 plus.android.requestPermissions(App)或 uni.authorize(小程序),且传入的权限名必须和 manifest 里声明的**字节级一致**。
- 只配 manifest 不调 API → 完全不弹窗
- 只调 API 不配 manifest → 真机直接进
fail回调,deniedAlways可能为空,容易误判为“用户拒绝” - App 启动时(如
onLaunch)就调权限 → 华为/OPPO/vivo 应用市场明令禁止,会驳回上架
最容易被忽略的其实是“三者一致性”:manifest 声明的字符串、API 调用传入的字符串、最终生成的 AndroidManifest.xml 里的 <uses-permission></uses-permission> 标签内容,必须完全相同。任何一处脱节,权限链就断了,而且断得悄无声息。











