棉花糖中的手电筒控制

Eds*_*tti 13 camera android android-camera flashlight android-6.0-marshmallow

我在最近的Marshmallow构造中有关于相机的问题,更具体地说是手电筒.在任何预先Marshmallow版本上,我需要做的就是打开/关闭闪光灯,如下所示:

private void turnFlashOn(final Camera camera, int flashLightDurationMs) {
    if (!isFlashOn()) {
        final List<String> supportedFlashModes = camera.getParameters().getSupportedFlashModes();
        if (supportedFlashModes != null && supportedFlashModes.contains(Camera.Parameters.FLASH_MODE_TORCH)) {
            mParams.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
            camera.setParameters(mParams);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

private void turnFlashOff(Camera camera) {
    if (camera != null) {
        final List<String> supportedFlashModes = camera.getParameters().getSupportedFlashModes();
        if (supportedFlashModes != null && supportedFlashModes.contains(Camera.Parameters.FLASH_MODE_OFF)) {
            mParams.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
            camera.setParameters(mParams);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,Marshmallow设备开始在野外崩溃.不知何故,camera.getParameters()camera.setParameters()开始失败的消息,如:

RuntimeException:getParameters失败(空参数)

RuntimeException:setParameters失败

我尝试在获取参数之前启动并停止预览,这不再引发错误.但是,当我打电话时,预览不会恢复camera.startPreview().

我担心释放相机并重新打开它是不可能的,因为这需要几秒钟而且会产生糟糕的体验.

有关如何可靠地打开/关闭Marshmallow手电筒的任何建议吗?

Sau*_*474 6

谷歌在OS 6(Android M)中引入了火炬模式.
如果你的目的只是打开/关闭闪光灯,下面的代码可以帮助你:

private static void handleActionTurnOnFlashLight(Context context){
    try{

        CameraManager manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
        String[] list = manager.getCameraIdList();
        manager.setTorchMode(list[0], true);
    }
    catch (CameraAccessException cae){
        Log.e(TAG, cae.getMessage());
        cae.printStackTrace();
    }
}

private static void handleActionTurnOffFlashLight(Context context){
    try{
        CameraManager manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
        manager.setTorchMode(manager.getCameraIdList()[0], false);
    }
    catch (CameraAccessException cae){
        Log.e(TAG, cae.getMessage());
        cae.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

您所要做的就是:获取摄像机列表,其中摄像机ID零(0)是您想要打开/关闭闪光灯的主摄像机.只需将cameraID传递给setTochMode API,并使用布尔值将其打开或关闭.

请注意,这段代码仅适用于OS 6,因此您需要检查设备操作系统,并根据您需要选择要为预棉花糖设备调用的API.

如果能解决您的问题,请将此标记为解决方案.


Lar*_*fer 0

更新您的应用程序以在运行时检查权限。你必须已经android.permission.CAMERA授予。将其包含在应用程序的清单中不会在 Marshmallow 上将其授予您。您需要检测它是否已被授予并请求它。