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(/home/harm/6399013-6bf55a3d5c06b1f6.png)方法获取到二维码的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
2017-06-11
  目录