HarmonyOS 鸿蒙Next:调用PixelMap进行图片保存到本地出现系统闪退
HarmonyOS 鸿蒙Next:调用PixelMap进行图片保存到本地出现系统闪退
【关键字】
PixelMap / 图片 / 保存 / 闪退
【问题描述】
获取相册图片进行裁剪,完成之后,对图片调用PixelMap进行保存到本地,出现系统闪退。
关键代码如下:
export async function savePixelMapV2(context: Context, pixelMap: PixelMap): Promise<string> {
if (pixelMap === null) {
console.error('传入的pm为空')
return '';
}
const imagePackerApi: image.ImagePacker = image.createImagePacker();
const path: string = context.cacheDir + '/' + getTimeStr() + '.jpg';
const packOpts: image.PackingOption = { format: 'image/jpeg', quality: 100 };
let file = fs.openSync(path, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE);
return await imagePackerApi.packToFile(pixelMap, file.fd, packOpts).then(() => {
//直接打包进文件
fs.closeSync(file.fd);
return " "
}).catch((error: Error) => {
console.error('Failed to pack the image. And the error is: ' + error);
return " "
})
}
.then(() => {
if (this.pixelMap) {
console.debug("savePixelMapV2...")
savePixelMapV2(getContext(this), this.pixelMap)
}
this.flushPixelMapNew();
});
单独的click回调正常执行不会有任何问题。但是在then里面调用savePixelMapV2方法必现崩溃。
【解决方案】
export async function savePixelMapV2(context: Context, pixelMap: PixelMap,width: number, height: number):Promise<string> {
if (pixelMap === null) {
console.error('传入的pm为空')
return '';
}
const imagePackerApi: image.ImagePacker = image.createImagePacker();
const path: string = context.cacheDir + '/' + getTimeStr() + '.jpg';
const packOpts: image.PackingOption = { format: 'image/jpeg', quality: 100 };
let file = fs.openSync(path, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE);
console.log('path:'+path+"--file:"+file.fd)
//该三个参数测试固定为16:9,建议封装调用
const cropWidth = width;
const cropHeight = Math.floor(width * (CommonConstants.CROP_RATE_9_16));
const cropPosition = new RegionItem(0, Math.floor((height - cropHeight) / CommonConstants.AVERAGE_WEIGHT_WIDTH));
//裁切后打包
return pixelMap.crop({
size: {
width: cropWidth,
height: cropHeight
},
x: cropPosition.x,
y: cropPosition.y
}).then(() => {
console.info('Sucessed in cropping pixelmap.');
imagePackerApi.packToFile(pixelMap, file.fd, packOpts)
.then(() => {
console.info('Succeeded in packToFile.');
//直接打包进文件
fs.closeSync(file.fd);
console.debug("path_:" + path)
return ''
}).catch((error : BusinessError) => {
console.error('Failed to packToFile.');
return ''
})
return '';
}).catch((err : BusinessError) => {
console.error('Failed to crop pixelmap.');
return '';
});
}
16:9 方法调用修改部分如下:
case CropType.RECTANGLE:
if (this.pixelMap) {
// rectangle(this.pixelMap, imageWidth, imageHeight)
// .then(() => {
// if (this.pixelMap) {
// console.debug("savePixelMapV2...")
// savePixelMapV2(getContext(this), this.pixelMap)
// }
// this.flushPixelMapNew();
// });
savePixelMapV2(getContext(this),this.pixelMap,imageWidth,imageHeight).then(() => {
this.flushPixelMapNew();
})
break;
更多关于HarmonyOS 鸿蒙Next:调用PixelMap进行图片保存到本地出现系统闪退的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
1 回复
更多关于HarmonyOS 鸿蒙Next:调用PixelMap进行图片保存到本地出现系统闪退的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
针对HarmonyOS鸿蒙Next系统中调用PixelMap进行图片保存到本地时出现系统闪退的问题,可能的原因及解决方案如下:
-
权限问题:
- 确保应用已正确申请并获得了存储权限。在鸿蒙系统中,需要在
config.json
文件中声明存储权限,并在运行时请求用户授权。
- 确保应用已正确申请并获得了存储权限。在鸿蒙系统中,需要在
-
PixelMap处理不当:
- 检查PixelMap对象在使用前是否已正确初始化,且在使用完毕后是否已释放资源,避免内存泄漏或资源冲突。
-
文件路径或文件名问题:
- 确认保存图片时指定的文件路径是否有效,文件名是否符合系统规范,避免路径不存在或文件名非法导致操作失败。
-
系统API使用错误:
- 核实调用保存图片的系统API时参数是否传递正确,包括PixelMap对象、文件路径、文件格式等。
-
系统兼容性问题:
- 检查当前鸿蒙系统版本是否与你的应用兼容,有时系统更新可能引入新的API变更或已知问题。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html,