如何检查设备是不是有分别用于前置和后置摄像头的闪光灯?
Posted
技术标签:
【中文标题】如何检查设备是不是有分别用于前置和后置摄像头的闪光灯?【英文标题】:How to check if the device has a flash for front and back facing camera separately?如何检查设备是否有分别用于前置和后置摄像头的闪光灯? 【发布时间】:2015-12-25 02:51:46 【问题描述】:我目前正在处理相机活动。当我自动切换到前置摄像头时,我设法访问了设备的后置摄像头闪光灯并隐藏了闪光灯切换按钮。但是,我想知道是否有一种方法可以检查辅助闪光灯,因为许多智能手机型号都带有前置摄像头闪光灯,并且在从没有后置摄像头闪光灯的平板电脑上使用此应用程序时也会有所帮助。我的想法是使用两个独立的布尔值分别检查前置和后置摄像头闪光灯,如果闪光灯不可用,则将切换按钮设置为不可见。我真的不喜欢在不确保设备的任何相机中有闪光灯的情况下显示或隐藏闪光灯按钮的想法。这就是我到目前为止所拥有的。有什么想法吗?
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);
【问题讨论】:
【参考方案1】:如果您能够使用新的Camera2
API(我认为大多数是 21+),则每个相机可用的 CameraCharacteristics
键值映射应该指示每个相机是否有相应的闪光灯。例如,您可能只需检查每个相机的 FLASH_STATE_UNAVAILABLE
标志即可实现您的目标。
【讨论】:
感谢您的回答。我为此活动使用了已弃用的相机,因此大多数 API 都可以使用此应用程序。是否可以将 Camera2 也包含到相同的活动中并获得相同的结果? 您可以在 Lollipop 和更新版本上使用Camera2
API,并回退到旧设备上的现有实现。参见例如this answer 了解更多详情。
这当然是个好主意,但我必须编写 Camera2 模拟活动才能实现这个新的未来,对吧?无论如何,非常感谢您提供这些信息,您的回答非常完美。
是的,您需要同时维护 Camera1 和 Camera2 的东西,并且只会在较新的设备上看到好处。【参考方案2】:
如果我们使用的是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()
【讨论】:
以上是关于如何检查设备是不是有分别用于前置和后置摄像头的闪光灯?的主要内容,如果未能解决你的问题,请参考以下文章