安卓中引入Camera2 API
时间: 2023-11-25 21:06:35 浏览: 98
在 Android 中使用 Camera2 API 时,需要在应用的 build.gradle 文件中添加以下依赖:
```
dependencies {
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:design:28.0.0'
implementation 'com.android.support:support-v4:28.0.0'
implementation 'com.android.support:recyclerview-v7:28.0.0'
// Camera2 API 相关依赖
implementation 'com.android.support:camera-camera2:28.0.0'
implementation 'com.android.support:exifinterface:28.0.0'
}
```
然后,在代码中使用 CameraManager 类获取 Camera 设备并打开相机。以下是一个简单的使用 Camera2 API 拍照的示例代码:
```java
// 获取 CameraManager 对象
CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
// 获取可用的 Camera 设备列表
String[] cameraIds = manager.getCameraIdList();
// 打开指定的 Camera 设备
manager.openCamera(cameraIds[0], new CameraDevice.StateCallback() {
@Override
public void onOpened(@NonNull CameraDevice camera) {
// Camera 设备打开成功后的回调
// 创建 CaptureRequest.Builder 对象
CaptureRequest.Builder builder = camera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
// 设置拍照参数
builder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
builder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
// 创建 ImageReader 对象,用于获取拍照结果
ImageReader reader = ImageReader.newInstance(imageWidth, imageHeight, ImageFormat.JPEG, 1);
reader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
// 获取拍照结果
Image image = reader.acquireLatestImage();
ByteBuffer buffer = image.getPlanes()[0].getBuffer();
byte[] data = new byte[buffer.remaining()];
buffer.get(data);
image.close();
// 保存拍照结果到文件中
FileOutputStream outputStream = new FileOutputStream(imageFile);
outputStream.write(data);
outputStream.close();
}
}, null);
// 将 ImageReader 的 Surface 添加到 CaptureRequest.Builder 中
builder.addTarget(reader.getSurface());
// 创建 CaptureSession 对象并启动预览
List<Surface> outputSurfaces = Arrays.asList(reader.getSurface(), new Surface(textureView.getSurfaceTexture()));
camera.createCaptureSession(outputSurfaces, new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
// CaptureSession 配置成功后的回调
try {
// 启动预览
session.setRepeatingRequest(builder.build(), null, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession session) {
// CaptureSession 配置失败后的回调
}
}, null);
}
@Override
public void onDisconnected(@NonNull CameraDevice camera) {
// Camera 设备断开连接后的回调
}
@Override
public void onError(@NonNull CameraDevice camera, int error) {
// Camera 设备发生错误后的回调
}
}, null);
```
以上代码仅为示例,具体的 Camera2 API 使用方式和实现方式还需根据具体需求进行调整。
阅读全文