Android--自定义扫码功能,调用ZXing3.1

ZXing3.1的使用(限制最低版本19,即android4.4)


转载请声明地址:http://blog.csdn.net/skyunicorn/article/details/52274603


参考资料:http://blog.csdn.net/eclipsexys/article/details/47834865(我没看文章,直接下的源码自己边运行边分析的)


官方的Demo是写好了一个CaptureActivity提供回调,从自己的页面跳到CaptureActivity,扫描后把数据传回自己的页面(一次只能扫码一条)。

但是我们项目想做到一个自定义扫码布局,并实现类似扫码枪的效果,即在当前页面连续扫码,且在当前页面有所反馈。



  1. 导入
将zxing.jar放在app的libs下,并右键aslibrary
新建一个将zxing文件放入根目录
导入需要的资源文件ids.xml、activity_capture、qr_code_bg.9.png、scan_line.png、shadow.png、res底下raw文件夹

注册权限
android :name= "android.permission.CAMERA" />
android :name= "android.permission.VIBRATE" />

注册activity
< activity   android :name= ".zxing.activity.CaptureActivity" />


  1. 使用


主要用到的几个类
CaptureActivity:扫码页面

CameraManager:处理Activity的消息机制

CameraConfigurationManager:该类主要负责设置相机的参数信息

DecodeFormatManager:设置扫码的种类


修改:
布局文件就不说了,修改成自己想要的样子,和原文件有一点不同的是,将SurfaceView设置到根布局下,设置layout_height为match_parent(不这么修改,会导致变形,因为预览用的是屏幕分辨率的宽高)。其他的想怎么改就这么改了。

CaptureActivity文件:

handleDecode()方法中,把页面跳转的语句删除,设置为加载数据(这里我为了方便只设置了一个Textview加载数据,可以换成listview)

initCrop()方法中,原算法为
int x = cropLeft * cameraWidth / containerWidth;
int y = cropTop * cameraHeight / containerHeight;
int width = cropWidth * cameraWidth / containerWidth;
int height = cropHeight * cameraHeight / containerHeight;
在这我没弄懂原作者的意思,这算法在全屏没有问题,但是自定义的时候,由于调用的cameraHeight是屏幕的分辨率,而containerHeight是布局高度,会导致扫码框范围变形(布局是看不出来的,看打印日志计算就知道了)。
修改为:
int x = cropLeft;
int y = cropTop;
int width = cropWidth;
int height = cropHeight;

CameraConfigurationManager文件:

设置预览效果:搜索parameters.setPreviewSize


CaptureActivityHandler文件:

原作者是扫码一次后就不继续扫码,这里我们做个修改。
设置一个线程,控制扫码间隔(否则会连续扫码,不合适),这里我设置的是间隔2s

// 设置扫码间隔
class MyThread extends Thread
{
    @Override
    public void run()
    {
        super.run();
        try
        {
            MyThread.sleep(2000);
            cameraManager.requestPreviewFrame(decodeThread.getHandler(), R.id.decode);

        } catch (InterruptedException e)
        {
            e.printStackTrace();
        }
    }
}

然后在handleMessage()的message.what == R.id.decode_succeeded下面修改

添加
new MyThread().start() ;
这样我们就可以每隔2s扫码一次了

最后我们要的效果就实现了,这个功能虚拟机没法做测试,各位下载Demo自己演示吧。


Demo地址:http://download.csdn.net/detail/skyunicorn/9609334

参考资料的库:https://github.com/xuyisheng/ZXingLib

大家可以对比着看。




你可能感兴趣的:(Android-Demo大全)