OpenHarmony Camera开发指导(二):相机设备管理(ArkTS)

在开发一个相机应用前,需要先通过调用Camera接口获取支持的相机设备列表,然后创建相机设备对象做后续处理。

开发步骤

1、导入camera接口,接口中提供了相机相关的属性和方法,导入方法如下。

typescript 复制代码
import { camera } from '@kit.CameraKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { common } from '@kit.AbilityKit';

2、通过getCameraManager方法,获取相机管理器实例对象。

typescript 复制代码
function getCameraManager(context: common.BaseContext): camera.CameraManager | undefined {
  let cameraManager: camera.CameraManager | undefined = undefined;
  try {
    cameraManager = camera.getCameraManager(context);
  } catch (error) {
    let err = error as BusinessError;
    console.error(`The getCameraManager call failed. error code: ${err.code}`);
  }
  return cameraManager;
}

3、通过CameraManager类中的getSupportedCameras方法,可获取当前设备支持的相机列表,列表中存储了所有的相机设备信息,包括相机ID、位置、类型等。若列表不为空,列表中每个相机ID都支持独立创建相机对象;否则,说明当前设备无可用相机,不可继续后续操作。

typescript 复制代码
function getCameraDevices(cameraManager: camera.CameraManager): Array<camera.CameraDevice> {
  let cameraArray: Array<camera.CameraDevice> = cameraManager.getSupportedCameras();
  if (cameraArray != undefined && cameraArray.length > 0) {
    for (let index = 0; index < cameraArray.length; index++) {
      console.info('cameraId : ' + cameraArray[index].cameraId);  // 获取相机ID
      console.info('cameraPosition : ' + cameraArray[index].cameraPosition);  // 获取相机位置,如前置或后置相机
      console.info('cameraType : ' + cameraArray[index].cameraType);  // 获取相机类型,如广角或景深相机
      console.info('connectionType : ' + cameraArray[index].connectionType);  // 获取相机连接类型,如内置、USB连接或远程(分布式)连接相机
      console.info('cameraOrientation: ' + cameraArray[index].cameraOrientation); // 获取镜头的安装角度,不会随着屏幕旋转而改变,取值范围为0°-360°,API 12新增
    }
    return cameraArray;
  } else {
    console.error("cameraManager.getSupportedCameras error");
    return [];
  }
}

相机状态变化监听

在相机应用开发过程中,通过注册回调函数可以随时监听相机状态变化,包括新相机的出现、相机的移除、相机的可用状态。在回调函数中,通过相机ID、相机状态这两个参数进行监听,如当有新相机出现时,可以将新相机加入到应用的相机列表中通知用户。

通过注册cameraStatus事件,callback返回CameraStatusInfo参数,包括相机的信息CameraDevice和状态CameraStatus

typescript 复制代码
function onCameraStatusChange(err: BusinessError, cameraStatusInfo:camera.CameraStatusInfo): void { 
    if (err !== undefined && err.code !== 0) {
      console.error(`Callback Error, errorCode: ${err.code}`);
      return;
    }
    // 当插入USB相机设备时,回调函数会返回新的相机出现状态
    if (cameraStatusInfo.status == camera.CameraStatus.CAMERA_STATUS_APPEAR) {
      console.info(`New Camera device appear.`);
    }
    // 当拔出USB相机设备时,回调函数会返回相机被移除状态
    if (cameraStatusInfo.status == camera.CameraStatus.CAMERA_STATUS_DISAPPEAR) {
      console.info(`Camera device has been removed.`);
    }
    // 相机被打开时,回调函数会返回相机可用状态
    if (cameraStatusInfo.status == camera.CameraStatus.CAMERA_STATUS_AVAILABLE) {
      console.info(`Current Camera is available.`);
    }
    // 相机被关闭/占用时,回调函数会返回相机不可用状态
    if (cameraStatusInfo.status == camera.CameraStatus.CAMERA_STATUS_UNAVAILABLE) {
      console.info(`Current Camera is unavailable.`);
    }
    console.info(`camera: ${cameraStatusInfo.camera.cameraId}`);
    console.info(`status: ${cameraStatusInfo.status}`);
  });
}

function registerCameraStatus(cameraManager: camera.CameraManager): void {
  cameraManager.on('cameraStatus', onCameraStatusChange);
}

// 注销相机设备状态回调
function unregisterCameraStatus(cameraManager: camera.CameraManager): void {
  cameraManager.off('cameraStatus');  
}

其他状态变化监听

当前版本还支持开启折叠设备折叠状态变化监听和手电筒状态变化回调。

typescript 复制代码
// 开启折叠设备折叠状态变化的监听,折叠机折叠状态参数包括不可折叠、完全展开、折叠态
function registerFoldStatusChange(cameraManager: camera.CameraManager): void {
  cameraManager.on('foldStatusChange', (err: BusinessError, foldStatusInfo: camera.FoldStatusInfo) => {
      if (err !== undefined && err.code !== 0) {
          console.error('foldStatusChange with errorCode = ' + err.code);
          return;
      }
      console.info(`camera length: ${foldStatusInfo.supportedCameras.length}`);
      console.info(`foldStatus: ${foldStatusInfo.foldStatus}`);
      }
  });
}

// 注册手电筒状态变化回调,目前只支持手电筒打开,手电筒关闭,手电筒不可用,手电筒恢复可用会触发该事件并返回对应信息
function registerTorchStatusChange(cameraManager: camera.CameraManager): void {
  cameraManager.on('torchStatusChange', (err: BusinessError, torchStatusInfo: camera.TorchStatusInfo) => {
      if (err !== undefined && err.code !== 0) {
          console.error(`Callback Error, errorCode: ${err.code}`);
          return;
      }
      console.info(`onTorchStatusChange, isTorchAvailable: ${torchStatusInfo.isTorchAvailable}, isTorchActive: ${torchStatusInfo.isTorchActive}, level: ${torchStatusInfo.torchLevel}`);
      }
  });
}
相关推荐
前端世界1 小时前
鸿蒙任务调度机制深度解析:优先级、时间片、多核与分布式的流畅秘密
分布式·华为·harmonyos
小小小小小星5 小时前
鸿蒙开发之ArkUI框架进阶:从声明式范式到跨端实战
harmonyos·arkui
鸿蒙小灰5 小时前
鸿蒙开发对象字面量类型标注的问题
harmonyos
鸿蒙先行者5 小时前
鸿蒙Next不再兼容安卓APK,开发者该如何应对?
harmonyos
YF云飞7 小时前
.NET 在鸿蒙系统(HarmonyOS Next)上的适配探索与实践
华为·.net·harmonyos
Quarkn11 小时前
鸿蒙原生应用ArkUI之自定义List下拉刷新动效
list·harmonyos·arkts·鸿蒙·arkui
AlbertZein12 小时前
HarmonyOS5 凭什么学鸿蒙 —— Context详解
harmonyos
whysqwhw20 小时前
鸿蒙音频播放方式总结
harmonyos
whysqwhw20 小时前
鸿蒙音频录制方式总结
harmonyos
zhanshuo1 天前
HarmonyOS 实战:用 @Observed + @ObjectLink 玩转多组件实时数据更新
harmonyos