Как проверить, есть ли на устройстве вспышка для передней и задней камеры отдельно?

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

private boolean hasFlash(Context Context) {
    if (Context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)) {
        return true;
    } else {
        return false;
    }
}

_

 if (!hasFlash(Context)) {
            ImageButton FlashButton = (ImageButton) findViewById(R.id.frnxcameraflashbutton);
                            FlashButton.setVisibility(View.INVISIBLE);
                            FlashButton.setImageResource(R.mipmap.cameraflashoffbutton);
        }

person Matej Varga    schedule 27.09.2015    source источник


Ответы (2)


Если вы можете использовать новые Camera2 API (в основном 21+, я думаю), CameraCharacteristics карта ключ-значение, доступная для каждой камеры, должна указывать, есть ли у каждой камеры соответствующая вспышка. Например, вы могли бы просто проверить FLASH_STATE_UNAVAILABLE флаг для каждой камеры для достижения вашей цели.

person stkent    schedule 27.09.2015
comment
Спасибо за ваш ответ. Я использовал устаревшую камеру для этого действия, поэтому большинство API-интерфейсов могли использовать это приложение. Можно ли включить Camera2 в одно и то же действие и получить тот же результат? - person Matej Varga; 28.09.2015
comment
Вы можете использовать Camera2 API на Lollipop и более новых версиях и вернуться к существующей реализации на более старых устройствах. См., например. этот ответ для более подробной информации. - person stkent; 28.09.2015
comment
Это, безусловно, отличная идея, но мне пришлось бы написать аналог деятельности Camera2, чтобы иметь возможность достичь этого нового будущего, верно? В любом случае, большое спасибо за эту информацию, ваш ответ просто идеален. - person Matej Varga; 28.09.2015
comment
Да, вам нужно будет поддерживать вещи Camera1 и Camera2 бок о бок, и вы увидите выгоду только на новых устройствах. - person stkent; 28.09.2015

Если мы используем CameraX, мы можем сделать это, как показано ниже.

var imageCapture: ImageCapture = ImageCapture.Builder()
                .setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
                .setFlashMode(flashMode)
                .setTargetRotation(Surface.ROTATION_0)
                .build()




Нижеприведенный код можно использовать для проверки наличия флэш-памяти на устройстве.

val cameraProviderFuture: ListenableFuture<ProcessCameraProvider> = ProcessCameraProvider.getInstance(requireContext())

//Get camera provider
val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()

//Get camera object after binding to lifecycle
var camera: Camera = cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, preview, imageCapture)

Когда у нас есть объект камеры, мы можем использовать его, чтобы получить CameraInfo и проверить, доступна ли вспышка.

camera?.cameraInfo?.hasFlashUnit()
person arungiri_10    schedule 03.03.2020