我想在 Android 中以编程方式打开前置闪光灯(不带相机预览)。我用谷歌搜索了它,但我找到的帮助将我引到了 这个 页面
有没有人有任何链接或示例代码?
原文由 saiket 发布,翻译遵循 CC BY-SA 4.0 许可协议
我想在 Android 中以编程方式打开前置闪光灯(不带相机预览)。我用谷歌搜索了它,但我找到的帮助将我引到了 这个 页面
有没有人有任何链接或示例代码?
原文由 saiket 发布,翻译遵循 CC BY-SA 4.0 许可协议
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 许可协议
3 回答938 阅读✓ 已解决
2 回答1k 阅读✓ 已解决
1 回答817 阅读✓ 已解决
2 回答929 阅读
2 回答868 阅读
1 回答803 阅读
1 回答854 阅读
对于 2021 年,使用 CameraX,现在变得非常容易: https ://stackoverflow.com/a/66585201/294884
对于这个问题,你应该:
检查手电筒是否可用?
如果是这样,则关闭/打开
如果没有,那么您可以根据您的应用需求做任何事情。
检查设备中闪存的可用性:
您可以使用以下内容:
如果闪存可用,则返回 true,否则返回 false。
看:
http://developer.android.com/reference/android/content/pm/PackageManager.html 了解更多信息。
打开/关闭手电筒:
我用谷歌搜索并得到了关于 android.permission.FLASHLIGHT 的信息。 Android manifests 的权限看起来很有希望:
然后使用 Camera 并设置 Camera.Parameters 。这里使用的主要参数是 FLASH_MODE_TORCH 。
例如。
代码片段打开相机手电筒。
关闭相机 LED 灯的代码片段。
我刚刚找到了一个使用此权限的项目。检查快速设置的源代码。这里 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/闪光灯