hasSystemFeature(PackageManager.FEATURE_CAMERA) 对于没有相机的设备返回 true

问题描述 投票:0回答:6
android android-camera android-package-managers
6个回答
10
投票

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

无论如何,您应该始终准备好处理

Camera.open()
Camera.open(0)
上的故障:例如,在某些情况下,设备上的其他软件不会正常释放相机。

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


10
投票

虽然我已经接受了 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
投票

就我而言,我有以下代码:

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


0
投票

我明白了,你一定会尝试这个,它肯定会起作用......

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

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));


    }

-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;
    }
}

还是不行请告诉我

© www.soinside.com 2019 - 2024. All rights reserved.