uni-app plus 5+ api 中的 plus.zip.compressImage 在部分安卓10设备下报code -5

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

uni-app plus 5+ api 中的 plus.zip.compressImage 在部分安卓10设备下报code -5

项目创建方式 CLI
CLI版本号 2.0.2-3090820231124001

产品分类:
uniapp/App

PC开发环境操作系统:
Windows

PC开发环境操作系统版本号:
win10

手机系统:
Android

手机系统版本号:
Android 10

手机厂商:
华为,小米,oppo,等都发现存在

手机机型:
荣耀Play5,小米8,华为P30 Pro,OPPO R17,华为畅享10 plus,华为P30

页面类型:
vue

vue版本:
vue2

打包方式:
云端

bug描述:
项目打包采用的是当时最新版本的uniapp正式版版本,2.0.2-3090820231124001 ,这个问题目前能确定在部分安卓10内存在,但高版本的安卓11,安卓12,安卓13,安卓14,暂时未发现有相关设备存在这个问题。
当src对应的图片是从相册中选择时,安卓10会报错code -5

代码段如下:

/**
 * APP-PLUS 压缩图片  
 */
export const compressAppImage = (src, quality) => {  
  // let index = src.lastIndexOf(".");  
  let index = src.lastIndexOf("/");  
  let imgDirname = src.substring(0, index); //图片的原始地址  
  let imgName =  
    "image_" + new Date().getTime() + "_" + randomstring.generate(10); //压缩后的文件  
  let extIndex = src.lastIndexOf(".");  
  let imgType = src.substring(extIndex + 1, src.length); //图片的类型  

  // iOS 拍照,直接旋转  
  // 转换 heic 格式  
  if (imgType.toLowerCase() === "heic") {  
    imgType = "jpg";  
  }  

  return new Promise((resolve, reject) => {  
    plus.zip.compressImage(  
      {  
        src,  
        dst: imgDirname + "/" + imgName + "." + imgType,  
        quality,  
      },  
      (res) => {  
        resolve(res.target);  
      },  
      (err) => {  
        reject(err);  
      }  
    );  
  });  
};

示例代码:
上述代码返回了code-5,msg为输出图片失败。

操作步骤:
可使用华为或其他平台的云测设备,对这个函数的bug进行复现。

预期结果:
应正常将图片进行压缩处理

实际结果:
安卓10内返回code -5


3 回复

src参数是调用后,从 selectedResult.tempFilePaths 内遍历获取的 let [err, selectedResult] = await uni.chooseImage({
sourceType: [“camera”, “album”], // 拍照、相册
sizeType: [“original”], // 原图
count: allowLength,
}); 重点是从相册选择图片,直接拍照在安卓10下似乎是可以的。


压缩的quality是100或98

plus.zip.compressImage 是 uni-app 5+ API 中用于压缩图片的方法。在部分 Android 10 设备上,你可能会遇到 code -5 的错误。这个错误通常与文件权限或路径问题有关。

可能的原因和解决方案:

  1. 权限问题

    • Android 10 引入了 Scoped Storage,对文件系统的访问权限进行了更严格的控制。确保你的应用已经获取了必要的存储权限。
    • 你可以在 manifest.json 中配置以下权限:
      "permissions": {
          "android": [
              "<uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>",
              "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>"
          ]
      }
    • 在运行时,你需要动态请求这些权限:
      plus.android.requestPermissions(['android.permission.READ_EXTERNAL_STORAGE', 'android.permission.WRITE_EXTERNAL_STORAGE'], function(result) {
          console.log('权限请求结果:', result);
      }, function(error) {
          console.error('权限请求失败:', error);
      });
  2. 路径问题

    • 确保你传递给 compressImage 的路径是正确的,并且应用有权限访问该路径。
    • 你可以使用 plus.io API 来获取正确的文件路径:
      plus.io.resolveLocalFileSystemURL(filePath, function(entry) {
          var fullPath = entry.toLocalURL(); // 获取完整的文件路径
          plus.zip.compressImage({
              src: fullPath,
              dst: dstPath,
              quality: 80,
              success: function(res) {
                  console.log('压缩成功:', res);
              },
              fail: function(error) {
                  console.error('压缩失败:', error);
              }
          });
      }, function(error) {
          console.error('文件路径解析失败:', error);
      });
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!