如何检查设备是否分别为前置和后置摄像头配备闪光灯?

How to check if the device has a flash for front and back facing camera separately?

我目前正在研究相机 activity。当我自动切换到前置摄像头时,我设法访问了我设备的后置摄像头闪光灯并隐藏了闪光灯切换按钮。但是,我想知道是否有一种方法可以检查辅助闪光灯,因为许多智能手机型号都带有前置摄像头闪光灯,这在没有后置摄像头闪光灯的平板电脑上使用此应用程序时也会有所帮助。我的想法是使用两个独立的布尔值分别检查前后摄像头闪光灯,如果闪光灯不可用,则将切换按钮设置为不可见。我真的不喜欢显示或隐藏闪光灯按钮的想法,而无需确保设备的任何相机中是否有闪光灯。这是我到目前为止所拥有的。有什么想法吗?

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);
        }

如果您能够使用新的 Camera2 API(我认为大多数是 21+),每个摄像头的 CameraCharacteristics key-value map available for each camera should indicate whether or not each camera has a corresponding flash. For example, you could probably just check for the FLASH_STATE_UNAVAILABLE 标志可以实现您的目标。

如果我们使用的是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()