我想在Android中以编程方式打开前闪光灯(不是相机预览)。我在谷歌上搜索了一下,但我找到的帮助把我转到了这个页面

有人有链接或示例代码吗?


当前回答

Android棒棒糖引入了camera2 API,并弃用了之前的camera API。但是,使用已弃用的API来打开flash仍然有效,并且比使用新的API简单得多。

似乎这个新的API是专门用于全功能的相机应用程序的,它的架构师并没有真正考虑到更简单的用例,比如打开手电筒。现在要做到这一点,必须获得CameraManager,使用虚拟Surface创建CaptureSession,最后创建并启动CaptureRequest。包括异常处理,资源清理和长回调!

要了解如何打开Lollipop和更新的手电筒,请查看AOSP项目中的FlashlightController(尝试找到已修改的旧使用api的最新版本)。不要忘记设置所需的权限。


Android棉花糖最终介绍了一个简单的方法来打开闪光灯setTorchMode。

其他回答

2022年Kotlin版本:

fun Context.isFlashLightAvailable() = packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)

val Context.camaraManager: CameraManager get() = getSystemService(CameraManager::class.java)


fun Context.toggleFlashLight(on: Boolean) {
    camaraManager.run {

        val firstCameraWithFlash = cameraIdList.find { camera ->
            getCameraCharacteristics(camera).keys.any { it == FLASH_INFO_AVAILABLE }
        }

        firstCameraWithFlash?.let {
            runCatching { setTorchMode(it, on) }.onFailure { Timber.e(it, "Error setTorchMode") }
        } ?: Timber.e(Throwable("toggleFlashLight"), "Camera with flash not found")

    }
}

或者用一个返回结果的挂起函数

suspend fun Context.toggleFlashLightWithResult(on: Boolean): Boolean {
    return suspendCancellableCoroutine { cont ->
        runCatching {
            camaraManager.run {

                val firstCameraWithFlash = cameraIdList.find { camera ->
                    getCameraCharacteristics(camera).keys.any { it == FLASH_INFO_AVAILABLE }
                }

                val callback = object : CameraManager.TorchCallback() {
                    override fun onTorchModeChanged(cameraId: String, enabled: Boolean) {
                        super.onTorchModeChanged(cameraId, enabled)
            
                       if (cont.isActive) cont.resume(enabled)
                    }
                }

                if (firstCameraWithFlash == null) {
                    Timber.e(Throwable("toggleFlashLight"), "Camera with flash not found")
                    cont.resume(false)
                } else {
                    Timber.tag("~!").d("firstCameraWithFlash: $firstCameraWithFlash")
                    setTorchMode(firstCameraWithFlash, on)
                    registerTorchCallback(mainExecutor, callback)
                }

                cont.invokeOnCancellation { unregisterTorchCallback(callback) }
            }
        }
            .onFailure { Timber.e(it, "Error toggleFlashLight") }

    }
}

你也可以使用下面的代码来关闭闪光灯。

Camera.Parameters params = mCamera.getParameters()
p.setFlashMode(Parameters.FLASH_MODE_OFF);
mCamera.setParameters(params);

我得到了自动闪光与以下简单的三步。

我刚刚在Manifest.xml文件中添加了相机和Flash权限

< uses-permission android: name = " android.permission。相机" / > < uses-feature android: name = " android.hardware。相机" / > < uses-permission android: name = " android.permission.FLASHLIGHT " / > < uses-feature android: name = " android.hardware.camera。Flash " android:required="false" />

In your Camera Code do this way. //Open Camera Camera mCamera = Camera.open(); //Get Camera Params for customisation Camera.Parameters parameters = mCamera.getParameters(); //Check Whether device supports AutoFlash, If you YES then set AutoFlash List<String> flashModes = parameters.getSupportedFlashModes(); if (flashModes.contains(android.hardware.Camera.Parameters.FLASH_MODE_AUTO)) { parameters.setFlashMode(Parameters.FLASH_MODE_AUTO); } mCamera.setParameters(parameters); mCamera.startPreview(); Build + Run —> Now Go to Dim light area and Snap photo, you should get auto flash light if device supports.

试试这个。

CameraManager camManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
    String cameraId = null; // Usually front camera is at 0 position.
    try {
        cameraId = camManager.getCameraIdList()[0];
        camManager.setTorchMode(cameraId, true);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }

Android棒棒糖引入了camera2 API,并弃用了之前的camera API。但是,使用已弃用的API来打开flash仍然有效,并且比使用新的API简单得多。

似乎这个新的API是专门用于全功能的相机应用程序的,它的架构师并没有真正考虑到更简单的用例,比如打开手电筒。现在要做到这一点,必须获得CameraManager,使用虚拟Surface创建CaptureSession,最后创建并启动CaptureRequest。包括异常处理,资源清理和长回调!

要了解如何打开Lollipop和更新的手电筒,请查看AOSP项目中的FlashlightController(尝试找到已修改的旧使用api的最新版本)。不要忘记设置所需的权限。


Android棉花糖最终介绍了一个简单的方法来打开闪光灯setTorchMode。