CameraX несколько задних камер

#android #kotlin #android-camerax

#Android #kotlin #android-camerax

Вопрос:

Я пытаюсь реализовать пользовательское приложение для камеры с помощью CameraX. Учитывая, что многие новые устройства теперь имеют несколько задних камер, я также хочу включить это. Таким образом, пользователь может выбрать, какую камеру использовать. Я попробовал следующее, используя опцию addCameraFilter:

 val cameraSelector = CameraSelector.Builder()
                    .requireLensFacing(when (camera.cameraSettings?.lensFacing?.let {
                        LensFacing.valueOf(it)
                    }) {
                        LensFacing.Back -> CameraSelector.LENS_FACING_BACK
                        else -> CameraSelector.LENS_FACING_FRONT
                    })
                    .addCameraFilter { cameraList ->
                        val cameraChosen = camera.cameraSettings?.camera
                        cameraChosen?.let {
                            if (cameraChosen < cameraList.size) {
                                val setCamera = cameraList[cameraChosen]
                                cameraList.clear()
                                cameraList.add(setCamera)
                            }
                        }
                        cameraList
                    }
                    .build()
 

Однако в режиме отладки значение cameraList всегда равно 1. Даже на устройствах с несколькими задними камерами. Означает ли это, что CameraX автоматически выбрал «правильную» камеру? Как я могу вручную выбрать другую (например, на некоторых телефонах установлена камера с широким объективом)?

Спасибо!

Комментарии:

1. Если на используемом устройстве установлено несколько камер заднего вида, но в фильтре камеры указана только 1, вы можете столкнуться с чем-то подобным , когда на устройстве есть физические камеры, которые не указаны / не возвращены в списке общедоступных камер ( getCameraIdList() ), но являются частью логической камеры и возвращаютсявместо этого в getPhysicalCameraIds() .

2. Я тестировал его на Samsung A70, который имеет 3 задние камеры. getCameraIdList() показывает мне 2 камеры (одна из которых является фронтальной камерой) и getPhysicalCameraIds() = 0

3. Я также проверил предоставленную вами ссылку и попытался реализовать CameraFilter, но он ничего не возвращает. Просто ссылка -lambda, которая не работает :/

4. Результат, который вы видите на a70, ожидаемый, если getCameraIdList() возвращает 1 заднюю камеру, то и CameraX тоже. По ссылке, которую я предоставил в предыдущем комментарии, последний ответ предоставляет косвенный способ получить конкретную физическую камеру, установив коэффициент масштабирования. Например, установка коэффициента масштабирования меньше 1 даст вам доступ к камере с широкоугольным объективом. Это не идеально, но другим вариантом может быть прямое использование camera2.