摄像头SDK开发笔记

一、画面属性
主要有以下属性:brightness(亮度)、contrast(对比度)、saturation(饱和度)、gamma(伽玛校正)、gain(增益)、hue(色调)、powerlineFrequency(电力线频率)
开发时使用seekbar调整数值,但是seekbar只有max属性,没有min属性,所以采用一个偏差值来纠正取值范围,例如色调的set方法中的取值范围是-45到+45,那么把seekbar的最大值设为90,然后取值时采用 seekbar.getProgress()-45 的方法,使最终数值控制在标准范围。

二、遇到的问题:
1、java.lang.RuntimeException: takePicture failed
参考:https://blog.csdn.net/huashuke/article/details/78676572
原因:短时间重复拍照
解决:

private boolean isOnPictureTaken= false;

if (isOnPictureTaken) { 
  camera.takePicture(null, null, mPicture); 
  isOnPictureTaken= false;
}

在PictureCallback回调方法中的,isOnPictureTaken= true;

2、扫描二维码,第一次安装时,可以顺利获取到handler返回的值,但是之后就无法顺利解析二维码
原因:扫描摄像头所需要的surfaceview、surfaceholder和相关线程没有按正确顺序释放关闭。
解决:
目的需求是,打开摄像头不是另起一个activity,而是作为主界面启动,并且扫描后跳转到显示扫描效果的一个fragment,所以要根据现有的zxing库再改写一个CaptureFragment类
改写时主要需要解决两个问题:
(1)获取当前的view,用于findViewById绑定控件
SurfaceView surfaceView = getView().findViewById(R.id.capture_preview_view);
(2)获取当前fragment所在的activity用于改写DecodeHandler和DecodeThread
fragment.getActivity();
(3)注意Activity和Fragment的生命周期
摄像头SDK开发笔记_第1张图片
surfaceView和surfaceHolder的对象可以在onPause()中关闭,线程可以在onDestroyView()中关闭。activity的onDestroy方法中要确保fragment中所有摄像头对象全部销毁,以免发生内存泄漏,影响摄像头再次打开。
由于扫描验证商标是该项目的重要功能,所以跳转到下一个fragment时,我没有直接关闭摄像头,
由于surfaceView和surfaceHolder的对象是局部变量,所以在显示商标的返回页面中,设置了一个回调方法,用于提醒activity重新打开预览captureFragment.restartPreviewAfterDelay(0);这个方法需要在放在延迟一秒以上的线程中,以免重复代开摄像头造成framework层出错。

你可能感兴趣的:(c++,摄像头,java,android)