1e41f4b71Sopenharmony_ci# Device Input Management (ArkTS)
2e41f4b71Sopenharmony_ci
3e41f4b71Sopenharmony_ciBefore developing a camera application, you must create an independent camera object. The application invokes and controls the camera object to perform basic operations such as preview, photographing, and video recording.
4e41f4b71Sopenharmony_ci
5e41f4b71Sopenharmony_ci## How to Develop
6e41f4b71Sopenharmony_ci
7e41f4b71Sopenharmony_ciRead [Camera](../../reference/apis-camera-kit/js-apis-camera.md) for the API reference.
8e41f4b71Sopenharmony_ci
9e41f4b71Sopenharmony_ci1. Import the camera module, which provides camera-related attributes and methods.
10e41f4b71Sopenharmony_ci
11e41f4b71Sopenharmony_ci   ```ts
12e41f4b71Sopenharmony_ci   import { camera } from '@kit.CameraKit';
13e41f4b71Sopenharmony_ci   import { BusinessError } from '@kit.BasicServicesKit';
14e41f4b71Sopenharmony_ci   import { common } from '@kit.AbilityKit';
15e41f4b71Sopenharmony_ci   ```
16e41f4b71Sopenharmony_ci
17e41f4b71Sopenharmony_ci2. Call [getCameraManager](../../reference/apis-camera-kit/js-apis-camera.md#cameragetcameramanager) to obtain a **CameraManager** object.
18e41f4b71Sopenharmony_ci
19e41f4b71Sopenharmony_ci   For details about how to obtain the context, see [Obtaining the Context of UIAbility](../../application-models/uiability-usage.md#obtaining-the-context-of-uiability).
20e41f4b71Sopenharmony_ci
21e41f4b71Sopenharmony_ci   ```ts
22e41f4b71Sopenharmony_ci   function getCameraManager(context: common.BaseContext): camera.CameraManager {
23e41f4b71Sopenharmony_ci     let cameraManager: camera.CameraManager = camera.getCameraManager(context);
24e41f4b71Sopenharmony_ci     return cameraManager;
25e41f4b71Sopenharmony_ci   }
26e41f4b71Sopenharmony_ci   ```
27e41f4b71Sopenharmony_ci
28e41f4b71Sopenharmony_ci   > **NOTE**
29e41f4b71Sopenharmony_ci   >
30e41f4b71Sopenharmony_ci   > If obtaining the object fails, the camera hardware may be occupied or unusable. If it is occupied, wait until it is released.
31e41f4b71Sopenharmony_ci
32e41f4b71Sopenharmony_ci3. Call [getSupportedCameras](../../reference/apis-camera-kit/js-apis-camera.md#getsupportedcameras) in the **CameraManager** class to obtain the list of cameras supported by the current device. The list stores the IDs of all cameras supported. If the list is not empty, each ID in the list can be used to create an independent camera object. If the list is empty, no camera is available for the current device and subsequent operations cannot be performed.
33e41f4b71Sopenharmony_ci
34e41f4b71Sopenharmony_ci   ```ts
35e41f4b71Sopenharmony_ci   function getCameraDevices(cameraManager: camera.CameraManager): Array<camera.CameraDevice> {
36e41f4b71Sopenharmony_ci     let cameraArray: Array<camera.CameraDevice> = cameraManager.getSupportedCameras();
37e41f4b71Sopenharmony_ci     if (cameraArray != undefined && cameraArray.length > 0) {
38e41f4b71Sopenharmony_ci       for (let index = 0; index < cameraArray.length; index++) {
39e41f4b71Sopenharmony_ci         console.info('cameraId : ' + cameraArray[index].cameraId);  // Obtain the camera ID.
40e41f4b71Sopenharmony_ci         console.info('cameraPosition : ' + cameraArray[index].cameraPosition);  // Obtain the camera position.
41e41f4b71Sopenharmony_ci         console.info('cameraType : ' + cameraArray[index].cameraType);  // Obtain the camera type.
42e41f4b71Sopenharmony_ci         console.info('connectionType : ' + cameraArray[index].connectionType);  // Obtain the camera connection type.
43e41f4b71Sopenharmony_ci       }
44e41f4b71Sopenharmony_ci       return cameraArray;
45e41f4b71Sopenharmony_ci     } else {
46e41f4b71Sopenharmony_ci       console.error("cameraManager.getSupportedCameras error");
47e41f4b71Sopenharmony_ci       return [];
48e41f4b71Sopenharmony_ci     }
49e41f4b71Sopenharmony_ci   }
50e41f4b71Sopenharmony_ci   ```
51e41f4b71Sopenharmony_ci
52e41f4b71Sopenharmony_ci4. Call [getSupportedOutputCapability](../../reference/apis-camera-kit/js-apis-camera.md#getsupportedoutputcapability11) to obtain all output streams supported by the current device, such as preview streams and photo streams. The output streams supported are the value of each **profile** field under [CameraOutputCapability](../../reference/apis-camera-kit/js-apis-camera.md#cameraoutputcapability).
53e41f4b71Sopenharmony_ci
54e41f4b71Sopenharmony_ci   ```ts
55e41f4b71Sopenharmony_ci   async function getSupportedOutputCapability(cameraDevice: camera.CameraDevice, cameraManager: camera.CameraManager, sceneMode: camera.SceneMode): Promise<camera.CameraOutputCapability | undefined> {
56e41f4b71Sopenharmony_ci     // Create a camera input stream.
57e41f4b71Sopenharmony_ci     let cameraInput: camera.CameraInput | undefined = undefined;
58e41f4b71Sopenharmony_ci     try {
59e41f4b71Sopenharmony_ci       cameraInput = cameraManager.createCameraInput(cameraDevice);
60e41f4b71Sopenharmony_ci     } catch (error) {
61e41f4b71Sopenharmony_ci       let err = error as BusinessError;
62e41f4b71Sopenharmony_ci       console.error('Failed to createCameraInput errorCode = ' + err.code);
63e41f4b71Sopenharmony_ci     }
64e41f4b71Sopenharmony_ci     if (cameraInput === undefined) {
65e41f4b71Sopenharmony_ci       return undefined;
66e41f4b71Sopenharmony_ci     }
67e41f4b71Sopenharmony_ci     // Listen for camera input errors.
68e41f4b71Sopenharmony_ci     cameraInput.on('error', cameraDevice, (error: BusinessError) => {
69e41f4b71Sopenharmony_ci       console.error(`Camera input error code: ${error.code}`);
70e41f4b71Sopenharmony_ci     });
71e41f4b71Sopenharmony_ci     // Open the camera.
72e41f4b71Sopenharmony_ci     await cameraInput.open();
73e41f4b71Sopenharmony_ci     // Obtain the output streams supported by the camera.
74e41f4b71Sopenharmony_ci     let cameraOutputCapability: camera.CameraOutputCapability = cameraManager.getSupportedOutputCapability(cameraDevice, sceneMode);
75e41f4b71Sopenharmony_ci     if (!cameraOutputCapability) {
76e41f4b71Sopenharmony_ci       console.error("cameraManager.getSupportedOutputCapability error");
77e41f4b71Sopenharmony_ci       return undefined;
78e41f4b71Sopenharmony_ci     }
79e41f4b71Sopenharmony_ci     console.info("outputCapability: " + JSON.stringify(cameraOutputCapability));
80e41f4b71Sopenharmony_ci     return cameraOutputCapability;
81e41f4b71Sopenharmony_ci   }
82e41f4b71Sopenharmony_ci   ```
83e41f4b71Sopenharmony_ci
84e41f4b71Sopenharmony_ci
85e41f4b71Sopenharmony_ci## Status Listening
86e41f4b71Sopenharmony_ci
87e41f4b71Sopenharmony_ciDuring camera application development, you can listen for the camera status, including the appearance of a new camera, removal of a camera, and availability of a camera. The camera ID and camera status are included in the callback function. When a new camera appears, the new camera can be added to the supported camera list.
88e41f4b71Sopenharmony_ci
89e41f4b71Sopenharmony_ci  Register the **'cameraStatus'** event and return the listening result through a callback, which carries the **CameraStatusInfo** parameter. For details about the parameter, see [CameraStatusInfo](../../reference/apis-camera-kit/js-apis-camera.md#camerastatusinfo).
90e41f4b71Sopenharmony_ci
91e41f4b71Sopenharmony_ci```ts
92e41f4b71Sopenharmony_cifunction onCameraStatus(cameraManager: camera.CameraManager): void {
93e41f4b71Sopenharmony_ci  cameraManager.on('cameraStatus', (err: BusinessError, cameraStatusInfo: camera.CameraStatusInfo) => {
94e41f4b71Sopenharmony_ci    if (err !== undefined && err.code !== 0) {
95e41f4b71Sopenharmony_ci      console.error(`Callback Error, errorCode: ${err.code}`);
96e41f4b71Sopenharmony_ci      return;
97e41f4b71Sopenharmony_ci    }
98e41f4b71Sopenharmony_ci    console.info(`camera: ${cameraStatusInfo.camera.cameraId}`);
99e41f4b71Sopenharmony_ci    console.info(`status: ${cameraStatusInfo.status}`);
100e41f4b71Sopenharmony_ci  });
101e41f4b71Sopenharmony_ci}
102e41f4b71Sopenharmony_ci```
103