2分钟教你做安卓单纯的二维码识别,不涉及实时取景扫描

原文章发表在 https://www.jianshu.com/p/fd26a83a9336 现在有了自己的静态博客,特意搬过来


本文的目的只有一个,在两分钟之内教你做二维码识别,不涉及任何相机方面的实时识别,或是长按识别。仅仅只是从图库选一张图片,然后做识别。

1. 最终效果如下:

最终效果

本文用到了Github上面一个开源库,QR Code decoding library written in Java
此库使用* GNU GENERAL PUBLIC LICENSE*协议,使用需要谨慎,发布的产品不能作为商业产品收费使用。

好了教程开始

2. 下载jar包

包的位置:

包的位置

然后把它粘贴到工程的libs目录下:

然后把它粘贴到工程的libs目录下

按Ctrl+Alt+Shift+S,打开Project Structure

选择添加jar包依赖:

选择添加jar包依赖

选中刚刚导入的包,然后OK:

选中刚刚导入的包,然后OK

这时候就能在app模块的build.gradle中看见所示的compile了,忽略上一步,直接在这里敲上这么一句也是可以的

compile files(‘libs/qrcode.jar’):

compile files('libs/qrcode.jar')

3. 同步gradle文件

在需要的地方,使用你喜欢的方式获取到需要识别的二维码图片

这里使用ButterKnife,您使用findViewById当然也是一样的啦~

使用ButterKnife获取一张QR图:

使用ButterKnife获取一张QR图

@OnClick(R.id.image_view_qr_code)
void loadQRCode() {
    Intent albumIntent = new Intent(Intent.ACTION_PICK);
    albumIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
    startActivityForResult(albumIntent, REQUEST_ALBUM);
}

在onActivityResult中处理获取来的图片

onActivityResult,通过data.getData()方法获取到二维码的Uri,交由ReadQRCodeTask去处理

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        case REQUEST_ALBUM:
            if (resultCode == RESULT_OK) {
                Log.i(TAG, "onActivityResult: " + data.toString());
                Uri uri = data.getData();
                mQrCodeImageView.setImageURI(uri);
                new ReadQRCodeTask().execute(uri);
            }
            break;
        default:break;
    }
    super.onActivityResult(requestCode, resultCode, data);
}

4. 适配类

用来做解码的适配,将Bitmap转化为一种QRCodeImage,做成内部类即可

这里还必须写一个类,用来做解码的适配,将Bitmap转化为一种QRCodeImage:

这里还必须写一个类,用来做解码的适配,将Bitmap转化为一种QRCodeImage

5. 异步的任务处理

new ReadQRCodeTask().execute(uri);

关于这个类的使用,详细参考AsyncTask | Android Developers,看完就会懂的,很实用。

如果不想看的话,我简单的说几句:
这个类的作用就是,“把事情分开做”,逻辑更清晰。在我们想要后台访问网络或是其他费事的操作的时候,更新UI用runOnUIThread的话,就会产生很多谜之tab,可读性较差,使用AsyncTask 可以有效避免这个问题,更有甚者,可以去了解一下RxJava、RxAndroid,这里不再赘述。

ReadQRCodeTask:

ReadQRCodeTask

private class ReadQRCodeTask extends AsyncTask<Uri, Void, String>{
    private static final String DECODE_FAILED = "decode_failed";
    private ProgressDialog progressDialog;
    @Override
    protected void onPreExecute() {
        progressDialog = new ProgressDialog(getContext());
          progressDialog.setTitle("识别中");
        progressDialog.setMessage(getString(R.string.reading_qr_code));
        progressDialog.show();
        progressDialog.setCanceledOnTouchOutside(false);
        progressDialog.setCancelable(false);
    }
    @Override
    protected String doInBackground(Uri... uris) {
        Bitmap bitmap = null;
        try {
            bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(),
                    uris[0]);
        } catch (IOException e) {
            e.printStackTrace();
        }
        QRCodeDecoder decoder = new QRCodeDecoder();
        byte[] qrCodeContent;
        try {
            qrCodeContent = decoder.decode(new Image(bitmap));
        }catch (DecodingFailedException e){
            return DECODE_FAILED;
        }
        return new String(qrCodeContent);
    }
    @Override
    protected void onPostExecute(String s) {
        progressDialog.dismiss();
        Log.i(TAG, "onPostExecute: 读取结果是:"+s);
        if (s.equals(DECODE_FAILED)){
            Toast.makeText(getContext(), R.string.read_failed, Toast.LENGTH_SHORT).show();
            return;
        }
        mIdCodeEditText.setText(s.substring(s.lastIndexOf("/")+1));
        Toast.makeText(getContext(), R.string.read_succeed, Toast.LENGTH_SHORT).show();
    }
}

   转载规则


《2分钟教你做安卓单纯的二维码识别,不涉及实时取景扫描》 Harbor Zeng 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
MySQL如何按表创建千万级的测试数据,进行数据库压力测试和练习 MySQL如何按表创建千万级的测试数据,进行数据库压力测试和练习
原文章发表在 https://www.jianshu.com/p/10791343e67a 现在有了自己的静态博客,特意搬过来 1. 前言 笔者采用Intellij IDEA内置的数据库模块进行操作,也推荐大家使用专业点的IDE来操作数据库,通过命令行是很痛苦的。但是您要用命令行来操作以下内容,也是可以的,我会尽量照顾到您的使用习惯,但是不保证代码都能执行无误。 在学习完数据库及SQL的知识
2017-09-23
下一篇 
android跳转到MIUI神隐模式详细设置界面 android跳转到MIUI神隐模式详细设置界面
原文章发表在 https://www.jianshu.com/p/6f6258902d56 现在有了自己的静态博客,特意搬过来 发这篇文章的原因是因为,最近在研究MIUI后台如何保活。 传统做法public void openBigGodMode(View v){ Intent intent = new Intent(); intent.setComponent(new Comp
2017-06-11
  目录