基于Google ZXing库的Android二维码解析/生成

这几天心血来潮突然想看看二维码怎么实现的,就顺便整理了看看
核心部分的是Google Zxing这样一个库,里面写好了所有识别二维码以>及生成二维码的所有算法。

1.该开源项目的github地址为:Google ZXing,当然了库本身代码很多,有人已经做了一些简化抽出了其中核心的扫码、解码功能,地址为:ZXingLib

2.笔者是以ZXingLib为基础,通过从上个github链接下载到文件后就是这样了,可以看到app/libs里面有个zxing.jar,然后还有一个libzxing里面有相关的各种工具类,就不细说了

这里写图片描述

3.当然了,可以直接把这个工程导入android studio,但是笔者考虑的是只把该功能加到原有的app功能上,但是这种资料太少,找到的方法基本都是以原有的项目作为库,笔者喜欢简洁纯净的自己建的项目,索性自己新建了android项目,具体如下

4.首先,将前面提过的jar文件添加到libs中,怎样在android中导入jar包,我就不细说了,自己百度。然后一点就是把下载到的app/src/java。到底。里面的mainacvity代码复制过来,顺带改改布局文件,这里为了学习起见就没有做修改

5.当然如果这就好了的话,我就懒得写个博客了,很明显的发现有好多导入包找不到,没错!这就是libzxing的作用,会发现libzxing的文件夹末尾有四个文件夹都有代码,问题就在这,因为jar包没有这些,索性跟libzxing里面src/main/java里面的包名一直,在自己的项目中新建个这样的包,然后代码复制过来,其实可以整个文件夹的复制,轻松得很,不重要。

5.还剩下一点点小问题,就是复制来的代码肯定也会报错,找不到activity的布局文件,找不到图片,找不到id什么的,就缺什么补什么,修修改改些明显的小问题,都复制过来,比较容易。还有就是需要在Androidmanifest中注册用到的activity,加个权限,比如调用摄像头,震动等,后面留有我的代码,所以说的简单。

6.改完之后就基本可以运行了,直接上图:

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

7.其实主体来说,使用这个库的流程是这样:扫码的时候startActivityForResult启动库里扫码的activity,把结果返回后自己处理显示。解码就是把字符串用工具处理后得到的二维码图片显示出来。非常方便,核心代码如下:

startActivityForResult(new Intent(this, CaptureActivity.class),0);//扫码

Bitmap qrCode = EncodingUtils.createQRCode(input, 500, 500,
                    mCheckBox.isChecked()? BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher):null);//生成

8.笔者当然不满足于此,很明显实际上好多二维码扫描完了链接都会跳转,这不难实现,只要判断返回的字符串是链接,就自己写个跳转,笔者就写的很简单,直接把返回的字符串当链接,当然了我肯定扫的二维码就是链接,不然怎么测试。代码和效果如下:

mTextView.setText(result);//这是为了在文本中显示
Uri webViewUri = Uri.parse(result);
                Intent intent = new Intent(Intent.ACTION_VIEW, webViewUri);
                startActivity(intent);//显示完顺便做个跳转

这里写图片描述

这里写图片描述

这里写图片描述

9.顺便一提,android中跳转还有好多,打电话的,发短信的。整理如下:

// 调用浏览器  
Uri webViewUri = Uri.parse("http:...//");  
Intent intent = new Intent(Intent.ACTION_VIEW, webViewUri);  

// 调用地图  
Uri mapUri = Uri.parse("geo:100,100");  
Intent intent = new Intent(Intent.ACTION_VIEW, mapUri);  

// 播放mp3  
Uri playUri = Uri.parse("file:///sdcard/test.mp3");  
Intent intent = new Intent(Intent.ACTION_VIEW, playUri);  
intent.setDataAndType(playUri, "audio/mp3");  

// 调用拨打电话  
Uri dialUri = Uri.parse("tel:10086");  
Intent intent = new Intent(Intent.ACTION_DIAL, dialUri);  
// 直接拨打电话,需要加上权限<uses-permission id="android.permission.CALL_PHONE" />  
Uri callUri = Uri.parse("tel:10086");  
Intent intent = new Intent(Intent.ACTION_CALL, callUri);  

// 调用发邮件(这里要事先配置好的系统Email,否则是调不出发邮件界面的)  
Uri emailUri = Uri.parse("mailto:zuolongsnail@163.com");  
Intent intent = new Intent(Intent.ACTION_SENDTO, emailUri);  
// 直接发邮件  
Intent intent = new Intent(Intent.ACTION_SEND);  
String[] tos = { "zuolongsnail@gmail.com" };  
String[] ccs = { "zuolongsnail@163.com" };  
intent.putExtra(Intent.EXTRA_EMAIL, tos);  
intent.putExtra(Intent.EXTRA_CC, ccs);  
intent.putExtra(Intent.EXTRA_TEXT, "the email text");  
intent.putExtra(Intent.EXTRA_SUBJECT, "subject");  
intent.setType("text/plain");  
Intent.createChooser(intent, "Choose Email Client");  

// 发短信  
Intent intent = new Intent(Intent.ACTION_VIEW);  
intent.putExtra("sms_body", "the sms text");  
intent.setType("vnd.android-dir/mms-sms");  
// 直接发短信  
Uri smsToUri = Uri.parse("smsto:10086");  
Intent intent = new Intent(Intent.ACTION_SENDTO, smsToUri);  
intent.putExtra("sms_body", "the sms text");  
// 发彩信  
Uri mmsUri = Uri.parse("content://media/external/images/media/23");  
Intent intent = new Intent(Intent.ACTION_SEND);  
intent.putExtra("sms_body", "the sms text");  
intent.putExtra(Intent.EXTRA_STREAM, mmsUri);  
intent.setType("image/png");  

// 卸载应用  
Uri uninstallUri = Uri.fromParts("package", "com.app.test", null);  
Intent intent = new Intent(Intent.ACTION_DELETE, uninstallUri);  
// 安装应用  
Intent intent = new Intent(Intent.ACTION_VIEW);  
intent.setDataAndType(Uri.fromFile(new File("/sdcard/test.apk"), "application/vnd.android.package-archive");  

// 在Android Market中查找应用  
Uri uri = Uri.parse("market://search?q=愤怒的小鸟");           
Intent intent = new Intent(Intent.ACTION_VIEW, uri);  

最后把代码留下,里面附有可运行的apk,留作参考,可用做二次开发,有问题可留言–>Link

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值