在Android Studio中,如果相机2预览屏幕无法添加UI,可能是因为UI元素的布局与预览屏幕的SurfaceView不兼容。以下是一种解决方法:
CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
String cameraId = cameraManager.getCameraIdList()[0]; // 获取第一个相机的ID
SurfaceView surfaceView = findViewById(R.id.surfaceView);
SurfaceHolder surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
// 打开相机
cameraManager.openCamera(cameraId, new CameraDevice.StateCallback() {
@Override
public void onOpened(@NonNull CameraDevice camera) {
// 相机打开成功后,设置预览显示的目标为SurfaceView
List surfaces = new ArrayList<>();
surfaces.add(surfaceHolder.getSurface());
camera.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
// 配置成功后,开始预览
CaptureRequest.Builder builder = session.getDevice().createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
builder.addTarget(surfaceHolder.getSurface());
CaptureRequest request = builder.build();
session.setRepeatingRequest(request, null, null);
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession session) {
// 配置失败
}
}, null);
}
@Override
public void onDisconnected(@NonNull CameraDevice camera) {
// 相机断开连接
}
@Override
public void onError(@NonNull CameraDevice camera, int error) {
// 相机打开出错
}
}, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// SurfaceView发生变化
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// SurfaceView销毁
}
});
通过以上代码,你可以在相机预览的SurfaceView上添加其他的UI元素,并且它们将会显示在预览画面的上方。