我正在开发一项功能,可以将手电筒切换为开/关状态。前几天,我们在io2019看到了Google的一个新库。我想到了一个主意,为什么不使用它呢。
一段时间后,我看不到任何使用图书馆中唯一的火炬的可能性。
即使在官方文档中,我也找不到任何对我有用的信息,而且,他们的示例应用程序也不必处理我的情况。
您是否知道什么是容易实现的,或者您知道如何使用 CameraX 来实现?
我担心使用camera或camera2,因为要粘贴的代码量非常糟糕。
链接:
[1]https://developer.android.com/training/camerax
[2]https://proandroiddev.com/android-camerax-preview-analyze-capture-1b3f403a9395
[3]https://github.com/android/camera/tree/master/CameraXBasic
[4]https://github.com/android/camera/tree/master/CameraXBasic
CameraX 是一个 Android Jetpack 库,旨在让相机开发变得更容易。
androidx.camera:camera-core:1.0.0-alpha10
您可以通过以下方式检查手电筒是否可用:
val camera = cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, preview, imageAnalyzer)
camera.cameraInfo.hasFlashUnit()
您可以通过以下方式启用手电筒:
camera.cameraControl.enableTorch(true)
典型的相机预览代码(例如来自谷歌示例)通常如下结束:
cameraProvider.bindToLifecycle((LifecycleOwner)this,
cameraSelector, imageAnalysis, preview);
打开/关闭手电筒...
Camera cam = cameraProvider.bindToLifecycle((LifecycleOwner)this,
cameraSelector, imageAnalysis, preview);
if ( cam.getCameraInfo().hasFlashUnit() ) {
cam.getCameraControl().enableTorch(true); // or false
}
就是这样!
imageCapture = ImageCapture.Builder()
.setFlashMode(ImageCapture.FLASH_MODE_ON)
.build()
val camera = cameraProvider.bindToLifecycle(
this, cameraSelector, preview, imageCapture, imageAnalyzer)
if (camera.cameraInfo.hasFlashUnit()) {
camera.cameraControl.enableTorch(true)
}
声明 flashMode 变量
private var flashMode: Int = ImageCapture.FLASH_MODE_OFF
在 updateCameraUI 设置监听器
controls.findViewById<ImageButton>(R.id.flash_button).setOnClickListener {
when (flashMode) {
ImageCapture.FLASH_MODE_OFF ->
flashMode = ImageCapture.FLASH_MODE_ON
ImageCapture.FLASH_MODE_ON ->
flashMode = ImageCapture.FLASH_MODE_AUTO
ImageCapture.FLASH_MODE_AUTO ->
flashMode = ImageCapture.FLASH_MODE_OFF
}
// Re-bind use cases to include changes
bindCameraUseCases()
}
在bindCameraUseCases中设置闪光模式
imageCapture = ImageCapture.Builder()
.setCaptureMode(ImageCapture.CAPTURE_MODE_MAXIMIZE_QUALITY)
.setTargetAspectRatio(screenAspectRatio)
.setTargetResolution(screenSize)
.setTargetRotation(rotation)
.setFlashMode(flashMode)
.build()
设置enabledTorch(true)对我来说也不起作用,但是我发现我必须在调用CameraX.bindToLifecycle
之后设置enableTorch(true)
val previewConfig = PreviewConfig.Builder().apply {
setLensFacing(lensFacing)
// Any setup
setTargetRotation(viewFinder.display.rotation)
}.build()
val preview = Preview(previewConfig)
CameraX.bindToLifecycle(this, preview)
preview.enableTorch(true)
不过顺便说一句,CameraX 仍处于 Alpha 阶段,因此建议仍然使用 Camera2 API。
初始化
camera
对象后需要执行此方法
CameraControl
作为全局变量和布尔值来关闭和打开。
lateinit var cameraControl: CameraControl
private var flashFlag: Boolean = true
通过点击监听器关闭和打开。
flashFlag = !flashFlag
cameraControl.enableTorch(flashFlag)
在这个功能
我已经开始了相机预览。
private fun startCamera() {
val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener({
// Used to bind the lifecycle of cameras to the lifecycle owner
val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()
// Preview
val preview = Preview.Builder()
.build()
.also {
it.setSurfaceProvider(binding.cameraView.surfaceProvider)
}
// Select back camera as a default
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
try {
// Unbind use cases before rebinding
cameraProvider.unbindAll()
// Bind use cases to camera
val camera = cameraProvider.bindToLifecycle(
this, cameraSelector, preview
)
cameraControl = camera.cameraControl
cameraControl.enableTorch(flashFlag)
} catch (exc: Exception) {
Log.e(TAG, "Use case binding failed", exc)
}
}, ContextCompat.getMainExecutor(this))
}
CameraX 新版本提供了这些功能。 CameraInfo 添加了检查 Flash 可用和传感器旋转 API,请参阅此链接
try {
CameraInfo cameraInfo = CameraX.getCameraInfo(currentCameraLensFacing);
LiveData<Boolean> isFlashAvailable = cameraInfo.isFlashAvailable();
flashToggle.setVisibility(isFlashAvailable.getValue() ? View.VISIBLE : View.INVISIBLE);
} catch (CameraInfoUnavailableException e) {
Log.w(TAG, "Cannot get flash available information", e);
flashToggle.setVisibility(View.VISIBLE);
}
Preview
对象上启用手电筒。
https://developer.android.com/reference/androidx/camera/core/Preview.html#enableTorch(boolean)您可以在
ImageCapture
对象或关联的配置生成器上设置闪光模式(开/关/自动)。
https://developer.android.com/reference/androidx/camera/core/ImageCapture.html#setFlashMode(androidx.camera.core.FlashMode)https://developer.android.com/reference/androidx/camera/core/ImageCaptureConfig.Builder.html#setFlashMode(androidx.camera.core.FlashMode)
或者,
CameraManager API 类可用于打开/关闭手电筒,而不是 CameraX 库。
Koltin 代码如下
private var cameraManager : CameraManager? = null
private var cameraId = ""
cameraManager = requireActivity().getSystemService(Context.CAMERA_SERVICE) as CameraManager?
try {
// O means back camera unit,
// 1 means front camera unit
cameraId = cameraManager!!.cameraIdList[0]
} catch (e: CameraAccessException) {
e.printStackTrace()
}
cameraManager!!.setTorchMode(cameraId, true)
对于禁用:
cameraManager!!.setTorchMode(cameraId, false)