这篇博客是学习完 Google 员工的 zxing 开源项目后所写。如有不妥之处,欢迎留言,谢谢~
业内都说没有二维码扫描及生成的 APP,不是一个好的 APP,为了不掉队,学习了 Google 员工的 zxing 的开源项目。由于本人能力有限, zxing 项目实在超出了本人的范围,我只选取了 二维码扫描、解析及生成的代码。
前言
将二维码集成到 APP 中已经是一件在正常不过的事,所以我就不多介绍二维码的重要性那些了。直接开始吧~
演示
依我个人而言,我喜欢先看到效果,才有动力继续往下看。
zxing
项目地址:GitHub传送门
zxing 是一个开源 Java 类库用于解析多种格式的 1D/2D 条形码、二维码。目标是能够对 QR 编码、Data Matrix、UPC 的 1D 条形码进行解码。 其提供了多种平台下的客户端包括:Java SE 和 Android。
本博文将介绍:
1、扫描二维码:点击按钮,跳转到 zxing 中的 Activity 去扫描,并将得到的结果显示到 TextView
2、解析二维码:长按二维码,进行解析,并将二维码中的内容弹 Toast 提示
3、生成二维码:点击按钮,将 http://www.liuguangmingcn.com 生成二维码,并显示出来
zxing 的简单使用
为了方便使用,已将其抽取出来成一个 module
基于 zxing 3.2.1 的。可直接 import 到 项目中使用。lib_zxing 传送门
1.导入 lib_zxing
,设置为 module;
1
| compile project(':lib_zxing')
|
2.扫描二维码,核心代码
1 2 3 4 5 6 7 8 9 10
| private static final int REQUEST_CODE = 0; mBtnScan.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(MainActivity.this, CaptureActivity.class); startActivityForResult(intent, REQUEST_CODE); } });
|
tips:大家应该注意到了,这里使用了 startActivityForResult ,明显需要重写 onActivityResult,用于回到扫描得到的结果。
1 2 3 4 5 6 7 8 9 10 11
| @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { Bundle bundle = data.getExtras(); String scanResult = bundle.getString("result"); mTvScanResult.setText("扫描结果: " + scanResult); } }
|
3.生成二维码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| mBtnCreate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { try { * 第一个参数:内容 * 第二个参数:二维码图片的长宽(其实是正方形) */ Bitmap bitmap = QRCodeEncoder.encodeAsBitmap("http://www.liuguangmingcn.com", 500); mIvCreateBarcode.setImageBitmap(bitmap); } catch (WriterException e) { e.printStackTrace(); } } });
|
4.解析二维码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| private static final Map<DecodeHintType, ?> HINTS = new EnumMap<>(DecodeHintType.class); mIvCreateBarcode.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { mIvCreateBarcode.setDrawingCacheEnabled(true); Bitmap bitmap = Bitmap.createBitmap(mIvCreateBarcode.getDrawingCache()); mIvCreateBarcode.setDrawingCacheEnabled(false); decodeQRCode(bitmap); return true; } }); * 解析二维码.因为解析可能会耗时,所以使用了AsyncTask进行处理 * * @param bitmap 带解析的二维码图片 */ private void decodeQRCode(final Bitmap bitmap) { new AsyncTask<Void, Void, String>() { @Override protected String doInBackground(Void... params) { try { int width = bitmap.getWidth(); int height = bitmap.getHeight(); int[] pixels = new int[width * height]; bitmap.getPixels(pixels, 0, width, 0, 0, width, height); RGBLuminanceSource source = new RGBLuminanceSource(width, height, pixels); Result result = new MultiFormatReader().decode( new BinaryBitmap(new HybridBinarizer(source)), HINTS); return result.getText(); } catch (Exception e) { runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, "解析出错.", Toast.LENGTH_SHORT).show(); } }); return null; } }
|
zxing 中的二维码扫描、解析、生成的简单使用到此就结束了。
由于权限问题,需要将 targetSdkVersion
设置为低于 23。
项目地址
Demo传送门
lib_zxing 传送门
参考博文:
zxing源码分析——QR码部分
Android高级控件(三)—— 使用Google ZXing实现二维码的扫描和生成相关功能体系
作者简介:
刘广明(@cnLGMing),一步一步往上爬。
个人博客 、GitHub 、知乎
邮箱:liuguangmingcn@163.com
文章若有不对之处,欢迎指正,谢谢~
版权声明:原创作品,转载时请务必注明原始出处。