HarmonyOS 鸿蒙Next 调用PhotoOutput.capture,没有进photoAvailable回调
HarmonyOS 鸿蒙Next 调用PhotoOutput.capture,没有进photoAvailable回调
调用PhotoOutput.capture,没有进photoAvailable回调,这个问题有人遇到过吗?
在回调中调用this.stopPreview(),试下呢
/**
- 使用当前拍照设置进行拍照
*/
async takePhoto(imgRotation: camera.ImageRotation = camera.ImageRotation.ROTATION_0) {
TUtil.logI(TCameraService.TAG, `开始拍照`);
let photoCaptureSetting: camera.PhotoCaptureSetting = {
quality: camera.QualityLevel.QUALITY_LEVEL_HIGH, // 设置图片质量高
rotation: imgRotation // 设置图片旋转角度0
// location: { // 位置信息,经纬度
// latitude: 12.9698,
// longitude: 77.7500,
// altitude: 1000
// },
// mirror: false //镜像
}
this.mPhotoOutput?.capture(photoCaptureSetting, (err: BusinessError) => {
if (err) {
TUtil.logE(TCameraService.TAG, `拍照异常:${JSON.stringify(err)}`);
return;
}
TUtil.logI(TCameraService.TAG, `拍照成功`);
});
}
/**
* 获取照片的回调
* 设置回调之后,调用PhotoOutput的capture方法,就会将拍照的buffer回传到回调中
*/
private setTakePhotoCallBack(): void {
TUtil.logI(TCameraService.TAG, `设置拍照回调`);
this.mPhotoOutput?.on('photoAvailable', (errCode: BusinessError, photo: camera.Photo): void => {
TUtil.logI(TCameraService.TAG, `设置拍照回调 取得照片大小`);
if (errCode || photo === undefined) {
TUtil.logI(TCameraService.TAG, `照片回调失败,err: ${JSON.stringify(errCode)}`);
return;
}
let imageObj = photo.main;
imageObj.getComponent(image.ComponentType.JPEG, async (errCode: BusinessError, component: image.Component): Promise<void> => {
if (errCode || component === undefined) {
TUtil.logI(TCameraService.TAG, `获取照片数据失败,err: ${JSON.stringify(errCode)}`);
return;
}
let buffer: ArrayBuffer;
if (component.byteBuffer) {
buffer = component.byteBuffer;
} else {
TUtil.logI(TCameraService.TAG, `照片数据为空`);
return;
}
TUtil.logI(TCameraService.TAG, `取得照片大小:` + buffer.byteLength);
this.mCameraCallBack?.onPhotoReady(buffer, imageObj);
// buffer处理结束后需要释放该资源,如果未正确释放资源会导致后续拍照获取不到buffer
imageObj.release();
await this.stopPreview();
});
});
}
加个定时器延迟调用下this.stopPreview();试试呢
/**
* 使用当前拍照设置进行拍照
*/
async takePhoto(imgRotation: camera.ImageRotation = camera.ImageRotation.ROTATION_0) {
TUtil.logI(TCameraService.TAG, `开始拍照`);
let photoCaptureSetting: camera.PhotoCaptureSetting = {
quality: camera.QualityLevel.QUALITY_LEVEL_HIGH, // 设置图片质量高
rotation: imgRotation // 设置图片旋转角度0
// location: { // 位置信息,经纬度
// latitude: 12.9698,
// longitude: 77.7500,
// altitude: 1000
// },
// mirror: false //镜像
}
await this.mPhotoOutput?.capture(photoCaptureSetting).then(() =>{
TUtil.logI(TCameraService.TAG, `拍照成功`);
// await this.stopPreview();
}).catch((error: BusinessError) => {
console.error(`Failed to photo output capture, error code: ${error.code}.`);
});
// await this.stopPreview();
setTimeout( () =>{
this.stopPreview();
},100)
}
更多关于HarmonyOS 鸿蒙Next 调用PhotoOutput.capture,没有进photoAvailable回调的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next系统中,调用PhotoOutput.capture
方法后,若photoAvailable
回调未被触发,通常是因为以下几个原因:
-
权限问题:确保应用已正确获取相机和存储权限。权限缺失会导致捕获操作失败,从而无法触发回调。
-
捕获配置:检查
PhotoOutput
的配置是否正确,包括分辨率、格式等参数,确保与相机硬件兼容。 -
回调设置:确认
photoAvailable
回调已正确设置给PhotoOutput
实例,且回调方法未被其他逻辑覆盖或阻止执行。 -
资源竞争:如果系统中存在其他相机使用请求,可能导致当前捕获操作被挂起或取消,从而不触发回调。
-
系统日志:查看系统日志,特别是相机服务相关的日志,以获取更多错误信息或异常提示。
-
API版本兼容性:确保使用的API版本与HarmonyOS鸿蒙Next系统兼容,避免因版本差异导致的问题。
如果以上检查均无异常,但问题依旧存在,可能是系统层面的bug或特定设备的问题。此时,建议直接联系官网客服进行进一步排查和处理。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html