Camera2 开发问题记录

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 权限给删除掉,重构项目,然后在添加权限.(这波操作真的很无语...)

发布了44 篇原创文章 · 获赞 15 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/m0_37039192/article/details/83898628
今日推荐