hasSystemFeature(PackageManager.FEATURE_CAMERA)对于没有摄像头的设备返回true

Yog*_*h D 14 android android-package-managers android-camera

我有一个应用程序,它使用相机功能,但其部分功能也可以在没有相机功能的情况下运行.所以我把它放在我的清单中.

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera"  android:required="false"/> 
Run Code Online (Sandbox Code Playgroud)

在我的代码中,我检查设备是否有相机使用它

final boolean deviceHasCameraFlag = pm.hasSystemFeature(PackageManager.FEATURE_CAMERA);
Run Code Online (Sandbox Code Playgroud)

现在我在运行Android 4.0(ICS)且没有摄像头的平板电脑上测试我的代码.但我仍然得到真正的价值deviceHasCameraFlag.这有点奇怪还是我错过了什么.

我尝试了不同的东西,甚至在蓝牙功能上尝试了同样的东西,因为平板电脑甚至没有蓝牙功能.它适用于蓝牙,但让我真的适合相机.

Ale*_*ohn 9

它是哪种设备?你得到的答案是一个错误,现在4.0已经很老了.仍然运行此版本的许多平板电脑都没有正确制作,硬件和软件都存在多个问题.

无论如何,您应始终准备好处理故障Camera.open()Camera.open(0):例如,在某些情况下,设备上的其他软件将无法正常释放相机.

因此,在您的情况下,您有误报,您尝试打开相机,它会失败,并且您继续就好像设备上没有相机,即使PackageManager认为PackageManager.FEATURE_CAMERA可用.


Yog*_*h D 7

虽然我已经接受了亚历克斯的回答,但我仍然想把这个集体放在一起,因为在这种情况下这可能是最好的解决方案.

我发现的是一些低标准的Android设备

pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)
Run Code Online (Sandbox Code Playgroud)

即使相机不存在也会返回true,这对我来说似乎是一个未经检查的设备错误.

因此,每当有情况需要检查相机是否存在于某个设备或不是最佳实践时,我会在下面提供最佳实践(根据我的知识,如果有更有趣和最好的解决方案,最好的做法,欢迎您使用它在这个帖子上)

int numberOfCameras = Camera.getNumberOfCameras();
context = this;
PackageManager pm = context.getPackageManager();
final boolean deviceHasCameraFlag = pm.hasSystemFeature(PackageManager.FEATURE_CAMERA);

if( !deviceHasCameraFlag || numberOfCameras==0 )
{
  Log.e(TAG, "Device has no camera" + numberOfCameras);
  Toast.makeText(getApplicationContext(), "Device has no camera",      Toast.LENGTH_SHORT).show();
  captureButton.setEnabled(false);
}
else
{
  Log.e(TAG, "Device has camera" + deviceHasCameraFlag + numberOfCameras);
}
Run Code Online (Sandbox Code Playgroud)

在这个我检查相机的数量以及设备有摄像头功能布尔,所以在任何情况下,它不会失败我的条件.

  • 我宁愿检查以下内容: if(deviceHasCameraFlag &amp;&amp; numberOfCameras &gt; 0) { //.... device has camera } else { //... no camera } (2认同)
  • @y.dixit 好吧,也许这只是一个偏好问题,但我发现它更容易阅读。 (2认同)