它是什么设备?你得到的答案是一个错误,4.0 现在已经很老了。许多仍然运行此版本的平板电脑制作不正确,硬件和软件都存在多个问题。
无论如何,您应该始终准备好处理
Camera.open()
或 Camera.open(0)
上的故障:例如,在某些情况下,设备上的其他软件不会正常释放相机。
因此,在您的情况下,您有误报,您尝试打开相机,但失败了,并且您继续,就像设备上没有相机一样,即使PackageManager认为PackageManager.FEATURE_CAMERA可用。
虽然我已经接受了 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);
}
在此,我要检查摄像头的数量以及设备是否具有摄像头功能布尔值,因此即使系统返回一个不正确的值,另一个条件也将有助于纠正代码。
就我而言,我有以下代码:
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
。
我明白了,你一定会尝试这个,它肯定会起作用......
import android.hardware.Camera;
int numCameras = Camera.getNumberOfCameras();
if (numCameras > 0) {
System.out.println("camera");
} else {
System.out.println("No Camera");
}
对于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));
}
请尝试此代码:
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;
}
}
还是不行请告诉我