CameraX 库如何打开/关闭手电筒?

问题描述 投票:0回答:11

我正在开发一项功能,可以将手电筒切换为开/关状态。前几天,我们在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 库,旨在让相机开发变得更容易。

android camera android-camera flashlight android-camerax
11个回答
31
投票
androidx.camera:camera-core:1.0.0-alpha10

您可以通过以下方式检查手电筒是否可用:

val camera = cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, preview, imageAnalyzer) camera.cameraInfo.hasFlashUnit()

您可以通过以下方式启用手电筒:

camera.cameraControl.enableTorch(true)
    

19
投票
2021 语法。

使用 Java 在 Android 上打开手电筒。

典型的相机预览代码(例如来自谷歌示例)通常如下结束:

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 }
就是这样!


15
投票
2022 语法

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

13
投票
这是一种方法(Kotlin)。如果有更好的方法请告诉我。以下代码假设您已经确定设备上闪存的可用性。

声明 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()
    

9
投票
我无法发表评论,所以我正在回答以扩展 yevhen_69 的答案。

设置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。


9
投票
初始化
camera

对象后需要执行此方法

    


5
投票
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)) }



3
投票


3
投票
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); }



2
投票
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)


0
投票
更新:2023年

或者,

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)

© www.soinside.com 2019 - 2024. All rights reserved.