API 21和22中setTorchMode的替代方法是什么?

7

我试图在API 21和22上运行手电筒,但是没有成功。

代码

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
                isFlashlightOn();
                if (camera == null && parameters == null) {
                    camera = Camera.open();
                    parameters = camera.getParameters();
                    parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
                    camera.setParameters(parameters);
                }
                if (getFlashlightState) {
                    Objects.requireNonNull(camera).startPreview();
                } else {
                    Objects.requireNonNull(camera).stopPreview();
                }
            } else {
                isFlashlightOn();
                if (cameraManager == null) {
                    cameraManager = (CameraManager) this.getSystemService(Context.CAMERA_SERVICE);
                }
                try {
                    String cameraId = Objects.requireNonNull(cameraManager).getCameraIdList()[0];
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                        cameraManager.setTorchMode(cameraId, getFlashlightState);
                    }else{
                        //the problem is here because I don't know what can I put in else
                    }
                } catch (CameraAccessException e) {
                    e.printStackTrace();
                }
            }

在API 21和22中,setTorchMode的替代方法是什么?

1个回答

7

新的Camera2 API中的setTorchMode函数仅适用于API 23及以上版本。在21和22 API中应使用旧的相机API进行闪光灯控制。

您还需要处理所有可用的闪光灯模式,因为一些设备不支持FLASH_MODE_TORCH,但兼容FLASH_MODE_ON。

您可以像这样更改代码:

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
    isFlashlightOn();
    if (camera == null && parameters == null) {
        camera = Camera.open();
        parameters = camera.getParameters();

        List<String> modes = parameters.getSupportedFlashModes();
        if (modes.contains(Camera.Parameters.FLASH_MODE_TORCH)) {
            parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
        }
        else if (modes.contains(Camera.Parameters.FLASH_MODE_ON)) {
            parameters.setFlashMode(Camera.Parameters.FLASH_MODE_ON);
        }
        else {
            //No flash available
        }
        camera.setParameters(parameters);
    }
    if (getFlashlightState) {
        Objects.requireNonNull(camera).startPreview();
    } else {
        Objects.requireNonNull(camera).stopPreview();
    }
} else {
    isFlashlightOn();
    if (cameraManager == null) {
        cameraManager = (CameraManager) this.getSystemService(Context.CAMERA_SERVICE);
    }
    try {
        String cameraId = Objects.requireNonNull(cameraManager).getCameraIdList()[0];
        cameraManager.setTorchMode(cameraId, getFlashlightState);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
}

虽然大部分是正确的,但这段代码没有在传统相机API上设置预览输出目标。这意味着在所有设备上实际上不会开始运行预览,并且闪光灯也不会打开,因为只有一些设备允许在没有设置预览目标的情况下启动预览。 - Eddy Talvala
只有当您想要的是torch时,它才能正常工作。如果在预览/捕获期间需要打开/关闭flash,请考虑更新您的CaptureRequest.Builder,并随后调用mCaptureSession.setRepeatingRequest,如此处所示:https://github.com/google/cameraview/blob/68947cc1643e7434250e099f38f346eae9c46339/library/src/main/api21/com/google/android/cameraview/Camera2.java#L544 - Cool Soft

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接