Android 10 (API 29)引入了相机2 API的回归,使开发人员可以更容易地访问广角相机。以下是一个包含代码示例的解决方法:
android {
compileSdkVersion 29
defaultConfig {
...
targetSdkVersion 29
...
}
...
}
private CameraManager cameraManager;
private String cameraId;
private CameraDevice cameraDevice;
private CameraCaptureSession cameraCaptureSession;
private CaptureRequest.Builder captureRequestBuilder;
private ImageReader imageReader;
cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
cameraId = getCameraId();
其中,getCameraId()方法用于获取广角相机的ID。您可以根据需要选择前置或后置相机。
@Override
protected void onResume() {
super.onResume();
openCamera();
}
private void openCamera() {
try {
cameraManager.openCamera(cameraId, cameraStateCallback, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
其中,cameraStateCallback是一个CameraDevice.StateCallback对象,用于处理相机的打开和关闭状态。
private CameraDevice.StateCallback cameraStateCallback = new CameraDevice.StateCallback() {
@Override
public void onOpened(CameraDevice camera) {
cameraDevice = camera;
createCameraPreviewSession();
}
@Override
public void onDisconnected(CameraDevice camera) {
cameraDevice.close();
}
@Override
public void onError(CameraDevice camera, int error) {
cameraDevice.close();
}
};
其中,createCameraPreviewSession()方法用于创建相机预览会话。
private void createCameraPreviewSession() {
try {
SurfaceTexture surfaceTexture = textureView.getSurfaceTexture();
surfaceTexture.setDefaultBufferSize(previewSize.getWidth(), previewSize.getHeight());
Surface previewSurface = new Surface(surfaceTexture);
Surface imageSurface = imageReader.getSurface();
captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
captureRequestBuilder.addTarget(previewSurface);
captureRequestBuilder.addTarget(imageSurface);
cameraDevice.createCaptureSession(Arrays.asList(previewSurface, imageSurface), captureSessionCallback, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
其中,textureView是一个用于显示相机预览的TextureView对象,previewSize是预览的尺寸。
private CameraCaptureSession.StateCallback captureSessionCallback = new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(CameraCaptureSession session) {
cameraCaptureSession = session;
try {
captureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
CaptureRequest captureRequest = captureRequestBuilder.build();
cameraCaptureSession.setRepeatingRequest(captureRequest, null, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(CameraCaptureSession session) {
Toast.makeText(MainActivity.this, "Camera configuration failed.", Toast.LENGTH_SHORT).show();
}
};
其中,设置了自动对焦和自动闪光灯。
@Override
protected void onPause() {
closeCamera();
super.onPause();
}
private void closeCamera() {
if (cameraCaptureSession != null) {
cameraCaptureSession.close();
cameraCaptureSession = null;
}