1.Camera2 开发时在onDestroy关闭相机时会报错; onError会报错 ,int error的值为1
protected final CameraDevice.StateCallback stateCallback = new CameraDevice.StateCallback() {
/**
* 当相机打开的时候,调用
* @param cameraDevice
*/
@Override
public void onOpened(@NonNull CameraDevice cameraDevice) {
mCameraOpenCloseLock.release(); /** 释放访问许可**/
mCameraDevice = cameraDevice; /** 将正在使用的相机指向将打开的相机**/
startPreView(); /** 开始预览 **/
}
@Override
public void onDisconnected(@NonNull CameraDevice cameraDevice) {
KLog.e("摄像头连接丢失 == " );
mCameraOpenCloseLock.release(); /** 释放访问许可**/
cameraDevice.close(); /** 关闭相机**/
mCameraDevice = null; /** 将正在使用的相机指向null**/
}
/**
* 发生异常的时候调用
*
* 这里释放资源,然后关闭界面
* @param cameraDevice
* @param error
*/
@Override
public void onError(@NonNull CameraDevice cameraDevice, int error) {
KLog.e("摄像头发送异常 == " + error);
mCameraOpenCloseLock.release(); /** 释放访问许可**/
cameraDevice.close(); /** 关闭相机**/
mCameraDevice = null; /** 将正在使用的相机指向null**/
/** 执行 关闭 Activity **/
iCamera.onError(operationType, Constant.CAMERA2_STATE_ERROR);
}
@Override
public void onClosed(@NonNull CameraDevice camera) {
super.onClosed(camera);
KLog.e("摄像头完全关闭");
}
};
解决方案: 在onPause中 添加: 先停止相机预览。
/**
* 在MediaRecorder停止前,停止相机预览,防止抛出serious error异常。
*/
try {
mPreviewSession.stopRepeating();
mPreviewSession.abortCaptures();
} catch (CameraAccessException e) {
KLog.e("为相机创建一个CameraCaptureSession 停止预览");
e.printStackTrace();
}
************************************************************************************************************
2. Lacking privileges to access camera service 错误
错误场景: camera 授权未成功就调用打开相机操作.
@Override
protected void openCamera(Activity activity, int width, int height) {
QLog.i("初始化相机");
if (PermissionsManager.checkCameraPermission(activity)) { /** 权限判断**/
if (null == activity || activity.isFinishing()) {
return;
}
}else {
iCamera.onError(operationType, Constant.CAMERA2_NO_PERMISSION);
}
CameraManager cameraManager = (CameraManager)getContext().getSystemService(Context.CAMERA_SERVICE);
setCameraInfo(cameraManager, width, height); // 打开相机的方法
}
解决方案: 判断授权失败时不执行后续方法.或者程序运行时先将所需权限都授权.
************************************************************************************************************
3. android.permission.CAMERA 授权失败
错误场景: Android 7.0 系统, AndroidManifest.xml文件中配置了
<uses-permission android:name="android.permission.CAMERA" /> 权限,也在Activity中动态申请了Camera 权限,但是项目运行时其他权限会弹出授权对话框(比如 Android.permission.RECORD_AUDIO), 唯独 CAMERA 不弹出授权对话框, 动态授权回调方法里直接回调授权失败.
解决方法: 将AndroidManifest.xml 文件中的 CAMERA 权限给删除掉,重构项目,然后在添加权限.(这波操作真的很无语...)
************************************************************************************************************
4. CameraCaptureSession: Session 1: Failed to create capture session; configuration failed
camera2 录像时,配置createCaptureSession 总是回调 onConfigureFailed
mCameraDevice.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() { @Override public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) { mCaptureSession = cameraCaptureSession; setup3AControlsLocked(); // 最后,我们开始显示相机预览。 setRepeatingRequest(cameraCaptureSession); QLog.i( " startRecordingVideo 正式开始录制 "); c2p.activity.runOnUiThread(new Runnable() { @Override public void run() { mIsRecordingVideo = true; mMediaRecorder.start(); } }); } @Override public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) { QLog.e("开始录像 配置失败"); onc2.onErrorCallBack(2004, "开始录像 配置失败"); } }, mBackgroundHandler);
解决方案:
1.查看 MediaRecorder.setVideoSize(c2p.width, c2p.height); 录像设置的分辨率是否符合摄像头支持的分辨率
2.查看 texture.setDefaultBufferSize(Width(), tHeight()); texture设置的分辨率是否符合预览支持的分辨率
StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); map.getOutputSizes(MediaRecorder.class) 获取录像支持的分辨率集合 map.getOutputSizes(SurfaceTexture.class) 获取预览支持的分辨率集合