uni-app plus 5+ api 中的 plus.zip.compressImage 在部分安卓10设备下报code -5
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 回复
压缩的quality是100或98
plus.zip.compressImage
是 uni-app 5+ API 中用于压缩图片的方法。在部分 Android 10 设备上,你可能会遇到 code -5
的错误。这个错误通常与文件权限或路径问题有关。
可能的原因和解决方案:
-
权限问题:
- 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); });
-
路径问题:
- 确保你传递给
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); });
- 确保你传递给