二维码生成、扫描、图片识别(Zxing)

这样的例子虽然已经很多了,不过我在网上浏览了一圈,也没找到几个图库二维码图片识别例子,好的算法识别率才高。这里有一个好点的算法,算法不是我写的,只是作为整理记录,给众多安卓开发者一个方便。demo的UI有点low,不过功能却是实实在在,有需要的朋友可以自定义一些UI界面。我写demo得时候就不费那劲了。

看看截图功能。


点击生成二维码,传入一个字符串,生成相应的二维码。


生成二维码返回的是一个bitmap,很好处理,简单实用。点击开始扫描


进入扫描界面,右上角有两个按钮,一个是打开手机闪光灯,一个是手机相册选取图片解析。

只要扫描成功,就会有一个回调接口,在回调接口做相应处理。下面的图片是扫描成功和图片解析成功回调的界面。


功能介绍的差不多了,看看代码。首先导入Zxing 的gradle

//二维码扫描、识别、生成
    compile 'com.google.zxing:core:3.2.1'

然后在git上下载源码demo,取其中的QRlibrary的文件夹,导入你的项目。



点击确定,然后等待编译就ok了。之后再建立你的项目与QRlibrary的依赖。



选择了Module依赖之后,选择QRlibrary,确定之后等待编译。在你的项目中创建一个类QRScanActivity(这里是创建一个类,而不是Activity,当然也要在application中注册,只是不需要创建xml文件)继承QRCode2ScanActivity,重写以下方法即可。handleDecode是二维码扫描成功回调接口,扫描成功之后在这里写之后的逻辑。


图片解析成功回调的方法,也就是onActivityResult,当然还必须调用解析的方法。


图片解析逻辑单独贴出来

                    String[] proj = { MediaStore.Images.Media.DATA };
                    // 获取选中图片的路径
                    Cursor cursor = getContentResolver().query(data.getData(),
                            proj, null, null, null);

                    if (cursor.moveToFirst()) {

                        int column_index = cursor
                                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                        photo_path = cursor.getString(column_index);
                        if (photo_path == null) {
                            photo_path = Utils.getPath(getApplicationContext(),
                                    data.getData());
                            Log.i("123path  Utils", photo_path);
                        }
                        Log.i("123path", photo_path);
                    }

                    cursor.close();

                    new Thread(new Runnable() {

                        @Override
                        public void run() {

                            Result result = scanningImage(photo_path);
                            // String result = decode(photo_path);
                            if (result == null) {
                                Log.i("123", "   -----------");
                                Looper.prepare();
                                Toast.makeText(getApplicationContext(), "图片格式有误",Toast.LENGTH_SHORT)
                                        .show();
                                Looper.loop();
                            } else {
                                Log.i("tag00", result.toString());
                                // Log.i("123result", result.getText());
                                // 数据返回
                                String recode = recode(result.toString());
                                startActivity(new Intent(QRScanAtivity.this,ResultActivity.class).putExtra("result", recode));
                                finish();
                            }
                        }
                    }).start();
这段代码需要在onActivityResult中调用。

我在我的项目中导入library之后,创建了一个QRScanActivity,粘出所有逻辑

public class QRScanAtivity extends QRCode2ScanActivity {

    private static final int REQUEST_CODE = 234;
    private String photo_path;
    @Override
    public void handleDecode(Result rawResult, Bundle bundle) {
        super.handleDecode(rawResult, bundle);
        //扫描成功,回调的方法
        inactivityTimer.onActivity();

        bundle.putString("result", rawResult.getText());

        startActivity(new Intent(QRScanAtivity.this, ResultActivity.class).putExtras(bundle));
        finish();
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK) {

            switch (requestCode) {

                case REQUEST_CODE:

                    String[] proj = { MediaStore.Images.Media.DATA };
                    // 获取选中图片的路径
                    Cursor cursor = getContentResolver().query(data.getData(),
                            proj, null, null, null);

                    if (cursor.moveToFirst()) {

                        int column_index = cursor
                                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                        photo_path = cursor.getString(column_index);
                        if (photo_path == null) {
                            photo_path = Utils.getPath(getApplicationContext(),
                                    data.getData());
                            Log.i("123path  Utils", photo_path);
                        }
                        Log.i("123path", photo_path);
                    }

                    cursor.close();

                    new Thread(new Runnable() {

                        @Override
                        public void run() {

                            Result result = scanningImage(photo_path);
                            // String result = decode(photo_path);
                            if (result == null) {
                                Log.i("123", "   -----------");
                                Looper.prepare();
                                Toast.makeText(getApplicationContext(), "图片格式有误",Toast.LENGTH_SHORT)
                                        .show();
                                Looper.loop();
                            } else {
                                Log.i("tag00", result.toString());
                                // Log.i("123result", result.getText());
                                // 数据返回
                                String recode = recode(result.toString());
                                //解析成功之后,recode是解析成都的字符串,这里对其做数据处理
                                startActivity(new Intent(QRScanAtivity.this,ResultActivity.class).putExtra("result", recode));
                                finish();
                            }
                        }
                    }).start();
                    break;

            }

        }
    }
}
二维码生成,扫描还有图片解析,运用就是这些了。具体源码逻辑就不细谈了。我把源码放在git上,有兴趣想要了解是如何实现的朋友,那就自己去看源码吧。

项目地址:https://github.com/SingleShu/QRScanLibrary

#如果觉得有用,请帮忙点顶一下,谢谢。


  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值