uni-app android.permission.WRITE_EXTERNAL_STORAGE 获取的权限打包前和打包后获取的不一样

发布于 1周前 作者 itying888 来自 Uni-App

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,应用也无法直接访问外部存储的公共目录(如 DCIMDownload 等)。
  • 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.authorizeuni.getSetting 方法,可以用于权限申请和检查:
    uni.authorize({
      scope: 'scope.writeStorage',
      success() {
        console.log('权限申请成功');
      },
      fail() {
        console.log('权限申请失败');
      }
    });
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!