1# 手电筒使用(C++)
2
3手电筒模式的使用是通过手机启用手电筒功能,使设备的手电筒功能持续保持常亮状态。
4
5在使用相机应用并操作手电筒功能时,存在以下几种情况说明:
6- 当使用后置摄像头并设置闪光灯模式[Camera_FlashMode](../../reference/apis-camera-kit/_o_h___camera.md#camera_flashmode)关闭时,手电筒功能无法启用。
7- 当使用前置摄像头时,手电筒可以正常启用并保持常亮状态。
8- 从前置摄像头切换至后置摄像头时,如果手电筒原本处于开启状态,它将会被自动关闭。
9
10## 开发步骤
11
12详细的API说明请参考[Camera API参考](../../reference/apis-camera-kit/_o_h___camera.md)。
13
141. 导入NDK接口。选择系统提供的NDK接口能力,导入NDK接口的方法如下。
15
16   ```c++
17    // 导入NDK接口头文件
18    #include "hilog/log.h"
19    #include "ohcamera/camera.h"
20    #include "ohcamera/camera_input.h"
21    #include "ohcamera/capture_session.h"
22    #include "ohcamera/camera_manager.h"
23   ```
24
252. 在CMake脚本中链接相关动态库。
26
27    ```txt
28     target_link_libraies(entry PUBLIC libohcamera.so libhilog_ndk.z.so)
29    ```
30
313. 通过[OH_CameraManager_IsTorchSupported()](../../reference/apis-camera-kit/_o_h___camera.md#oh_cameramanager_istorchsupported)方法,检测当前设备是否支持手电筒。
32
33    ```c++
34   // 判断设备是否支持手电筒模式
35   Camera_OutputCapability* cameraOutputCapability = nullptr;
36   Camera_TorchMode torchMode = AUTO;
37   bool isTorchSupported = false;
38   Camera_ErrorCode ret = OH_CameraManager_IsTorchSupported(cameraManager, &isTorchSupported);
39   if (cameraManager == nullptr || ret != CAMERA_OK) {
40        OH_LOG_ERROR(LOG_APP, "OH_CameraManager_IsTorchSupported failed.");
41   }
42   if (isTorchSupported) {
43        OH_LOG_INFO(LOG_APP, "isTorchSupported success.");
44   } else {
45        OH_LOG_ERROR(LOG_APP, "isTorchSupported failed.");
46   }
47   ```
48
494. 通过[OH_CameraManager_IsTorchSupportedByTorchMode()](../../reference/apis-camera-kit/_o_h___camera.md#oh_cameramanager_istorchsupportedbytorchmode)方法,检测当前设备是否支持指定的手电筒模式。
50
51   ```c++
52   bool torchModeSupported = false;
53   ret = OH_CameraManager_IsTorchSupportedByTorchMode(cameraManager, torchMode, &torchModeSupported);
54   if (cameraManager == nullptr || ret != CAMERA_OK) {
55        OH_LOG_ERROR(LOG_APP, "OH_CameraManager_IsTorchSupported failed.");
56   }
57   if (torchModeSupported) {
58        OH_LOG_INFO(LOG_APP, "isTorchModeSupported success.");
59   } else {
60        OH_LOG_ERROR(LOG_APP, "isTorchModeSupported failed. %{public}d ", ret);
61   }
62   ```
63
645. 通过[OH_CameraManager_SetTorchMode()](../../reference/apis-camera-kit/_o_h___camera.md#oh_cameramanager_settorchmode)方法,设置当前设备的手电筒模式。
65
66   ```c++
67   if (torchModeSupported) {
68      OH_LOG_INFO(LOG_APP, "OH_CameraManager_IsTorchModeSupported success.");
69      // 设置手电筒模式
70      ret = OH_CameraManager_SetTorchMode(cameraManager, torchMode);
71      if (ret != CAMERA_OK) {
72          OH_LOG_ERROR(LOG_APP, "OH_CameraManager_SetTorchMode failed. %{public}d ", ret);
73      } else {
74          OH_LOG_INFO(LOG_APP, "OH_CameraManager_SetTorchMode success.");
75        }
76   } else {
77      OH_LOG_ERROR(LOG_APP, "OH_CameraManager_IsTorchModeSupported failed.");
78   }
79   ```
80
81
82## 状态监听
83
84在相机应用开发过程中,可以随时监听手电筒状态,包括手电筒打开、手电筒关闭、手电筒不可用、手电筒恢复可用。手电筒状态发生变化,可通过回调函数获取手电筒模式的变化。
85
86   通过注册torchStatus事件,通过回调返回监听结果,callback返回Camera_TorchStatusInfo参数,参数的具体内容可参考相机管理器回调接口实例[Camera_TorchStatusInfo](../../reference/apis-camera-kit/_camera___torch_status_info.md)。
87
88   ```c++
89   ret = OH_CameraManager_RegisterTorchStatusCallback(cameraManager, GetTorchStatusCallback);
90   if (ret != CAMERA_OK) {
91      OH_LOG_ERROR(LOG_APP, "OH_CameraManager_RegisterTorchStatusCallback failed.");
92   }
93   ```
94   ```c++
95   void GetTorchStatusCallback(Camera_Manager *cameraManager, Camera_TorchStatusInfo* torchStatus)
96   {
97      OH_LOG_INFO(LOG_APP, "OH_CameraManager_GetTorchStatusCallback is called.");
98   }
99   ```