要使用Android相机2 API进行加速预览,可以按照以下步骤进行操作:
dependencies {
implementation 'androidx.camera:camera-camera2:1.0.0-beta07'
}
CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
String cameraId = null;
try {
for (String id : cameraManager.getCameraIdList()) {
CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(id);
Integer facing = characteristics.get(CameraCharacteristics.LENS_FACING);
if (facing != null && facing == CameraCharacteristics.LENS_FACING_BACK) {
cameraId = id;
break;
}
}
} catch (CameraAccessException e) {
e.printStackTrace();
}
CameraDevice.StateCallback stateCallback = new CameraDevice.StateCallback() {
@Override
public void onOpened(@NonNull CameraDevice camera) {
// 相机已打开,可以进行预览
// 创建预览请求
try {
CaptureRequest.Builder requestBuilder = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
requestBuilder.addTarget(previewSurface);
// 创建预览会话
camera.createCaptureSession(Arrays.asList(previewSurface), new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
// 配置已完成,可以开始预览
CaptureRequest request = requestBuilder.build();
try {
session.setRepeatingRequest(request, null, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession session) {
// 配置失败
}
}, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onDisconnected(@NonNull CameraDevice camera) {
// 相机已断开连接
}
@Override
public void onError(@NonNull CameraDevice camera, int error) {
// 相机打开失败
}
};
try {
cameraManager.openCamera(cameraId, stateCallback, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
SurfaceView previewSurface = findViewById(R.id.previewSurface);
SurfaceHolder holder = previewSurface.getHolder();
holder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(@NonNull SurfaceHolder holder) {
// Surface已创建,可以进行相机预览
// 设置预览的尺寸
try {
CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId);
StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
Size[] sizes = map.getOutputSizes(SurfaceHolder.class);
Size previewSize = sizes[0]; // 这里选择第一个尺寸作为预览尺寸
holder.setFixedSize(previewSize.getWidth(), previewSize.getHeight());
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) {
// Surface尺寸已改变
}
@Override
public void surfaceDestroyed(@NonNull SurfaceHolder holder) {
// Surface已销毁
}
});
Surface previewSurface = holder.getSurface();
这样就可以使用Android相机2 API进行加速预览了。请注意,以上代码示例仅包含了基本的预览功能,如果