HarmonyOS鸿蒙Next中使用Camera Kit开发拍照页面,正常预览状态进入后台后,再回到应用,页面不展示预览页面

发布于 1周前 作者 wuwangju 来自 鸿蒙OS

HarmonyOS鸿蒙Next中使用Camera Kit开发拍照页面,正常预览状态进入后台后,再回到应用,页面不展示预览页面 使用 Camera Kit 开发拍照页面, 正常预览状态切到应用后台后, 再回到应用, 页面不展示预览页面, 麻烦看下怎么解决.

相关问题 已查询文档, 未找到解决方案, 尝试调用sesson.star方法, 无效

3 回复

请参考DEMO
核心思路:在onpageShow中再次调用相机

// 获取前置摄像头预览图像

const permissions: Array<Permissions> = ['ohos.permission.CAMERA'];

function reqPermissionsFromUser(permissions: Array<Permissions>, context: common.UIAbilityContext): void {
  let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
  // requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗
  atManager.requestPermissionsFromUser(context, permissions).then((data) => {
    let grantStatus: Array<number> = data.authResults;
    let length: number = grantStatus.length;
    for (let i = 0; i < length; i++) {
      if (grantStatus[i] === 0) {
        // 用户授权,可以继续访问目标操作
        GetFrontCameraImage.ins?.getCameraImage();
      } else {
        // 用户拒绝授权,提示用户必须授权才能访问当前页面的功能,并引导用户到系统设置中打开相应的权限
        return;
      }
    }
    // 授权成功
  }).catch((err: BusinessError) => {
    console.error(`Failed to request permissions from user. Code is ${err.code}, message is ${err.message}`);
  })
}

const context = getContext(this) as common.UIAbilityContext;

@Entry
@Component
struct GetFrontCameraImage {
  static ins:GetFrontCameraImage|null=null;
  ishide:boolean = false;

  aboutToAppear() {
    GetFrontCameraImage.ins = this;
    // 获取摄像头权限
    const context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
    reqPermissionsFromUser(permissions, context);
  }

  private xComponentController: XComponentController = new XComponentController();

  async getCameraImage() {
    // 1、使用系统相机框架camera模块获取物理摄像头信息。
    let cameraManager = camera.getCameraManager(context); // 获取相机管理器实例
    let camerasInfo: Array<camera.CameraDevice> = cameraManager.getSupportedCameras(); //获取可用的相机列表
    let cameraDevice: camera.CameraDevice = camerasInfo[0]; //

    //检测相机状态
    cameraManager.on('cameraStatus', (err: BusinessError, cameraStatusInfo: camera.CameraStatusInfo) => {
      console.log(`camera : ${cameraStatusInfo.camera.cameraId}`);
      console.log(`status : : ${cameraStatusInfo.status}`); //相机设备状态回调,通过注册回调函数获取相机的状态变化。
    });

    // 2、创建并启动物理摄像头输入流通道
    // 设置为前置摄像头 camera.CameraPosition.CAMERA_POSITION_FRONT
    let cameraInput = cameraManager.createCameraInput(camera.CameraPosition.CAMERA_POSITION_FRONT, camera.CameraType.CAMERA_TYPE_DEFAULT);
    await cameraInput.open();

    // 3、拿到物理摄像头信息查询摄像头支持预览流支持的输出格式,结合XComponent提供的surfaceId创建预览输出通道
    let outputCapability = cameraManager.getSupportedOutputCapability(cameraDevice, camera.SceneMode.NORMAL_PHOTO);
    let previewProfile = outputCapability.previewProfiles[0];
    let surfaceId = this.xComponentController.getXComponentSurfaceId();
    let previewOutput = cameraManager.createPreviewOutput(previewProfile, surfaceId);

    // 4、创建相机会话,在会话中添加摄像头输入流和预览输出流,然后启动会话,预览画面就会在XComponent组件上送显。
    let captureSession = cameraManager.createSession(camera.SceneMode.NORMAL_PHOTO);
    captureSession.beginConfig();
    captureSession.addInput(cameraInput);
    captureSession.addOutput(previewOutput);
    captureSession.commitConfig()
    captureSession.start();
  }

  build() {
    Row() {
      Column({ space: 20 }) {
        //设置一个组件进行 媒体数据写入
        XComponent({ id: 'xComponentId1', type: 'surface', controller: this.xComponentController })
          .height(600)
      }
    .height('100%')
    }
  }

  onPageShow(): void {
    hilog.info(0x0000,"test","onPageShow")
    if(this.ishide){
      this.getCameraImage();
      this.ishide=false;
    }
  }

  onPageHide(): void {
    hilog.info(0x0000,"test","onPageHide")
    this.ishide = true;
  }
}

更多关于HarmonyOS鸿蒙Next中使用Camera Kit开发拍照页面,正常预览状态进入后台后,再回到应用,页面不展示预览页面的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中使用Camera Kit开发拍照页面时,如果应用从后台返回后预览页面不展示,可能是由于以下原因:

  1. 生命周期管理问题:应用进入后台时,Camera Kit的资源可能被释放或暂停。回到前台时,未正确恢复Camera Kit的预览状态。

  2. 权限问题:应用从后台返回时,相机权限可能被系统回收或未重新申请,导致预览无法正常启动。

  3. SurfaceView或TextureView状态:用于显示预览的SurfaceView或TextureView在应用进入后台后可能被销毁或重置,未在回到前台时重新绑定Camera Kit。

  4. Camera Kit实例未恢复:应用进入后台后,Camera Kit实例可能被销毁,回到前台时未重新初始化或恢复实例。

  5. 系统资源限制:系统可能在后台回收部分资源,导致Camera Kit无法正常恢复预览。

解决方法:确保在应用回到前台时,重新初始化Camera Kit并绑定预览视图,检查相机权限,并正确处理生命周期回调以恢复预览状态。

在HarmonyOS鸿蒙Next中,使用Camera Kit开发拍照页面时,若从后台返回后预览页面不展示,可能是因为相机资源在应用进入后台时被释放,导致重新进入时未正确初始化。建议在onForeground生命周期中重新初始化相机资源,并调用startPreview方法恢复预览。同时,确保在onBackground生命周期中正确释放资源,避免内存泄漏。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!