手电筒/手电筒应用程序(android.hardware.camera 已弃用)

Torch / Flashlight app (android.hardware.camera is deprecated)

我有一个使用此代码的手电筒/手电筒应用程序

开启

    params = camera.getParameters();
    params.setFlashMode(Parameters.FLASH_MODE_TORCH);
    camera.setParameters(params);
    camera.startPreview();

关闭

    params = camera.getParameters();
    params.setFlashMode(Parameters.FLASH_MODE_OFF);
    camera.setParameters(params);
    camera.stopPreview();

然而现在

android.hardware.Camera has been deprecated and It is advised to use the new camera2 api instead.

关于如何使用 camera2 打开 on/off 设备手电筒的任何帮助?

感谢您的帮助

首先,已弃用的 android.hardware.Camera API 仍然可以正常工作,如果您需要支持 Android 早于 5.0 Lollipop 的版本,您仍然需要使用它。

最新 Android 版本(Android Marshmallow 或更新版本)的最简单选项是新的直接手电筒控制:CameraManager.setTorchMode

使用起来非常简单,而且不需要相机权限。

所以我会推荐以下内容:

Pre-API 23,使用已弃用的相机 API 和您现有的方法(不要忘记设置预览显示,虚拟 SurfaceTexture 是最简单的)。您将需要相机权限和运行时权限请求处理。

API 23 或更高版本,使用 setTorchMode 调用,您甚至不需要请求任何特定的运行时权限。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        mCameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
        try {
            for (String camID : mCameraManager.getCameraIdList()) {
                CameraCharacteristics cameraCharacteristics = mCameraManager.getCameraCharacteristics(camID);
                int lensFacing = cameraCharacteristics.get(CameraCharacteristics.LENS_FACING);
                if (lensFacing == CameraCharacteristics.LENS_FACING_FRONT
                        && cameraCharacteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE)) {
                    mCameraId = camID;
                    break;
                } else if (lensFacing == CameraCharacteristics.LENS_FACING_BACK
                        && cameraCharacteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE)) {
                    mCameraId = camID;
                }
                if (mCameraId != null) {
                    mCameraManager.setTorchMode(mCameraId, true);
                }
            }
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }