Kew*_*ski 8 camera android android-camera flashlight android-camerax
我正在开发一种功能,可以将手电筒切换为开/关状态。几天前,我们在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库,旨在简化相机开发。
mur*_*glu 18
androidx.camera:camera-core:1.0.0-alpha10
Run Code Online (Sandbox Code Playgroud)
您可以通过以下方式检查手电筒是否可用:
val camera = cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, preview, imageAnalyzer)
camera.cameraInfo.hasFlashUnit()
Run Code Online (Sandbox Code Playgroud)
您可以通过以下方式启用手电筒:
camera.cameraControl.enableTorch(true)
Run Code Online (Sandbox Code Playgroud)
这是您可以做到的一种方式(Kotlin)。如果有更好的方法请告诉我。以下代码假设您已经在设备上建立了闪存的可用性。
声明一个 flashMode 变量
private var flashMode: Int = ImageCapture.FLASH_MODE_OFF
Run Code Online (Sandbox Code Playgroud)
在 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()
}
Run Code Online (Sandbox Code Playgroud)
在 bindCameraUseCases 中设置闪光模式
imageCapture = ImageCapture.Builder()
.setCaptureMode(ImageCapture.CAPTURE_MODE_MAXIMIZE_QUALITY)
.setTargetAspectRatio(screenAspectRatio)
.setTargetResolution(screenSize)
.setTargetRotation(rotation)
.setFlashMode(flashMode)
.build()
Run Code Online (Sandbox Code Playgroud)
使用 Java 在 Android 上打开手电筒。
您典型的相机预览代码(例如来自 google 示例)通常以这样的方式结束:
cameraProvider.bindToLifecycle((LifecycleOwner)this,
cameraSelector, imageAnalysis, preview);
Run Code Online (Sandbox Code Playgroud)
打开/关闭手电筒...
Camera cam = cameraProvider.bindToLifecycle((LifecycleOwner)this,
cameraSelector, imageAnalysis, preview);
if ( cam.getCameraInfo().hasFlashUnit() ) {
cam.getCameraControl().enableTorch(true); // or false
}
Run Code Online (Sandbox Code Playgroud)
就是这样!
我无法发表评论,因此我在回答,以扩展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)
Run Code Online (Sandbox Code Playgroud)
不过,附带一提的是,CameraX仍位于Alpha中,因此建议仍使用Camera2 API。
// CameraX
def cameraXVersion = "1.0.0-beta07"
implementation "androidx.camera:camera-camera2:$cameraXVersion"
implementation "androidx.camera:camera-lifecycle:$cameraXVersion"
implementation "androidx.camera:camera-view:1.0.0-alpha14"
private fun initializeFlashButton() = with(binding) {
camera?.apply {
if (cameraInfo.hasFlashUnit()) {
flashButton.setOnClickListener {
flashButton.visibility = View.VISIBLE
cameraControl.enableTorch(cameraInfo.torchState.value == TorchState.OFF)
}
} else {
flashButton.visibility = View.GONE
}
cameraInfo.torchState.observe(viewLifecycleOwner) { torchState ->
if (torchState == TorchState.OFF) {
flashButton.setImageResource(R.drawable.ic_flash)
} else {
flashButton.setImageResource(R.drawable.ic_flash_active)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
您需要在初始化camera对象后执行此方法
小智 6
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)
}
Run Code Online (Sandbox Code Playgroud)
小智 5
用作CameraControl全局变量和布尔值来关闭和打开。
lateinit var cameraControl: CameraControl
private var flashFlag: Boolean = true
Run Code Online (Sandbox Code Playgroud)
通过点击侦听器关闭和打开。
flashFlag = !flashFlag
cameraControl.enableTorch(flashFlag)
Run Code Online (Sandbox Code Playgroud)
在此功能中我启动了相机预览。
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))
}
Run Code Online (Sandbox Code Playgroud)
小智 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)