Как библиотека 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, созданная с целью упростить разработку камеры.


person Kewin Czupryński    schedule 18.05.2019    source источник


Ответы (8)


androidx.camera:camera-core:1.0.0-alpha10

Вы можете проверить, доступен ли фонарик, с помощью этого:

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

camera.cameraInfo.hasFlashUnit()

И вы можете включить фонарик с помощью:

camera.cameraControl.enableTorch(true)
person murgupluoglu    schedule 21.02.2020
comment
большое спасибо! Я использовал последний синтаксис в ответе. - person Fattie; 11.03.2021

Это один из способов сделать это (Котлин). Если есть способ получше, дайте мне знать. В следующем коде предполагается, что вы уже установили доступность флеш-памяти на устройстве.

Объявить 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 установите режим прошивки

            imageCapture = ImageCapture.Builder()
                .setCaptureMode(ImageCapture.CAPTURE_MODE_MAXIMIZE_QUALITY)
                .setTargetAspectRatio(screenAspectRatio)
                .setTargetResolution(screenSize)
                .setTargetRotation(rotation)
                .setFlashMode(flashMode)
                .build()
person Knight Forked    schedule 26.03.2020

Я не могу комментировать, поэтому я отвечаю, чтобы расширить ответ 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.

person Iain Stanford    schedule 13.08.2019

Синтаксис 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
}

вот и все!

person Fattie    schedule 11.03.2021
comment
редакторы - ура, не удаляйте фразы, которые нужны поисковикам - person Fattie; 19.03.2021
comment
В 2021 году мы будем использовать Kotlin, а не Java, и для этого есть предыдущий ответ: stackoverflow.com/a/65592461/4433326 - person Louis CAD; 19.03.2021
comment
Для тех, кто просто хочет включить вспышку, вам все равно нужно разрешение камеры, чтобы она работала, а также как минимум 1 вариант использования для привязки к cameraProvider. - person Ranjan; 06.07.2021

// 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

person kazhiu    schedule 29.07.2020
comment
Блестящий ответ. Спасибо, что воспользовались возможностью наблюдать за состоянием резака. Однако можно было бы использовать немного больше объяснений. Тем не менее отличный ответ. - person Sakiboy; 03.12.2020

androidx.camera:camera-core:1.0.0-alpha06

Новая версия 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);
}
person Akshay Raiyani    schedule 18.10.2019
comment
Где этот класс CameraX вы используете? Я думаю, что CameraX - это библиотека, а не класс, я не могу найти статический метод CameraX.getCameraInfo, подобный тому, который вы здесь назвали. Кроме того, этот фрагмент кода будет проверять только состояние флэш-памяти и устанавливать видимость переключателя на основе состояния флэш-памяти, на самом деле он не будет устанавливать состояние флэш-памяти. - person Adam Burley; 18.06.2021
comment
Это пример, когда cameraX находится в альфа-версии, в последней версии этот класс может быть удален. - person Akshay Raiyani; 19.06.2021

Вы можете включить фонарик на объекте 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)

person Rémi Latapy    schedule 20.05.2019
comment
Похоже, этот метод enableTorch был удален из API. - person Adam Burley; 18.06.2021

person    schedule
comment
Извините, но enableTorch, похоже, не работает на моем Huawei P10 Lite с Android 8.0. Предварительный просмотр работает нормально, но кажется, что он просто не заботится о enableTorch (true). ¯_ (ツ) _ / ¯ Есть идеи? - person Pluto1010; 24.06.2019
comment
enableTorch больше не является методом класса Preview; см. developer.android.com/reference/androidx/camera/core/ < / а> - person Adam Burley; 18.06.2021