1e41f4b71Sopenharmony_ci# Device Input Management (C/C++)
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/_o_h___camera.md) for the API reference.
8e41f4b71Sopenharmony_ci
9e41f4b71Sopenharmony_ci1. Import the NDK.  
10e41f4b71Sopenharmony_ci
11e41f4b71Sopenharmony_ci   ```c++
12e41f4b71Sopenharmony_ci    // Include the NDK header files.
13e41f4b71Sopenharmony_ci    #include "hilog/log.h"
14e41f4b71Sopenharmony_ci    #include "ohcamera/camera.h"
15e41f4b71Sopenharmony_ci    #include "ohcamera/camera_input.h"
16e41f4b71Sopenharmony_ci    #include "ohcamera/capture_session.h"
17e41f4b71Sopenharmony_ci    #include "ohcamera/photo_output.h"
18e41f4b71Sopenharmony_ci    #include "ohcamera/preview_output.h"
19e41f4b71Sopenharmony_ci    #include "ohcamera/video_output.h"
20e41f4b71Sopenharmony_ci    #include "ohcamera/camera_manager.h"
21e41f4b71Sopenharmony_ci   ```
22e41f4b71Sopenharmony_ci
23e41f4b71Sopenharmony_ci2. Link the dynamic library in the CMake script.
24e41f4b71Sopenharmony_ci
25e41f4b71Sopenharmony_ci   ```txt
26e41f4b71Sopenharmony_ci    target_link_libraries(entry PUBLIC libohcamera.so libhilog_ndk.z.so)
27e41f4b71Sopenharmony_ci   ```
28e41f4b71Sopenharmony_ci
29e41f4b71Sopenharmony_ci3. Call **OH_Camera_GetCameraManager()** to obtain a **CameraManager** object.
30e41f4b71Sopenharmony_ci
31e41f4b71Sopenharmony_ci   ```c++
32e41f4b71Sopenharmony_ci   Camera_Manager *cameraManager = nullptr;
33e41f4b71Sopenharmony_ci   Camera_Input* cameraInput = nullptr;
34e41f4b71Sopenharmony_ci   Camera_Device* cameras = nullptr;
35e41f4b71Sopenharmony_ci   Camera_OutputCapability* cameraOutputCapability = nullptr;
36e41f4b71Sopenharmony_ci   const Camera_Profile* previewProfile = nullptr;
37e41f4b71Sopenharmony_ci   const Camera_Profile* photoProfile = nullptr;
38e41f4b71Sopenharmony_ci   uint32_t size = 0;
39e41f4b71Sopenharmony_ci   uint32_t cameraDeviceIndex = 0;
40e41f4b71Sopenharmony_ci   // Create a CameraManager object.
41e41f4b71Sopenharmony_ci   Camera_ErrorCode ret = OH_Camera_GetCameraManager(&cameraManager);
42e41f4b71Sopenharmony_ci   if (cameraManager == nullptr || ret != CAMERA_OK) {
43e41f4b71Sopenharmony_ci         OH_LOG_ERROR(LOG_APP, "OH_Camera_GetCameraManager failed.");
44e41f4b71Sopenharmony_ci   }
45e41f4b71Sopenharmony_ci   ```
46e41f4b71Sopenharmony_ci
47e41f4b71Sopenharmony_ci   > **NOTE**
48e41f4b71Sopenharmony_ci   >
49e41f4b71Sopenharmony_ci   > If obtaining the object fails, the camera hardware may be occupied or unusable. If it is occupied, wait until it is released.
50e41f4b71Sopenharmony_ci
51e41f4b71Sopenharmony_ci4. Call **OH_CameraManager_GetSupportedCameras()** 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.
52e41f4b71Sopenharmony_ci     
53e41f4b71Sopenharmony_ci   ```c++
54e41f4b71Sopenharmony_ci   // Obtain the camera list.
55e41f4b71Sopenharmony_ci   ret = OH_CameraManager_GetSupportedCameras(cameraManager, &cameras, &size);
56e41f4b71Sopenharmony_ci   if (cameras == nullptr || size < 0 || ret != CAMERA_OK) {
57e41f4b71Sopenharmony_ci         OH_LOG_ERROR(LOG_APP, "OH_CameraManager_GetSupportedCameras failed.");
58e41f4b71Sopenharmony_ci   }
59e41f4b71Sopenharmony_ci   for (int index = 0; index < size; index++) {
60e41f4b71Sopenharmony_ci      OH_LOG_ERROR(LOG_APP, "cameraId  =  %{public}s ", cameras[index].cameraId);              // Obtain the camera ID.
61e41f4b71Sopenharmony_ci      OH_LOG_ERROR(LOG_APP, "cameraPosition  =  %{public}d ", cameras[index].cameraPosition);  // Obtain the camera position.
62e41f4b71Sopenharmony_ci      OH_LOG_ERROR(LOG_APP, "cameraType  =  %{public}d ", cameras[index].cameraType);          // Obtain the camera type.
63e41f4b71Sopenharmony_ci      OH_LOG_ERROR(LOG_APP, "connectionType  =  %{public}d ", cameras[index].connectionType);  // Obtain the camera connection type.
64e41f4b71Sopenharmony_ci   }
65e41f4b71Sopenharmony_ci   ```
66e41f4b71Sopenharmony_ci
67e41f4b71Sopenharmony_ci5. Call **OH_CameraManager_GetSupportedCameraOutputCapability()** 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**.
68e41f4b71Sopenharmony_ci
69e41f4b71Sopenharmony_ci   ```c++
70e41f4b71Sopenharmony_ci   // Create a camera input stream.
71e41f4b71Sopenharmony_ci   ret = OH_CameraManager_CreateCameraInput(cameraManager, &cameras[cameraDeviceIndex], &cameraInput);
72e41f4b71Sopenharmony_ci   if (cameraInput == nullptr || ret != CAMERA_OK) {
73e41f4b71Sopenharmony_ci         OH_LOG_ERROR(LOG_APP, "OH_CameraManager_CreateCameraInput failed.");
74e41f4b71Sopenharmony_ci   }
75e41f4b71Sopenharmony_ci   ret = OH_CameraInput_RegisterCallback(cameraInput, GetCameraInputListener());
76e41f4b71Sopenharmony_ci   if (ret != CAMERA_OK) {
77e41f4b71Sopenharmony_ci         OH_LOG_ERROR(LOG_APP, "OH_CameraInput_RegisterCallback failed.");
78e41f4b71Sopenharmony_ci   }
79e41f4b71Sopenharmony_ci   // Open the camera.
80e41f4b71Sopenharmony_ci   ret = OH_CameraInput_Open(cameraInput);
81e41f4b71Sopenharmony_ci   if (ret != CAMERA_OK) {
82e41f4b71Sopenharmony_ci         OH_LOG_ERROR(LOG_APP, "OH_CameraInput_Open failed.");
83e41f4b71Sopenharmony_ci   }
84e41f4b71Sopenharmony_ci   // Obtain the output streams supported by the camera.
85e41f4b71Sopenharmony_ci   ret = OH_CameraManager_GetSupportedCameraOutputCapability(cameraManager, &cameras[cameraDeviceIndex],
86e41f4b71Sopenharmony_ci                                                                  &cameraOutputCapability);
87e41f4b71Sopenharmony_ci   if (cameraOutputCapability == nullptr || ret != CAMERA_OK) {
88e41f4b71Sopenharmony_ci         OH_LOG_ERROR(LOG_APP, "OH_CameraManager_GetSupportedCameraOutputCapability failed.");
89e41f4b71Sopenharmony_ci   }
90e41f4b71Sopenharmony_ci   
91e41f4b71Sopenharmony_ci   if (cameraOutputCapability->previewProfilesSize < 0) {
92e41f4b71Sopenharmony_ci      OH_LOG_ERROR(LOG_APP, "previewProfilesSize == null");
93e41f4b71Sopenharmony_ci   }
94e41f4b71Sopenharmony_ci   previewProfile = cameraOutputCapability->previewProfiles[0];
95e41f4b71Sopenharmony_ci
96e41f4b71Sopenharmony_ci   if (cameraOutputCapability->photoProfilesSize < 0) {
97e41f4b71Sopenharmony_ci      OH_LOG_ERROR(LOG_APP, "photoProfilesSize == null");
98e41f4b71Sopenharmony_ci   }
99e41f4b71Sopenharmony_ci   photoProfile = cameraOutputCapability->photoProfiles[0];
100e41f4b71Sopenharmony_ci   ```
101e41f4b71Sopenharmony_ci   ```c++
102e41f4b71Sopenharmony_ci   // Listen for camera input errors.
103e41f4b71Sopenharmony_ci   void OnCameraInputError(const Camera_Input* cameraInput, Camera_ErrorCode errorCode)
104e41f4b71Sopenharmony_ci   {
105e41f4b71Sopenharmony_ci      OH_LOG_INFO(LOG_APP, "OnCameraInput errorCode = %{public}d", errorCode);
106e41f4b71Sopenharmony_ci   }
107e41f4b71Sopenharmony_ci
108e41f4b71Sopenharmony_ci   CameraInput_Callbacks* GetCameraInputListener(void)
109e41f4b71Sopenharmony_ci   {
110e41f4b71Sopenharmony_ci      static CameraInput_Callbacks cameraInputCallbacks = {
111e41f4b71Sopenharmony_ci         .onError = OnCameraInputError
112e41f4b71Sopenharmony_ci      };
113e41f4b71Sopenharmony_ci      return &cameraInputCallbacks;
114e41f4b71Sopenharmony_ci   }
115e41f4b71Sopenharmony_ci   ```
116e41f4b71Sopenharmony_ci
117e41f4b71Sopenharmony_ci## Status Listening
118e41f4b71Sopenharmony_ci
119e41f4b71Sopenharmony_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.
120e41f4b71Sopenharmony_ci
121e41f4b71Sopenharmony_ci  Register the **'cameraStatus'** event and return the listening result through a callback, which carries the **Camera_StatusInfo** parameter. For details about the parameter, see [Camera_StatusInfo](../../reference/apis-camera-kit/_camera___status_info.md).
122e41f4b71Sopenharmony_ci  
123e41f4b71Sopenharmony_ci   ```c++
124e41f4b71Sopenharmony_ci   ret = OH_CameraManager_RegisterCallback(cameraManager, GetCameraManagerListener());
125e41f4b71Sopenharmony_ci   if (ret != CAMERA_OK) {
126e41f4b71Sopenharmony_ci      OH_LOG_ERROR(LOG_APP, "OH_CameraManager_RegisterCallback failed.");
127e41f4b71Sopenharmony_ci   }
128e41f4b71Sopenharmony_ci   ```
129e41f4b71Sopenharmony_ci   ```c++
130e41f4b71Sopenharmony_ci   void CameraManagerStatusCallback(Camera_Manager* cameraManager, Camera_StatusInfo* status)
131e41f4b71Sopenharmony_ci   {
132e41f4b71Sopenharmony_ci      OH_LOG_INFO(LOG_APP, "CameraManagerStatusCallback is called");
133e41f4b71Sopenharmony_ci   }
134e41f4b71Sopenharmony_ci   CameraManager_Callbacks* GetCameraManagerListener()
135e41f4b71Sopenharmony_ci   {
136e41f4b71Sopenharmony_ci      static CameraManager_Callbacks cameraManagerListener = {
137e41f4b71Sopenharmony_ci         .onCameraStatus = CameraManagerStatusCallback
138e41f4b71Sopenharmony_ci      };
139e41f4b71Sopenharmony_ci      return &cameraManagerListener;
140e41f4b71Sopenharmony_ci   }
141e41f4b71Sopenharmony_ci   ```
142