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