如何使用 Android 调用系统相机拍照并保存图像59
在 Android 开发中,调用系统相机进行拍照是一个常见任务。通过使用 Android 提供的 Camera2 API 和相关类,开发者可以轻松地让用户使用智能手机的原生相机界面来捕捉图像。本文将提供逐步指南,介绍如何在 Android 应用中实现此功能。
1. 添加必要的权限
在使用 Camera2 API 之前,必须在 文件中为应用添加必要的权限。对于拍照,需要以下权限:
2. 创建 Camera2 管理类
首先,创建一个管理 Camera2 API 交互的类。此类负责打开和关闭摄像头、创建 CaptureRequest、启动会话以及处理图像捕获回调。public class Camera2Helper {
private CameraManager cameraManager;
private CameraDevice cameraDevice;
private CameraCaptureSession captureSession;
private captureRequestBuilder;
// 省略其他代码...
}
3. 打开摄像头
要打开摄像头,请使用 CameraManager 打开一个 CameraDevice 对象。选择要打开的后置摄像头,并为其创建一个 回调,以在相机状态更改时接收通知。public void openCamera() {
cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
String[] cameraIdList = ();
String cameraId = null;
for (String id : cameraIdList) {
CameraCharacteristics characteristics = (id);
if ((CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_BACK) {
cameraId = id;
break;
}
}
if (cameraId != null) {
(cameraId, new () {
// 省略回调代码...
}, null);
}
}
4. 创建 CaptureRequest
CaptureRequest 定义了相机如何捕捉图像的设置。要创建 CaptureRequest,请使用 captureRequestBuilder 类的 createCaptureRequest 方法。指定要使用的静态设置,例如输出图像尺寸、图像格式和自动对焦模式。public void createCaptureRequest() {
captureRequestBuilder = (CameraDevice.TEMPLATE_STILL_CAPTURE);
(());
(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
(CaptureRequest.JPEG_ORIENTATION, getWindowManager().getDefaultDisplay().getRotation());
}
5. 创建 ImageReader
ImageReader 是一个缓冲区,用于接收从摄像头捕获的图像。创建一个 ImageReader 对象,指定图像格式和要捕获的图像的最佳大小。public void createImageReader() {
imageReader = (imageWidth, imageHeight, , 2);
(new () {
// 省略回调代码...
}, null);
}
6. 创建 CaptureSession
CaptureSession 是一种与相机进行通信并控制其操作的会话。创建 CaptureSession,将 captureRequestBuilder 和 imageReader 作为输入和输出。public void createCaptureSession() {
captureSession = ((()), new () {
// 省略回调代码...
}, null);
}
7. 拍摄图像
要拍摄图像,只需使用 captureSession 调用 capture 方法。这将触发图像捕获并将其发送到 imageReader 缓冲区。public void takePicture() {
((), null, null);
}
8. 处理捕获的图像
当图像变为可用时,会调用 onImageAvailable 回调。您可以访问图像数据并将其保存到文件中或进行进一步处理。public void onImageAvailable(ImageReader reader) {
Image image = ();
ByteBuffer buffer = ()[0].getBuffer();
byte[] bytes = new byte[()];
(bytes);
saveImage(bytes);
}
9. 保存图像
要保存图像,可以将其字节数组写入文件。创建输出文件并使用 FileOutputStream 写入字节数组。public void saveImage(byte[] bytes) {
File imageFile = new File((), "");
FileOutputStream outputStream = new FileOutputStream(imageFile);
(bytes);
();
}
10. 关闭摄像头
在完成拍照后,请务必关闭摄像头和相关资源,以释放系统资源。public void closeCamera() {
if (captureSession != null) {
();
}
if (cameraDevice != null) {
();
}
}
2024-10-18
上一篇:华为鸿蒙:深度研发的创新操作系统