uni-app uni.chooseImage回调失败,chooseImage:fail targetSdkVersion设置>=29后在Android10+系统设备不支持当前路径 请更改为应用运行路径

uni-app uni.chooseImage回调失败,chooseImage:fail targetSdkVersion设置>=29后在Android10+系统设备不支持当前路径 请更改为应用运行路径

项目 信息
产品分类 uniapp/App
PC开发环境操作系统 Mac
PC开发环境操作系统版本号 macOS Big Sur 11.1
HBuilderX类型 正式
HBuilderX版本号 3.1.4
手机系统 Android
手机系统版本号 Android 10
手机厂商 小米
手机机型 小米9se
页面类型 vue
打包方式 云端
项目创建方式 HBuilderX

示例代码:

uni.chooseImage({
count: 1, // 默认9
sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
success: (res) => {
console.log(1111111, res);
},
fail: (res) => {
console.log('fail', res);
}
});
``
```

### 操作步骤:
用小米9se或者华为荣耀10等手机,通过手机浏览器下载图片,然后用uni.chooseimage选择该图片,没有success回调

### 预期结果:
uni.chooseimage能正常回调

### 实际结果:
uni.chooseimage能正常回调

### bug描述:
查看官方历史更新记录,## 2.8.11.20200907  
- Android平台 修复 设置targetversion为29时,从相册选择图片返回路径不正确的Bug [详情](https://ask.dcloud.net.cn/question/105269)  
官方说明已经修复该bug,但是现在用3.1.4还是会出现这样的问题。  
复现过程,用小米9se或者华为荣耀10等手机,通过手机浏览器下载图片,然后用uni.chooseimage选择该图片,没有success回调,fail回调出错信息chooseImage:fail targetSdkVersion设置>=29后在Android10+系统设备不支持当前路径。请更改为应用运行路径!具体请看:[https://ask.dcloud.net.cn/article/36199](https://ask.dcloud.net.cn/article/36199)  
查看了36199文档,没看明白,是用plus.gallery.pick替代uni.chooseimage?

更多关于uni-app uni.chooseImage回调失败,chooseImage:fail targetSdkVersion设置>=29后在Android10+系统设备不支持当前路径 请更改为应用运行路径的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

测试代码补充完整。包含具体文件路径等信息,这种问题一般都是路径不在可操作路径范围导致。 HX默认基座可以复现问题吗?

更多关于uni-app uni.chooseImage回调失败,chooseImage:fail targetSdkVersion设置>=29后在Android10+系统设备不支持当前路径 请更改为应用运行路径的实战教程也可以访问 https://www.itying.com/category-93-b0.html


应该就是路径问题,先用 plus.gallery.pick 代替uni.chooseimage了,plus.gallery.pick选了图片,然后用uni.compressImage压缩

这是一个因Android 10分区存储策略导致的兼容性问题。当targetSdkVersion≥29时,应用无法直接访问外部存储的公共路径。

解决方案:

  1. 在manifest.json中配置Android适配:
"android" : {
    "targetSdkVersion" : 29,
    "permissionExternalStorage" : {
        "request" : "once",
        "prompt" : "应用保存运行状态等信息需要读写手机存储"
    }
}
  1. 使用uni-app的临时文件路径处理:
uni.chooseImage({
    success: (res) => {
        // 将选择的文件复制到应用私有目录
        const tempFilePath = res.tempFilePaths[0];
        plus.io.resolveLocalFileSystemURL(tempFilePath, (entry) => {
            entry.copyTo(plus.io.PRIVATE_WWW, 'temp_image.jpg', () => {
                // 使用复制后的文件路径
            });
        });
    }
});
  1. 或者使用plus.gallery.pick替代(需处理5+ API兼容性):
plus.gallery.pick((path) => {
    // 处理选择的文件路径
}, (e) => {
    console.error(e);
});
回到顶部