Как библиотека CameraX может включать / выключать фонарик?
Я разрабатываю функцию с возможностью переключения горелки в состояние ВКЛ / ВЫКЛ. Несколько дней назад мы увидели новую библиотеку от Google в io2019. У меня возникла идея, почему бы не использовать ее.
Через некоторое время я не вижу возможности использовать единственный факел из библиотеки.
Даже в официальной документации я не смог найти никакой полезной информации для меня, более того, пример приложения от них также не должен обрабатывать мой случай.
Есть ли у вас какие-то мысли о том, что легко реализовать, или, возможно, вы знаете, как это сделать с помощью CameraX?
Я беспокоюсь об использовании камеры или камеры2, потому что количество кода, которое нужно вставить, ужасно.
Ссылки:
[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, созданная с целью облегчить разработку камеры.
10 ответов
androidx.camera:camera-core:1.0.0-alpha10
Вы можете проверить, доступен ли фонарик, с помощью этого:
val camera = cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, preview, imageAnalyzer)
camera.cameraInfo.hasFlashUnit()
И вы можете включить фонарик с помощью:
camera.cameraControl.enableTorch(true)
Синтаксис 2021 года.
Включите фонарик на Android, используя Java.
Типичный код предварительного просмотра камеры (например, из примера Google) обычно заканчивается так:
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 var
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 установите режим flash
imageCapture = ImageCapture.Builder()
.setCaptureMode(ImageCapture.CAPTURE_MODE_MAXIMIZE_QUALITY)
.setTargetAspectRatio(screenAspectRatio)
.setTargetResolution(screenSize)
.setTargetRotation(rotation)
.setFlashMode(flashMode)
.build()
// 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)
}
}
}
}
Вам нужно выполнить этот метод после инициализации camera
объект
Я не могу комментировать, поэтому я отвечаю, чтобы расширить ответ yevhen_69.
Установка enabledTorch(true) у меня тоже не сработала, однако я обнаружил, что мне нужно установить enableTorch(true) после вызова CameraX.bindToLifecycle
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 все еще находится в альфа-версии, поэтому рекомендуется использовать Camera2 API.
Использовать
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))
}
androidx.camera:camera-core:1.0.0-alpha06
Новая версия CameraX предоставляет эти функции. CameraInfo добавлен с проверкой наличия вспышки и 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);
}
val previewConfig = PreviewConfig.Builder().apply {
setLensFacing(lensFacing)
// Any setup
setTargetRotation(viewFinder.display.rotation)
}.build()
val preview = Preview(previewConfig)
preview.enableTorch(true)
Вы можете включить факел на Preview
объект. https://developer.android.com/reference/androidx/camera/core/Preview.html
И вы можете установить режим вспышки (вкл / выкл / авто) на ImageCapture
объект или на конфиг конструктор связанный. https://developer.android.com/reference/androidx/camera/core/ImageCapture.html https://developer.android.com/reference/androidx/camera/core/ImageCaptureConfig.Builder.html