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

时间:2014-03-26 05:25:43

标签: android android-camera android-package-managers

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

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera"  android:required="false"/> 

在我的代码中,我使用此

检查设备是否有相机
final boolean deviceHasCameraFlag = pm.hasSystemFeature(PackageManager.FEATURE_CAMERA);

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

我尝试了不同的东西,甚至在蓝牙功能上尝试了同样的东西,因为平板电脑甚至没有蓝牙功能。它可以很好地用于蓝牙,但是对于相机来说我是真的。

6 个答案:

答案 0 :(得分:9)

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

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

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

答案 1 :(得分:6)

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

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

pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)
即使相机不存在,

也会返回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);
}

在这里,我正在检查相机的数量以及设备是否具有相机功能布尔值,因此无论如何它都不会使我的情况失败。

答案 2 :(得分:1)

就我而言,我有这段代码:

public boolean hasCameraSupport() {
    boolean hasSupport = false;
    if(getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)) { //<- this constant caused problems
        hasSupport = true;
    }
    return hasSupport;
}

并且它在运行Android 4.1.1(API 16)的Genymotion设备上保持返回false。一旦我将常量PackageManager.FEATURE_CAMERA_ANY更改为PackageManager.FEATURE_CAMERA,我的问题就消失了。我猜测并非所有设备/ API级别都支持PackageManager.FEATURE_CAMERA_ANY

答案 3 :(得分:0)

我知道你会尝试这个肯定会起作用....

   import android.hardware.Camera;
   int numCameras = Camera.getNumberOfCameras();
    if (numCameras > 0) {
      System.out.println("camera");
    } else {
        System.out.println("No Camera");
    }

答案 4 :(得分:0)

对于CameraX,如果设备上没有Camera时FEATURE_CAMERA_ANY方法仍返回true,则可以添加以下方法。因此,无论是在初始化CameraX时FEATURE_CAMERA_ANY返回true还是false,如果设备上实际上没有摄像头,那么下面的方法将确保您执行所需的操作。

private CameraSelector cameraSelector;
private ProcessCameraProvider cameraAvailableCheck;
private ListenableFuture<ProcessCameraProvider> cameraAvailableCheckFuture;

private void checkIfAnyCameraExist()
    {

        cameraAvailableCheckFuture = ProcessCameraProvider.getInstance(context);

        cameraAvailableCheckFuture.addListener(new Runnable() {
            @Override
            public void run() {
                try {
                    cameraAvailableCheck = cameraAvailableCheckFuture.get();

                    if ((cameraAvailableCheck.hasCamera(cameraSelector.DEFAULT_BACK_CAMERA) || cameraAvailableCheck.hasCamera(cameraSelector.DEFAULT_FRONT_CAMERA) ))
                    {
                        //Do what you want if at least back OR front camera exist

                    }

                    else
                    {
                        //Do what you want if any camera does not exist

                    }

                }

                catch (ExecutionException | InterruptedException | CameraInfoUnavailableException e)

                {
                    // No errors need to be handled for this Future.
                    // This should never be reached.
                }
            }

        }, ContextCompat.getMainExecutor(this));


    }

答案 5 :(得分:-4)

请尝试以下代码:

private boolean isDeviceSupportCamera() {
    if (getApplicationContext().getPackageManager().hasSystemFeature(
            PackageManager.FEATURE_CAMERA)) {
        // this device has a camera
        return true;
    } else {
        // no camera on this device
        return false;
    }
}

仍然无效,请让我知道