在使用Camera2 API时,有时候会发生无法获取到物理相机的情况,此时需要进行以下操作:
private boolean checkCameraSupport() { int result = getContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA); return result != PackageManager.FEATURE_CAMERA_UNDEFINED; }
private boolean checkCameraPermission() { boolean result = false; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { int cameraPermission = ContextCompat.checkSelfPermission(getContext(), Manifest.permission.CAMERA); result = cameraPermission == PackageManager.PERMISSION_GRANTED; } else { result = true; } return result; }
private String getAvailableCameraId() throws CameraAccessException { CameraManager manager = (CameraManager) getContext().getSystemService(Context.CAMERA_SERVICE); String[] cameraIds = manager.getCameraIdList(); for (String cameraId : cameraIds) { CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId); int facing = characteristics.get(CameraCharacteristics.LENS_FACING); if (facing == CameraCharacteristics.LENS_FACING_BACK) { return cameraId; } } return cameraIds[0]; }
private void openCamera(String cameraId) { CameraManager manager = (CameraManager) getContext().getSystemService(Context.CAMERA_SERVICE); try { if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { return; } manager.openCamera(cameraId, new CameraDevice.StateCallback() { @Override public void onOpened(CameraDevice cameraDevice) { mCameraDevice = cameraDevice; }
@Override
public void onDisconnected(CameraDevice cameraDevice) {
mCameraDevice.close();
mCameraDevice = null;
}
@Override
public void onError(CameraDevice cameraDevice, int error) {
mCameraDevice.close();
mCameraDevice = null;
}
}, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
通过以上步骤,就可以确保能够获取到物理相机并打开相机进行拍照操作。