我有一个使用相机功能的应用程序,但其部分功能也可以在没有相机功能的情况下运行。所以我把它放在我的清单中。
<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
的真值。这有点奇怪,还是我错过了什么。
我尝试了不同的东西,甚至在蓝牙功能上尝试了同样的东西,因为平板电脑甚至没有蓝牙功能。它可以很好地用于蓝牙,但是对于相机来说我是真的。
答案 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;
}
}
仍然无效,请让我知道