问题:如何解决Android相机2的问题并提供代码示例?
解决方法:
public class CameraManager {
private CameraDevice mCameraDevice;
private CameraManager() {
}
public static CameraManager getInstance() {
return SingletonHolder.INSTANCE;
}
private static class SingletonHolder {
private static final CameraManager INSTANCE = new CameraManager();
}
public void openCamera(Context context, String cameraId, CameraDevice.StateCallback callback) {
CameraManager manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
try {
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
return;
}
manager.openCamera(cameraId, callback, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
public void closeCamera() {
if (mCameraDevice != null) {
mCameraDevice.close();
mCameraDevice = null;
}
}
public CameraDevice getCameraDevice() {
return mCameraDevice;
}
public void setCameraDevice(CameraDevice cameraDevice) {
mCameraDevice = cameraDevice;
}
}
public class CameraDeviceCallback extends CameraDevice.StateCallback {
@Override
public void onOpened(CameraDevice camera) {
CameraManager.getInstance().setCameraDevice(camera);
}
@Override
public void onDisconnected(CameraDevice camera) {
camera.close();
CameraManager.getInstance().setCameraDevice(null);
}
@Override
public void onError(CameraDevice camera, int error) {
camera.close();
CameraManager.getInstance().setCameraDevice(null);
}
}
public class CameraActivity extends AppCompatActivity {
private static final String TAG = "CameraActivity";
private CameraDevice mCameraDevice;
private CameraCaptureSession mCaptureSession;
private SurfaceView mPreviewSurfaceView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
mPreviewSurfaceView = findViewById(R.id.preview_surface_view);
mPreviewSurfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
openCamera();
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
closeCamera();
}
});
}
private void openCamera() {
CameraManager.getInstance().openCamera(this, cameraId, new CameraDeviceCallback());
}
private void closeCamera() {
CameraManager.getInstance().closeCamera();
}
private void createCaptureSession() {
// 创建一个用于预览的CaptureRequest.Builder
CaptureRequest.Builder previewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
// 设置预览的Surface对象
previewRequestBuilder.addTarget(mPreviewSurfaceView.getHolder().getSurface());
try {
mCameraDevice.createCaptureSession(Arrays.asList(mPreviewSurfaceView.getHolder().getSurface()), new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(CameraCaptureSession cameraCaptureSession) {
if (mCameraDevice == null) {
return;
}
mCaptureSession = cameraCaptureSession;
try {
// 开始预览
mCaptureSession.setRepeatingRequest(previewRequestBuilder.build(), null, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) {
Log.e(TAG, "CameraCaptureSession configure failed");
}
}, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
}
以上是解决Android相机2问题的基本步骤和代码示例。根据具体的需求,你可能还需要添加其他功能,例如拍照、录像等。希望能对你有所帮助!