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()
会抛出,所以