最近看了一款"我查查”的应用,看它里面的那个扫描界面做的蛮好的,还有一个开灯的效果;于是乎,自己就像尝试着做一个,一开始总是会出问题的,不过功夫不负有心人,最后总算被我搞出来了。
“我查查”效果图:
我自己改的效果图:
因为是豌豆荚截的图,所以看不到扫描效果,大家可以下载源码看。
开始正题。一开始的时候,我从新声明了一个Camera对象,然后按照正常的逻辑打开camera.open(),打开LED灯,关灯等等。但是这样会报错的:
出现这样的问题的原因是:系统只有一个Camera对象,我再重新声明一个Camera对象的话,当然会报错,这是我犯错误比较严重的地方,果然还是应该先细读一下Zxing的源码啊!
解决方法:因为Zxing扫描启动的时候已经初始化了一个Camera对象了,所以没有必要再重新声明一个对象。
这个初始方法是在CameraManager类里面,大家可以去看下。到了这里问题已经解决一半了,只要我们在CameraManager里面添加一个获取camera对象的方法就行,然后你在CaptureActivity里面调用那个方法来获取已经打开的camara,最后设置一下开灯,关灯一些相关属性就OK了。
开灯、关灯的关键代码,这个百度也能搜到的,记得要添加相关权限:
/**
* 开灯
*/
private OnClickListener openListener = new OnClickListener() {
@Override
public void onClick(View v) {
camera = CameraManager.getCamera();
parameter = camera.getParameters();
// TODO 开灯
if (isOpen) {
btnOpen.setText("关灯");
parameter.setFlashMode(Parameters.FLASH_MODE_TORCH);
camera.setParameters(parameter);
isOpen = false;
} else { // 关灯
btnOpen.setText("开灯");
parameter.setFlashMode(Parameters.FLASH_MODE_OFF);
camera.setParameters(parameter);
isOpen = true;
}
}
};
不过,程序写到这里还并没有结束,运行以后,发现可以开灯了,但是关灯以后还是会报错的。报什么错呢?看下面:
大家一看应该知道是什么问题了,不知道的话百度一下吧:http://www.eoeandroid.com/thread-113332-1-1.html可以去看看这里。
人家给的解决方案是:
public void surfaceDestroyed(SurfaceHolder holder) {
camera.setPreviewCallback(null) ;
camera.stopPreview();
camera.release();
camera = null;
}
我试了,可以关灯了,但是退出应用的时候还是报错了,我想是不是在OnDestory()里面也加上这句话,结果运行还是不行。最后想了一想,我调用的不是CameraManager里面的初始化方法吗?然后再回过头来看这个类,发现里面已经写好了桌面销毁Camera对象的方法了:
/**
* Tells the camera to stop drawing preview frames.
*/
public static void stopPreview() {
if (camera != null && previewing) {
if (!useOneShotPreviewCallback) {
camera.setPreviewCallback(null);
}
camera.stopPreview();
previewCallback.setHandler(null, 0);
autoFocusCallback.setHandler(null, 0);
previewing = false;
}
}
于是乎,我就在surfaceDestroyed里面调用了这个stopPreView()这个方法,运行之后果断不报错了。到这里为止,给二维码扫描加开灯的功能就真的大功告成了。目前测试还没有发现扫描问题,如果以后大家发现了问题,希望能一起探讨。
最后给大家分享一些关于Zxing二维码扫描的资源,个人觉得写的真不错,里面还有一些延伸的知识,楼主真的很细心啊!
地址:http://www.cnblogs.com/liuan/archive/2012/01/05/2312714.html,希望能给大家有帮助。
不好意思,打个广告,欢迎加入技术交流群6668958,游戏、应用等。