如何检测 Android 设备是否有摄像头?

How do you detect if an Android device has a camera?

如果设备没有摄像头,我想在我的应用程序中禁用摄像头功能。但是,我这样做时似乎遇到了错误。

根据官方Android开发者文档,我可以使用hasSystemFeature()在运行时检测设备特性,如下所示:

boolean hasAnyCamera = this.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY);
Log.i(LOG_TAG, "hasAnyCamera = " + hasAnyCamera);

boolean hasBackCamera = this.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA);
Log.i(LOG_TAG, "hasBackCamera = " + hasBackCamera);

但是,我尝试创建一个没有前置或后置摄像头的模拟器,但它仍然 returns true 进行两项检查。有没有其他方法可以检测 Android 中的摄像头?

相关文档:

经过一番研究,这似乎是一个已知错误,至今已超过 10 年未解决。

参见:Emulator does not honour Camera support flag

好像只知道work-around是用Camera.getNumberOfCameras()的方法检测摄像头的数量,从Android 5.0开始就弃用了

boolean hasCamera = Camera.getNumberOfCameras() > 0;
Log.i(LOG_TAG, "hasCamera = " + hasCamera);

上述方法似乎适用于我的模拟器,尽管警告说它已被弃用。


现在根据 Camera.getNumberOfCameras() 的文档:

“如果设备支持外部摄像头并且连接或断开外部摄像头,[getNumberOfCameras()] 的 return 值可能会动态更改。”

所以也许 hasSystemFeature() 总是 returns true,因为设备稍后可能会连接外部摄像头?

一个模拟器通过使用在运行时启用或禁用某些功能的硬件配置启动。可以为您的模拟器添加/更改一些配置。

我认为,它并没有移除相机硬件,只是禁用了它们。正如你提到的,我创建了一个模拟器,但没有相机。当我更改配置时,我可以使用相机。但是,hasSystemFeature 在这两种情况下都返回 true。

当您创建模拟器时,您选择的设置会写入该 AVD 的 hardware-qemu.ini 中。您可以在 ~/.android/avd/YOUR_EMULATOR.avd/hardware-qemu.ini 中找到它。您可以在设备管理器的 show on disk 中获得准确的路径。