Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 对于没有摄像头的设备,hasSystemFeature(PackageManager.FEATURE_CAMERA)返回true_Android_Android Camera_Android Package Managers - Fatal编程技术网

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

Android 对于没有摄像头的设备,hasSystemFeature(PackageManager.FEATURE_CAMERA)返回true,android,android-camera,android-package-managers,Android,Android Camera,Android Package Managers,我有一个应用程序,其中使用了摄像头功能,但其部分功能也可以在没有摄像头功能的情况下运行。所以我把这个放在我的舱单上了 <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" android:required="false"/> 现在我正在一台运行安卓4.0(ICS)且没有摄像头的平板电脑上测试我的

我有一个应用程序,其中使用了摄像头功能,但其部分功能也可以在没有摄像头功能的情况下运行。所以我把这个放在我的舱单上了

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera"  android:required="false"/> 
现在我正在一台运行安卓4.0(ICS)且没有摄像头的平板电脑上测试我的代码。但我仍然得到了
设备hascamerafag
的真实值。这是奇怪还是我遗漏了什么

我尝试了不同的东西,甚至在蓝牙功能上尝试了相同的东西,因为平板电脑甚至没有蓝牙功能。它适用于蓝牙,但适用于摄像头。

请尝试以下代码:

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

还是不行,那么请让我知道

我知道了,你会试试这个肯定行

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

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

无论如何,您应该随时准备处理
Camera.open()
Camera.open(0)
上的故障:例如,在某些情况下,设备上的其他软件无法正常释放摄像头


因此,在您的情况下,如果出现假阳性,您尝试打开摄像头,但它失败了,您继续操作,就好像设备上没有摄像头一样,即使PackageManager认为PackageManager.FEATURE\u camera可用。

在我的情况下,我有以下代码:

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;
    }
}
public boolean hasCameraSupport() {
    boolean hasSupport = false;
    if(getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)) { //<- this constant caused problems
        hasSupport = true;
    }
    return hasSupport;
}
public boolean hasCameraSupport(){
布尔hasSupport=false;

如果(getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)){/虽然我已经接受了Alex的答案,但我仍然想把这一个作为在这种情况下的最佳解决方案

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

pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)
即使相机不存在,也返回true,这对我来说似乎是一个未检查的设备错误

因此,每当有场景需要检查设备是否有摄像头时,我都会在下面介绍最佳实践(据我所知,如果有更有趣和最佳的解决方案,欢迎您将其放在这篇文章中)


在本例中,我将检查摄像头的数量以及设备是否具有摄像头功能布尔值,以便在任何情况下都不会使我的条件失败。

对于CameraX,如果设备上没有摄像头时,功能\u camera\u any方法仍返回true,则可以添加以下方法。因此,当CameraX I时,功能\u camera\u 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));


    }
私人摄像师摄像师;
私有进程CameraProvider cameraAvailableCheck;
私有可上市的未来摄像机可用于未来;
私有void checkIfAnyCameraExist()
{
cameraAvailableCheckFuture=ProcessCameraProvider.getInstance(上下文);
cameraAvailableCheckFuture.addListener(新的Runnable(){
@凌驾
公开募捐{
试一试{
cameraAvailableCheck=cameraAvailableCheckFuture.get();
if((cameraAvailableCheck.hasCamera(cameraSelector.DEFAULT_BACK_CAMERA)| | cameraAvailableCheck.hasCamera(cameraSelector.DEFAULT_FRONT_CAMERA)))
{
//如果至少有后置或前置摄像头,请执行您想要的操作
}
其他的
{
//如果没有任何摄像头,请执行所需操作
}
}
捕获(ExecutionException | InterruptedException | CamerainFounableException e)
{
//今后不需要处理任何错误。
//这是永远不应该达到的。
}
}
},ContextCompat.getMainExecutor(this));
}

可能的重复项。请查看投票率最高的答案:如果设备有前/后/两个摄像头,它将返回
true
。是的,设备没有一个摄像头…这就是为什么我在那里期望一个假值…我发布了一个代码,它可以正常工作。如果没有摄像头,我几乎在这两种情况下都检查了好的,试试看it@y.dixit你可以在我的新代码下面尝试一下,然后告诉我……我已经在这上面呆了一整天了,除了得到州政府的电话许可。你的问题帮了我很大的忙!所以在我的代码中,我应该只添加
上下文。getPackageManager()
而不是
getPackageManager()
我会试试。但为什么它能在蓝牙上工作呢?@kalyanpvs那么我的代码有什么问题……应该是
Context
还是
Context
,因为在我尝试执行
Context.getPackageManager()时,没有这样的
Context
提示我创建局部变量
它是一个上下文实例或类似于getApplicationContext()的用法。getPackageManager();如果您收到任何错误,只需发布它,它可能用于查找solution@NaveenKumar这就是我要说的,代码中没有错误……但是
hasSystemFeature(PackageManager.FEATURE\u摄像头)
即使在设备没有摄像头的情况下也会返回true。您是否使用此方法尝试过此操作?它是否仍然返回
true
if(FOO)return true;else return false;
是如此的冗余…只需执行
return FOO;
这是我一直在想的,但我不确定是否会得出结论…因为相同的调用适用于蓝牙功能,而相同的调用适用于摄像头…那么在这种设备错误情况下,解决方案是什么呢..?我是否应该让应用程序保持原样,然后它会在某个时间崩溃我不知道这个设备返回了什么。但是我相信
Camera.open()
会抛出,所以