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

************************************************************************************************************

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) 获取预览支持的分辨率集合

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值