Как библиотека 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

Другие вопросы по тегам