在Android中使用相机2录制视频时出现错误可以有多种原因,以下是一种可能的解决方法,包含代码示例:
private static final int REQUEST_CAMERA_PERMISSION = 1;
private void requestCameraPermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA},
REQUEST_CAMERA_PERMISSION);
} else {
// 已经授予相机权限
// 进行相机初始化操作
setupCamera();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
if (requestCode == REQUEST_CAMERA_PERMISSION) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 相机权限已授予
// 进行相机初始化操作
setupCamera();
} else {
// 相机权限被拒绝
Toast.makeText(this, "相机权限被拒绝", Toast.LENGTH_SHORT).show();
}
}
}
private CameraDevice mCameraDevice;
private CameraCaptureSession mCaptureSession;
private CaptureRequest.Builder mPreviewRequestBuilder;
private ImageReader mImageReader;
private void setupCamera() {
CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
String cameraId = cameraManager.getCameraIdList()[0]; // 获取第一个相机的ID
cameraManager.openCamera(cameraId, new CameraDevice.StateCallback() {
@Override
public void onOpened(@NonNull CameraDevice camera) {
mCameraDevice = camera;
// 进行预览等其他操作
createCaptureSession();
}
@Override
public void onDisconnected(@NonNull CameraDevice camera) {
// 相机断开连接
mCameraDevice = null;
}
@Override
public void onError(@NonNull CameraDevice camera, int error) {
// 相机打开错误
mCameraDevice = null;
}
}, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
private void createCaptureSession() {
try {
// 创建相机预览和录制会话
List outputSurfaces = new ArrayList<>();
// 添加预览的Surface
SurfaceTexture surfaceTexture = previewTextureView.getSurfaceTexture();
surfaceTexture.setDefaultBufferSize(previewWidth, previewHeight);
Surface previewSurface = new Surface(surfaceTexture);
outputSurfaces.add(previewSurface);
// 添加录制视频的Surface
mImageReader = ImageReader.newInstance(videoWidth, videoHeight,
ImageFormat.YUV_420_888, 1);
Surface videoSurface = mImageReader.getSurface();
outputSurfaces.add(videoSurface);
// 创建请求构建器
mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
mPreviewRequestBuilder.addTarget(previewSurface);
mPreviewRequestBuilder.addTarget(videoSurface);
// 创建相机会话
mCameraDevice.createCaptureSession(outputSurfaces, new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
mCaptureSession = session;
// 开始预览
startPreview();
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession session) {
// 相机会话配置失败
}
}, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
private void startPreview() {
try {
// 设置预览请求为连续自动对焦
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
// 设置预览请求为自动曝光
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,
CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
// 设置预览请求为屏幕方向
mPreviewRequestBuilder.set(CaptureRequest.JPEG_ORIENTATION,
getWindowManager().getDefaultDisplay().getRotation());
// 设置预览回调
m