手电筒使用(C++)
==========

通过操作设备启用手电筒功能，可使设备的手电筒保持常亮状态。

在使用相机应用并操作手电筒功能时，存在以下几种情况说明：

*   当使用后置相机并设置闪光灯模式[Camera\_FlashMode](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/capi-camera-h#camera_flashmode)关闭时，手电筒功能无法启用。
*   当使用前置相机时，手电筒可以正常启用并保持常亮状态。
*   从前置相机切换至后置相机时，如果手电筒原本处于开启状态，它将会被自动关闭。

#### 开发步骤

详细的API说明请参考[OH\_Camera](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/capi-oh-camera)。

1.  导入NDK接口。选择系统提供的NDK接口能力，导入NDK接口的方法如下。
    
    // 导入NDK接口头文件。
    #include "hilog/log.h"
    #include "ohcamera/camera.h"
    #include "ohcamera/camera\_input.h"
    #include "ohcamera/capture\_session.h"
    #include "ohcamera/camera\_manager.h"
    
2.  在CMake脚本中链接相关动态库。
    
    target\_link\_libraries(entry PUBLIC
        libace\_napi.z.so
        libohcamera.so
        libhilog\_ndk.z.so
    )
    
3.  通过[OH\_CameraManager\_IsTorchSupported()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/capi-camera-manager-h#oh_cameramanager_istorchsupported)方法，检测当前设备是否支持手电筒。
    
    bool IsTorchSupported(Camera\_Manager\* cameraManager)
    {
        // 判断设备是否支持手电筒模式。
        bool isTorchSupported = false;
        if (cameraManager == nullptr) {
            OH\_LOG\_ERROR(LOG\_APP, "cameraManager is nullptr.");
            return isTorchSupported;
        }
        Camera\_ErrorCode ret = OH\_CameraManager\_IsTorchSupported(cameraManager, &isTorchSupported);
        if (ret != CAMERA\_OK) {
            OH\_LOG\_ERROR(LOG\_APP, "OH\_CameraManager\_IsTorchSupported failed.");
        }
        if (isTorchSupported) {
            OH\_LOG\_INFO(LOG\_APP, "isTorchSupported success.");
        } else {
            OH\_LOG\_ERROR(LOG\_APP, "isTorchSupported failed.");
        }
        return isTorchSupported;
    }
    
4.  通过[OH\_CameraManager\_IsTorchSupportedByTorchMode()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/capi-camera-manager-h#oh_cameramanager_istorchsupportedbytorchmode)方法，检测当前设备是否支持指定的手电筒模式。
    
    bool IsTorchSupportedByTorchMode(Camera\_Manager\* cameraManager, Camera\_TorchMode torchMode)
    {
        bool torchModeSupported = false;
        Camera\_ErrorCode ret = OH\_CameraManager\_IsTorchSupportedByTorchMode(cameraManager, torchMode, &torchModeSupported);
        if (ret != CAMERA\_OK) {
             OH\_LOG\_ERROR(LOG\_APP, "OH\_CameraManager\_IsTorchSupported failed.");
        }
        if (torchModeSupported) {
             OH\_LOG\_INFO(LOG\_APP, "isTorchModeSupported success.");
        } else {
             OH\_LOG\_ERROR(LOG\_APP, "isTorchModeSupported failed. %{public}d ", ret);
        }
        return torchModeSupported;
    }
    
5.  通过[OH\_CameraManager\_SetTorchMode()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/capi-camera-manager-h#oh_cameramanager_settorchmode)方法，设置当前设备的手电筒模式。
    
    Camera\_ErrorCode SetTorchMode(Camera\_Manager\* cameraManager, Camera\_TorchMode torchMode)
    {
        // 在torchMode支持的情况下进行设置手电筒模式。
        Camera\_ErrorCode ret = OH\_CameraManager\_SetTorchMode(cameraManager, torchMode);
        if (ret != CAMERA\_OK) {
            OH\_LOG\_ERROR(LOG\_APP, "OH\_CameraManager\_SetTorchMode failed. %{public}d ", ret);
        } else {
            OH\_LOG\_INFO(LOG\_APP, "OH\_CameraManager\_SetTorchMode success.");
        }
        return ret;
    }
    

#### 状态监听

在相机应用开发过程中，可以随时监听手电筒状态，包括手电筒打开、手电筒关闭、手电筒不可用、手电筒恢复可用。手电筒状态发生变化，可通过回调函数获取状态的变化。

注册torchStatus事件，回调会返回监听结果，callback返回Camera\_TorchStatusInfo参数，参数的具体内容可参考相机管理器回调接口实例[Camera\_TorchStatusInfo](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/capi-oh-camera-camera-torchstatusinfo)。

void TorchStatusCallback(Camera\_Manager \*cameraManager, Camera\_TorchStatusInfo\* torchStatus)
{
   OH\_LOG\_INFO(LOG\_APP, "TorchStatusCallback is called.");
}
Camera\_ErrorCode RegisterTorchStatusCallback(Camera\_Manager \*cameraManager)
{
    Camera\_ErrorCode ret = OH\_CameraManager\_RegisterTorchStatusCallback(cameraManager, TorchStatusCallback);
    if (ret != CAMERA\_OK) {
       OH\_LOG\_ERROR(LOG\_APP, "OH\_CameraManager\_RegisterTorchStatusCallback failed.");
    }
    return ret;
}