uni-app android.permission.WRITE_EXTERNAL_STORAGE 获取的权限打包前和打包后获取的不一样
uni-app android.permission.WRITE_EXTERNAL_STORAGE 获取的权限打包前和打包后获取的不一样
类别 | 信息 |
---|---|
产品分类 | uniapp/App |
PC开发环境 | Windows |
PC版本号 | win10 |
HBuilderX类型 | 正式 |
HBuilderX版本 | 3.99 |
手机系统 | Android |
手机版本号 | Android 14 |
手机厂商 | 小米 |
手机机型 | 红米k60 |
页面类型 | vue |
vue版本 | vue2 |
打包方式 | 云端 |
项目创建方式 | HBuilderX |
示例代码:
plus.android.requestPermissions(['android.permission.WRITE_EXTERNAL_STORAGE'],
(e) => {
if (e.deniedAlways.length > 0) {
// 弹出提示框解释为何需要权限,引导用户打开设置页面开启
uni.showModal({
title: '提示',
content: '请打开手机存储功能(点击确定后在权限中授权手机存储功能)',
success(res) {
if (res.confirm) {
var Intent = plus.android.importClass("android.content.Intent");
var Settings = plus.android.importClass("android.provider.Settings");
var Uri = plus.android.importClass("android.net.Uri");
var mainActivity = plus.android.runtimeMainActivity();
var intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
var uri = Uri.fromParts("package", mainActivity.getPackageName(),
null);
intent.setData(uri);
mainActivity.startActivity(intent);
}
}
});
} else if (e.deniedPresent.length > 0) { //权限被临时拒绝
// 弹出提示框解释为何需要权限,可再次调用plus.android.requestPermissions申请权限
uni.showModal({
title: '提示',
content: '请打开手机存储功能(点击确定后在权限中授权手机存储功能)',
success(res) {
if (res.confirm) {
var Intent = plus.android.importClass("android.content.Intent");
var Settings = plus.android.importClass("android.provider.Settings");
var Uri = plus.android.importClass("android.net.Uri");
var mainActivity = plus.android.runtimeMainActivity();
var intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
var uri = Uri.fromParts("package", mainActivity.getPackageName(),
null);
intent.setData(uri);
mainActivity.startActivity(intent);
}
}
});
} else {
}
})
操作步骤:
调用上面方法
预期结果:
打包前和打包后获取的权限应该一样
实际结果:
打包后少了一个获取文件的权限
bug描述:
【报Bug】android.permission.WRITE_EXTERNAL_STORAGE 获取的权限打包前和打包后获取的不一样
打包前
打包后
1 回复
在使用 uni-app 开发应用时,涉及到 Android 权限 android.permission.WRITE_EXTERNAL_STORAGE
时,可能会遇到打包前和打包后获取的权限不一致的问题。这通常与以下几个方面有关:
1. Android 版本差异
- Android 10 (API 29) 及以上版本:Google 引入了 Scoped Storage(分区存储)机制,限制了应用对外部存储的直接访问。即使你声明了
WRITE_EXTERNAL_STORAGE
,应用也无法直接访问外部存储的公共目录(如DCIM
、Download
等)。 - Android 11 (API 30) 及以上版本:进一步限制了分区存储,即使声明了
WRITE_EXTERNAL_STORAGE
,也无法访问外部存储的公共目录。
如果你的应用运行在 Android 10 及以上版本,可能会导致打包前(调试模式)和打包后(正式包)的权限行为不一致。
解决方法:
- 如果你的应用需要访问外部存储,可以在
manifest.json
中配置requestLegacyExternalStorage
属性(仅适用于 Android 10):{ "android": { "requestLegacyExternalStorage": true } }
- 对于 Android 11 及以上版本,需要使用
MANAGE_EXTERNAL_STORAGE
权限,并遵循 Google 的分区存储规范。
2. 打包配置问题
- 在 uni-app 中,调试模式和正式包的权限行为可能不同,尤其是在 Android 10 及以上版本。
- 调试模式下,应用可能默认具有更高的权限,而正式包则会严格遵循 Android 的权限机制。
解决方法:
- 确保在
manifest.json
中正确声明所需的权限:{ "permissions": [ "android.permission.WRITE_EXTERNAL_STORAGE" ] }
- 检查打包配置,确保正式包的权限配置与调试模式一致。
3. 动态权限申请
- 从 Android 6.0 (API 23) 开始,部分权限需要动态申请,包括
WRITE_EXTERNAL_STORAGE
。 - 如果你的应用没有动态申请权限,可能会导致打包后无法获取权限。
解决方法:
- 在需要时动态申请权限。uni-app 提供了
uni.authorize
和uni.getSetting
方法,可以用于权限申请和检查:uni.authorize({ scope: 'scope.writeStorage', success() { console.log('权限申请成功'); }, fail() { console.log('权限申请失败'); } });