HarmonyOS 鸿蒙Next 调用PhotoOutput.capture,没有进photoAvailable回调

发布于 1周前 作者 ionicwang 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 调用PhotoOutput.capture,没有进photoAvailable回调

调用PhotoOutput.capture,没有进photoAvailable回调,这个问题有人遇到过吗?

2 回复

在回调中调用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回调未被触发,通常是因为以下几个原因:

  1. 权限问题:确保应用已正确获取相机和存储权限。权限缺失会导致捕获操作失败,从而无法触发回调。

  2. 捕获配置:检查PhotoOutput的配置是否正确,包括分辨率、格式等参数,确保与相机硬件兼容。

  3. 回调设置:确认photoAvailable回调已正确设置给PhotoOutput实例,且回调方法未被其他逻辑覆盖或阻止执行。

  4. 资源竞争:如果系统中存在其他相机使用请求,可能导致当前捕获操作被挂起或取消,从而不触发回调。

  5. 系统日志:查看系统日志,特别是相机服务相关的日志,以获取更多错误信息或异常提示。

  6. API版本兼容性:确保使用的API版本与HarmonyOS鸿蒙Next系统兼容,避免因版本差异导致的问题。

如果以上检查均无异常,但问题依旧存在,可能是系统层面的bug或特定设备的问题。此时,建议直接联系官网客服进行进一步排查和处理。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部