如何检测 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 中的摄像头?
相关文档:
- Take Photos > Request the camera feature
- PackageManager.hasSystemFeature()
- PackageManager.FEATURE_CAMERA_ANY
- PackageManager.FEATURE_CAMERA
经过一番研究,这似乎是一个已知错误,至今已超过 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
中获得准确的路径。
如果设备没有摄像头,我想在我的应用程序中禁用摄像头功能。但是,我这样做时似乎遇到了错误。
根据官方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 中的摄像头?
相关文档:
- Take Photos > Request the camera feature
- PackageManager.hasSystemFeature()
- PackageManager.FEATURE_CAMERA_ANY
- PackageManager.FEATURE_CAMERA
经过一番研究,这似乎是一个已知错误,至今已超过 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
中获得准确的路径。