Android Camera2 API使用详解
前言
在 Android 开发中,使用相机是非常常见的操作之一。从 Android 5.0 开始,Google 推出了全新的 Camera2 API,相比老的 Camera API,Camera2 API 更加灵活,性能更高,功能更强大,尤其是支持 RAW 图片和 YUV 格式的输出,对于对照片、视频有要求的开发者非常适用。在此,我将为大家详细介绍 Android Camera2 API 的使用方法。
步骤
1. 获取相机管理器
首先,我们需要获取相机管理器的实例,用于管理我们的摄像头设备。相机管理器可以通过 getSystemService() 方法获取。
CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
2. 获取支持的相机列表
获取相机管理器实例之后,我们需要获取当前设备支持的相机列表。我们可以通过 getCameraIdList() 方法来获取相机列表。
String[] cameraIdList = cameraManager.getCameraIdList();
3. 获取相机设备
获取相机列表之后,我们需要从中选择一个相机设备来进行调用。我们可以通过 getCameraCharacteristics() 方法来获取指定相机设备的特性,这里选择了后置摄像头。
String cameraId = null;
CameraCharacteristics characteristics = null;
for (String id : cameraIdList) {
CameraCharacteristics tempCharacteristics = cameraManager.getCameraCharacteristics(id);
int cameraOrientation = tempCharacteristics.get(CameraCharacteristics.LENS_FACING);
if (cameraOrientation == CameraCharacteristics.LENS_FACING_BACK) {
characteristics = tempCharacteristics;
cameraId = id;
break;
}
}
4. 获取相机输出尺寸
获取相机设备之后,我们需要确定相机输出的尺寸。在 Camera2 API 中,我们可以通过这样的方式获取相机输出尺寸:
StreamConfigurationMap streamConfigurationMap = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
Size[] outputSizes = streamConfigurationMap.getOutputSizes(ImageFormat.YUV_420_888);
5. 创建预览请求和预览 surface
获取相机输出尺寸之后,我们需要创建一个预览请求和预览 Surface,来将相机的输出流传递给我们的 UI 界面。预览请求可以通过 createCaptureRequest() 方法创建,而预览 Surface 则可以通过 SurfaceHolder 或 SurfaceTexture 从我们的 UI 布局中获取。
SurfaceTexture surfaceTexture = textureView.getSurfaceTexture();
Surface previewSurface = new Surface(surfaceTexture);
CaptureRequest.Builder previewBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
previewBuilder.addTarget(previewSurface);
6. 启动预览
获取预览请求和 Surface 之后,我们需要启动相机预览,通过 setRepeatingRequest() 方法进行设置,这样就可以将相机的预览流显示在我们的 UI 界面上了。
cameraDevice.createCaptureSession(Arrays.asList(previewSurface), new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
try {
session.setRepeatingRequest(previewBuilder.build(), null, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession session) {
}
}, null);
7. 拍照
最后,我们可以通过 createCaptureRequest() 方法来创建一个拍照请求,并通过 CaptureCallback 监听器来获取拍照结果,并将拍摄的照片保存在指定目录。
CaptureRequest.Builder photoBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
photoBuilder.addTarget(photoSurface);
cameraCaptureSession.stopRepeating();
cameraCaptureSession.abortCaptures();
cameraCaptureSession.capture(photoBuilder.build(), null, new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
super.onCaptureCompleted(session, request, result);
Image image = null;
try {
image = mImageReader.acquireLatestImage();
if (image != null) {
ByteBuffer buffer = image.getPlanes()[0].getBuffer();
byte[] data = new byte[buffer.remaining()];
buffer.get(data);
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
File file = new File(Environment.getExternalStorageDirectory() + "/DCIM/Camera", "photo.jpg");
FileOutputStream outputStream = new FileOutputStream(file);
outputStream.write(data);
outputStream.flush();
outputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (image != null) {
image.close();
}
}
}
}, null);
后记
通过上面的步骤,我们就可以很容易地使用 Camera2 API 来实现相机的预览和拍照功能了。当然,这只是一个简单的示例,如果要实现更加丰富的功能,还需要更加深入地学习 Camera2 API 的使用方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:androidcamera2api使用详解 - Python技术站