manifest.json 仅静态声明权限,不触发弹窗;必须在代码中调用 plus.android.requestPermissions(Android)或 uni.authorize(小程序),且三者权限名须字节级一致。
直接说结论:manifest.json 不是“配完就能用”的配置文件,它只管静态声明,不触发任何弹窗;真要拿到权限,必须在代码里调 plus.android.requestpermissions(android)或 uni.authorize(小程序),且两者权限名必须严格一致——错一个字符、少一个前缀,就白配。
Android 权限怎么写进 manifest.json 才不被系统无视
Android 6.0+ 要求权限必须静态声明 + 动态申请,缺一不可。声明位置在 app-plus→distribute→android→permissions 下,填字符串数组,每个元素必须是完整限定名:
-
"android.permission.CAMERA"—— 不能写成CAMERA、camera或android.hardware.camera -
"android.permission.ACCESS_FINE_LOCATION"——ACCESS_COARSE_LOCATION粗略定位不够用时,必须换这个 -
"android.permission.READ_EXTERNAL_STORAGE"和"android.permission.WRITE_EXTERNAL_STORAGE"在 Android 10+ 已失效,正式包应改用MANAGE_EXTERNAL_STORAGE(需说明用途)或迁移到 Scoped Storage - 拼写错误、多空格、结尾斜杠、XML 标签式写法(如
<uses-permission ...>)都会导致打包无报错但运行时权限被系统静默拒绝
微信小程序 requiredPrivateInfos 怎么填才不静默失败
微信小程序的隐私接口不是“开个总开关”,而是按具体 API 名精确登记。漏一个、错一个,真机上就返回 errCode: -1,控制台不报错,也不提示,极难排查:
- 只调
uni.getLocation,requiredPrivateInfos就只能写"getLocation" - 如果还用了
uni.chooseLocation,必须同时加上,不能省略 - 合法值仅限微信文档明确列出的字符串:
"getLocation"、"getPhoneNumber"、"getUserInfo"等,大小写、下划线、驼峰全都不认 -
permission.scope.userLocation.desc字段必须存在且非空,否则华为/小米等应用商店审核大概率拒掉
为什么 onLaunch 里直接 requestPermissions 会被应用市场驳回
很多开发者图省事,在 App.vue 的 onLaunch 里立刻调 plus.android.requestPermissions,结果用户还没看到隐私协议就弹出系统授权框——这是华为、OPPO、vivo 等厂商明令禁止的高危行为:
- 必须先展示并获得用户对隐私政策的明确同意(比如勾选协议弹窗),再触发权限申请
- 权限申请动作应绑定到用户主动操作之后,例如点击「开始录音」按钮、进入地图页、点击拍照图标
- 调用前务必先检查:
plus.android.hasPermission("android.permission.RECORD_AUDIO"),避免重复打扰 - 回调中
deniedAlways表示用户勾选了“不再提示”,此时必须调plus.android.gotoSettings()引导去系统设置页,不能只弹个提示就卡住
manifest.json 里还有哪些容易被忽略的致命字段
除了权限,这些字段不填或填错,会导致打包失败、无法更新、商店拒审:
-
id必须是反向域名格式(如com.example.myapp),改了就等于全新应用,旧用户无法覆盖安装 -
versionCode必须是整数且每次递增,应用商店只认这个判断是否为更新,写成字符串或不递增会拒更 -
versionName可带字母(如1.2.3-beta),但别用1.0这种模糊写法,后期问题定位困难 - Android 包体积暴增?检查
app-plus→modules是否勾选了不用的模块(如地图、推送、蓝牙),每个模块都可能增加几 MB - 需要自定义
AndroidManifest.xml(比如加<meta-data>或特殊权限),必须新建同名文件放项目根目录,且package属性必须和云端打包配置的包名一致
最常被绕过的其实是“声明和调用必须一一对应”这个铁律——manifest.json 里写的权限名,代码里 request 的字符串,微信小程序 requiredPrivateInfos 列的接口名,三者必须字节级一致。差一个点、一个下划线、一个大小写,就是黑盒失败。


















