uni-app 安卓10+ 文件管理权限已授权无法访问

uni-app 安卓10+ 文件管理权限已授权无法访问

操作步骤:

预期结果:

实际结果:

bug描述:

已获取所有文件的管理权限并且已经打开,但动态获取权限时显示“永久拒绝的权限”
其次minSdkVersion设置的28 还报错“targetSdkVersion设置>=29后在Android10+系统设备不支持当前路径。请更改为应用运行路径!具体请看:https://ask.dcloud.net.cn/article/36199”

相关链接:

信息
产品分类 HTML5+
HBuilderX版本号 3.2.12
手机系统 Android
手机系统版本号 Android 11
手机厂商 vivo
手机机型 iQOO Z1
打包方式 离线

Image 1 Image 2 Image 3 Image 4


更多关于uni-app 安卓10+ 文件管理权限已授权无法访问的实战教程也可以访问 https://www.itying.com/category-93-b0.html

21 回复

这是逻辑层限制了 只要android11都不可以访问非公共区域路径

更多关于uni-app 安卓10+ 文件管理权限已授权无法访问的实战教程也可以访问 https://www.itying.com/category-93-b0.html


原生开启这个权限是可以读取到文件的,请问是否为uniapp框架限制???

回复 1***@qq.com: 是的 逻辑层限制了

回复 DCloud_Android_ST: 请问怎么解决这个问题,公司业务需要这个权限访问

回复 1***@qq.com: 这个问题我们会记录 暂时不会解除 后续会优化该逻辑。 目前看没有解决方案

回复 DCloud_Android_ST: 请问是否已经有解决方案了

回复 1***@qq.com: 你这么实现的逻辑 我看怎么处理下

回复 DCloud_Android_ST: 请问是否y有其他处理方式?

回复 1***@qq.com: 如果你的需求是操作所有文件,那就只能是我们后续会添加对所有文件权限的判定。有权限的条件下放开限制正常执行IO操作。 其他处理方式!就是把文件都放在沙盒目录下。 但不确定你的需求是否符合

回复 DCloud_Android_ST: 我本地打包生成安卓源文件给到原生安卓开发他们,请问uniapp是否还能限制访问所有文件读取的权限?

回复 1***@qq.com: 我们只限制了uni的API 如果你纯原生开发不会限制

回复 1***@qq.com: 你反馈的问题 我们已经在处理了 只是需要等待一段时间。 修改的方式就是IO操作时会检验所有文件操作权限。如果开通则会继续执行

回复 1***@qq.com: 不能确定。可能一到两周在alpha版本体现

回复 DCloud_Android_ST: 请问今天更新的 3.4.1.20220308-alpha 解决了这个问题吗

回复 1***@qq.com: 没

回复 DCloud_Android_ST:请问 3.4.2.20220310-alpha 解决了这个问题吗

回复 1***@qq.com: 不会那么快。下个alpha会带上。。。

回复 DCloud_Android_ST: 请问3.4.3.20220325-alpha是否已解决问题?

回复 1***@qq.com: 是 你可以使用默认基座验证下

回复 DCloud_Android_ST: 不是我说你们这技术水平实在太差了,今年买了个iqoo10,什么鬼原子隐私系统,qq浏览器移动进隐私系统,申请视频小窗权限,应用列表里面居然找不到qq浏览器,你们就没发现自己设计这玩意儿是个bug吗,还有这个文件管理功能,随便重命名一下qq浏览器文件夹,文件管理器看不到了,qq浏览器也看不到了,只有用adb shell 能看到,这是什么鬼啊,你们是一群大专在写代码吗

这是Android 10(API 29)及以上版本引入的存储权限策略(Scoped Storage)导致的兼容性问题。你需要同时处理两个关键点:

  1. targetSdkVersion必须设置为29或更高(建议29),并在manifest.json中配置Android权限:
"android": {
  "permissions": [
    "<uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>",
    "<uses-permission android:name=\"android.permission.MANAGE_EXTERNAL_STORAGE\"/>"
  ],
  "targetSdkVersion": 29
}
  1. 文件路径必须使用应用私有目录,不能直接使用/storage/emulated/0/等绝对路径。正确写法:
// 获取应用私有目录
const fs = uni.getFileSystemManager()
const filePath = `${uni.env.USER_DATA_PATH}/yourfile.txt`

// 或使用plus.io转换路径
plus.io.requestFileSystem(plus.io.PRIVATE_DOC, function(fs) {
  const rootPath = fs.root.fullPath
})
  1. 如果确实需要访问公共目录,必须使用系统文件选择器(uni.chooseFile)或申请MANAGE_EXTERNAL_STORAGE特殊权限(上架Google Play可能被拒)。

  2. 权限请求代码示例:

uni.authorize({
  scope: 'scope.writePhotosAlbum',
  success() {
    // 授权成功
  },
  fail(err) {
    // 引导用户手动开启
    uni.showModal({
      content: '需要文件权限',
      success(res) {
        if (res.confirm) {
          uni.openAppAuthorizeSetting()
        }
      }
    })
  }
})
回到顶部