uni-app Android11下选择公用图片仍然提示不支持

uni-app Android11下选择公用图片仍然提示不支持

开发环境 版本号 项目创建方式
Windows WIN10 HBuilderX

产品分类:uniapp/App

PC开发环境操作系统:Windows

手机系统:Android
手机系统版本号:Android 11
手机厂商:小米
手机机型:Redmi Note 9 Pro

页面类型:vue

打包方式:云端

操作步骤:

plus.gallery.pick() uni.getFileInfo();


预期结果:

正常获取文件信息

实际结果:

提示code 15报错


bug描述:

在Android11下,使用plus.gallery.pick()API选取公用图片并传入uni.getFileInfo()时,会报错提示

“targetSdkVersion设置>=29后在Android10+系统设备不支持当前路径。请更改为应用运行路径!”

但pick()所获取的路径确认为公用目录(Pictures)。

获取的路径为:

> file:///storage/emulated/0/Pictures/Weixin/mmexport1622726586687.jpg

尝试过将该图片移动到Pictures根目录中亦无果,值得注意的是同样的图片传入uni.getImageInfo是正常的。

这个BUG因为近期厂商大规模升级到Android11,已经非常多用户反馈,这直接导致图片、文件上传功能无法工作,非常严重影响到用户使用,希望尽快修复或提供临时方案。

更多关于uni-app Android11下选择公用图片仍然提示不支持的实战教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

问题已确认 临时方案 先把file://去掉

更多关于uni-app Android11下选择公用图片仍然提示不支持的实战教程也可以访问 https://www.itying.com/category-93-b0.html


/storage/emulated/0/Pictures/mmexport1622726586687.jpg 也还是一样的报错

我这边用HX3.1.16的默认基座测试 是通的 我们这边已经在处理 预计下个版本修复

回复 DCloud_Android_ST: 我也是3.1.16,我简化成只有这两个调用,并且新开了一个项目用默认基座尝试也还是一样,文件权限也授权了

plus.gallery.pick( async (data) => { let [err, fileInfo] = await uni.getFileInfo({ filePath: data.replace(/file:///g,’’) }); console.log(err, fileInfo,data.replace(/file:///g,’’)); }, err => { console.log(err); } );

这么严重的BUG修的这么慢…真的绝了…幸好上线时间没那么急,这个速度谁敢用在商业项目上?

HX 3.1.19.20210613-alpha 已修复

这是Android 11文件权限策略变更导致的兼容性问题。从Android 11开始,应用对共享存储空间的访问受到更严格的限制,即使获取到文件路径,也可能无法直接读取。

临时解决方案:

  1. 使用uni.chooseImage替代plus.gallery.pick:
uni.chooseImage({
  count: 1,
  success: (res) => {
    const tempFilePaths = res.tempFilePaths;
    uni.getFileInfo({
      filePath: tempFilePaths[0],
      success: (info) => {
        console.log(info);
      }
    });
  }
});
  1. 如果必须使用plus.gallery.pick,需要先将文件复制到应用沙箱目录:
plus.gallery.pick((file) => {
  plus.io.resolveLocalFileSystemURL(file, (entry) => {
    entry.copyTo(plus.io.PRIVATE_WWW, 'temp.jpg', (newEntry) => {
      uni.getFileInfo({
        filePath: newEntry.toLocalURL(),
        success: (info) => {
          console.log(info);
        }
      });
    });
  });
});
  1. 在manifest.json中配置Android权限:
{
  "app-plus": {
    "distribute": {
      "android": {
        "permissions": [
          "<uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>",
          "<uses-permission android:name=\"android.permission.MANAGE_EXTERNAL_STORAGE\"/>"
        ]
      }
    }
  }
}
回到顶部