如何在 Android 中以编程方式打开前置闪光灯?

新手上路,请多包涵

我想在 Android 中以编程方式打开前置闪光灯(不带相机预览)。我用谷歌搜索了它,但我找到的帮助将我引到了 这个 页面

有没有人有任何链接或示例代码?

原文由 saiket 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

对于 2021 年,使用 CameraX,现在变得非常容易: https ://stackoverflow.com/a/66585201/294884


对于这个问题,你应该:

  1. 检查手电筒是否可用?

  2. 如果是这样,则关闭/打开

  3. 如果没有,那么您可以根据您的应用需求做任何事情。

检查设备中闪存的可用性

您可以使用以下内容:

  context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);

如果闪存可用,则返回 true,否则返回 false。

看:

http://developer.android.com/reference/android/content/pm/PackageManager.html 了解更多信息。

打开/关闭手电筒:

我用谷歌搜索并得到了关于 android.permission.FLASHLIGHT 的信息。 Android manifests 的权限看起来很有希望:

  <!-- Allows access to the flashlight -->
 <permission android:name="android.permission.FLASHLIGHT"
             android:permissionGroup="android.permission-group.HARDWARE_CONTROLS"
             android:protectionLevel="normal"
             android:label="@string/permlab_flashlight"
             android:description="@string/permdesc_flashlight" />

然后使用 Camera 并设置 Camera.Parameters 。这里使用的主要参数是 FLASH_MODE_TORCH

例如。

代码片段打开相机手电筒。

 Camera cam = Camera.open();
Parameters p = cam.getParameters();
p.setFlashMode(Parameters.FLASH_MODE_TORCH);
cam.setParameters(p);
cam.startPreview();

关闭相机 LED 灯的代码片段。

   cam.stopPreview();
  cam.release();

我刚刚找到了一个使用此权限的项目。检查快速设置的源代码。这里 http://code.google.com/p/quick-settings/ (注意:此链接现已损坏)

对于手电筒直接看 http://code.google.com/p/quick-settings/source/browse/trunk/quick-settings/#quick-settings/src/com/bwx/bequick/flashlight (注意:这个链接是现在坏了)

更新6 您也可以尝试添加一个 SurfaceView ,如本答案中所述, Galaxy Nexus 上的 LED 手电筒可由什么 API 控制? 这似乎是适用于许多手机的解决方案。

更新 5 主要更新

我找到了一个替代链接(对于上面断开的链接): http ://www.java2s.com/Open-Source/Android/Tools/quick-settings/com.bwx.bequick.flashlight.htm 您现在可以使用它关联。 [更新:14/9/2012 此链接现已损坏]

更新 1

另一个开源代码: http ://code.google.com/p/torch/source/browse/

更新 2

展示如何在摩托罗拉 Droid 上启用 LED 的示例: http ://code.google.com/p/droidled/

另一个开源代码:

http://code.google.com/p/covedesigndev/

http://code.google.com/p/search-light/

更新 3(用于打开/关闭摄像头 LED 的小部件)

如果您想开发一个可以打开/关闭相机 LED 的小部件,那么您必须参考我的答案 Widget for 打开/关闭 android 中的相机手电筒

更新 4

如果您想设置从相机 LED 发出的光强度,您可以参考 Can I change the LED intensity of an Android device? 完整的帖子。请注意,只有根深蒂固的 HTC 设备支持此功能。

\*\* 问题:**

打开/关闭手电筒时也存在一些问题。例如。对于没有 FLASH_MODE_TORCH 的设备,或者即使有,手电筒也不会打开等。

通常,三星会产生很多问题。

您可以参考以下列表中的问题:

在 Android 中使用相机手电筒

在三星 Galaxy Ace 2.2.1 和 Galaxy Tab 中打开/关闭相机 LED/闪光灯

原文由 Kartik Domadiya 发布,翻译遵循 CC BY-SA 4.0 许可协议

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") }

    }
}

原文由 Rvb84 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题