1# 相机管理(ArkTS) 2<!--Kit: Camera Kit--> 3<!--Subsystem: Multimedia--> 4<!--Owner: @qano--> 5<!--Designer: @leo_ysl--> 6<!--Tester: @xchaosioda--> 7<!--Adviser: @zengyawen--> 8 9在开发一个相机应用前,需要先通过调用相机接口来创建一个独立的相机设备。 10 11## 开发步骤 12 13详细的API说明请参考[Camera API参考](../../reference/apis-camera-kit/arkts-apis-camera.md)。 14 151. 导入camera接口,接口中提供了相机相关的属性和方法,导入方法如下。 16 17 ```ts 18 import { camera } from '@kit.CameraKit'; 19 import { BusinessError } from '@kit.BasicServicesKit'; 20 import { common } from '@kit.AbilityKit'; 21 ``` 22 232. 通过[getCameraManager](../../reference/apis-camera-kit/arkts-apis-camera-f.md#cameragetcameramanager)方法,获取cameraManager对象。 24 25 Context获取方式请参考:[获取UIAbility的上下文信息](../../application-models/uiability-usage.md#获取uiability的上下文信息)。 26 27 ```ts 28 function getCameraManager(context: common.BaseContext): camera.CameraManager | undefined { 29 let cameraManager: camera.CameraManager; 30 try { 31 cameraManager = camera.getCameraManager(context); 32 } catch (error) { 33 let err = error as BusinessError; 34 console.error(`getCameraManager error, errCode: ${err.code}`); 35 return undefined; 36 } 37 return cameraManager; 38 } 39 ``` 40 41 > **说明:** 42 > 43 > 如果获取对象失败,说明相机可能被占用或无法使用。如果被占用,须等到相机被释放后才能重新获取。 44 453. 通过[CameraManager](../../reference/apis-camera-kit/arkts-apis-camera-CameraManager.md)中的[getSupportedCameras](../../reference/apis-camera-kit/arkts-apis-camera-CameraManager.md#getsupportedcameras)方法,获取当前设备支持的相机列表,列表中存储了设备支持的所有相机ID。若列表不为空,则说明列表中的每个ID都支持独立创建相机对象;否则,说明当前设备无可用相机,不可继续后续操作。 46 47 ```ts 48 function getCameraDevices(cameraManager: camera.CameraManager): Array<camera.CameraDevice> { 49 let cameraArray: Array<camera.CameraDevice> = cameraManager.getSupportedCameras(); 50 if (cameraArray != undefined && cameraArray.length > 0) { 51 for (let index = 0; index < cameraArray.length; index++) { 52 console.info('cameraId : ' + cameraArray[index].cameraId); // 获取相机ID。 53 console.info('cameraPosition : ' + cameraArray[index].cameraPosition); // 获取相机位置。 54 console.info('cameraType : ' + cameraArray[index].cameraType); // 获取相机类型。 55 console.info('connectionType : ' + cameraArray[index].connectionType); // 获取相机连接类型。 56 } 57 return cameraArray; 58 } else { 59 console.error("cameraManager.getSupportedCameras error"); 60 return []; 61 } 62 } 63 ``` 64 65 66## 状态监听 67 68在相机应用开发过程中,可以随时监听相机状态,包括新相机的出现、相机的移除、相机的可用状态。在回调函数中,通过相机ID、相机状态这两个参数进行监听,如当有新相机出现时,可以将新相机加入到应用的备用相机中。 69 70 通过注册cameraStatus事件,通过回调返回监听结果,callback返回CameraStatusInfo参数,参数的具体内容可参考相机管理器回调接口实例[CameraStatusInfo](../../reference/apis-camera-kit/arkts-apis-camera-i.md#camerastatusinfo)。 71 72```ts 73function onCameraStatusChange(cameraManager: camera.CameraManager): void { 74 cameraManager.on('cameraStatus', (err: BusinessError, cameraStatusInfo: camera.CameraStatusInfo) => { 75 if (err !== undefined && err.code !== 0) { 76 console.error(`Callback Error, errorCode: ${err.code}`); 77 return; 78 } 79 // 如果当通过USB连接相机设备时,回调函数会返回新的相机出现状态。 80 if (cameraStatusInfo.status == camera.CameraStatus.CAMERA_STATUS_APPEAR) { 81 console.info(`New Camera device appear.`); 82 } 83 // 如果当断开相机设备USB连接时,回调函数会返回相机被移除状态。 84 if (cameraStatusInfo.status == camera.CameraStatus.CAMERA_STATUS_DISAPPEAR) { 85 console.info(`Camera device has been removed.`); 86 } 87 // 相机被关闭时,回调函数会返回相机可用状态。 88 if (cameraStatusInfo.status == camera.CameraStatus.CAMERA_STATUS_AVAILABLE) { 89 console.info(`Current Camera is available.`); 90 } 91 // 相机被打开/占用时,回调函数会返回相机不可用状态。 92 if (cameraStatusInfo.status == camera.CameraStatus.CAMERA_STATUS_UNAVAILABLE) { 93 console.info(`Current Camera has been occupied.`); 94 } 95 console.info(`camera: ${cameraStatusInfo.camera.cameraId}`); 96 console.info(`status: ${cameraStatusInfo.status}`); 97 }); 98} 99```