让你的APP轻松加上扫描二维码功能

在这个二维码横行的年代,如果一个APP连扫描二维码的功能都没有是会被耻笑的。今天小老虎教小白们如何为自己的APP添加扫描二维码功能和生成二维码,并做到外部扫描跳转网页,内部扫描跳转具体Activity。


1.准备好ZXING包

ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口。Zxing可以实现使用手机的内置的摄像头完成条形码的扫描及解码。Zxing库的主要部分支持以下几个功能:核心代码的使用、适用于J2SE客户端的版本、适用于Android客户端的版本(即BarcodeScanner)、Android的集成(通过Intent支持和BarcodeScanner的集成)等。
本人用的是AndroidStudio,所以只要简单地远程依赖下载就OK了,也可以选择和eclipse一样用导入第三方类库。导包不会的话请自行百度一下,这里就不一一科普了。

2.生成二维码

1.仅供APP内部使用的二维码
只供内部使用的话只要简单的内容去区分不同用户和不同内容就好,举个栗子:
比如说我要内部扫描添加好友,我就用一个“user”和userID来形成二维码就好了,我们用zxing提供的EncodingHandler.createQRCode方法生成一张二维码(返回的是bitmap),第一个参数是要形成二维码的字符串,第二个参数是二维码的长度(它的鞭长= = )。

Bitmap qrCodeBitmap = EncodingHandler.createQRCode("http://qrcode/user/"+info.userID, 450);

2.可供微信,QQ等APP扫描跳转网页,也可以进行内部跳转
这个直接用你要跳转的网页的url生成二维码就OK,这样外部扫描就直接跳到那个网页了,那内部呢?我们下面会说到!

3.扫描二维码和内部进行页面跳转

1.扫描二维码
这里的扫描直接跳到zxing包下的CaptureActivity,里面的handleDecode方法会有一个参数rawResult,这个就是扫描所获取的信息,只要调用rawResult.getText就可以得到扫描所得的字符串。这里我做了一些处理,把得到的字符串用setResult发出去,一会再说怎么处理,先贴一波代码

 @Override
    public void handleDecode(Result rawResult, Bundle bundle) {
        super.handleDecode(rawResult, bundle);
        String resultString = rawResult.getText();
        KLog.d("scann result: " + resultString);

        if (resultString.equals("")) {
            Toast.makeText(CaptureActivity.this, "扫描失败", Toast.LENGTH_SHORT).show();
        } else{
            Intent resultIntent = new Intent();
            Bundle data = new Bundle();
            data.putString("result", resultString);
            resultIntent.putExtras(data);
            this.setResult(RESULT_OK, resultIntent);

        }
        CaptureActivity.this.finish();
    }

2.判断并跳转
我们在MainActivity重写onActivityResult方法,在这里进行处理跳转。
刚才我们生成app内部二维码最后是“/+id”,那么我们先把最后一个“/”后面的id拿到手,像这样:

  //解析是否扫描用户的二维码
            id = Long.valueOf(scanResult.substring(scanResult.lastIndexOf('/') + 1));

然后我们再用URI的 Uri.parse把服务器返回的url转成uri,再获取是否含有特定字段,有的话再获取其id,无论是跳转外部还是跳转内部,只要先判断字符串是否含有key就OK了,下面是方法的完整代码

 private void handleScanResult(String scanResult) {
        if (StringUtils.isEmpty(scanResult)) {
            return;
        }

        long id = 0;
        try {
            //解析是否扫描用户的二维码
            id = Long.valueOf(scanResult.substring(scanResult.lastIndexOf('/') + 1));
        } catch (NumberFormatException formatException) {
            try {
                //解析是否跳转网页二维码
                Uri url = Uri.parse(scanResult);
                if ("club_detail".equals(url.getQueryParameter("qrcode_type"))) {
                    String clubId = url.getQueryParameter("clubId");
                    id = Long.parseLong(clubId);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        if (id == 0) {
            return;
        }
 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (resultCode == RESULT_OK) {
            switch (requestCode) {
                case MainMeTabFragment.KEY_REQUEST_CODE:
                    Bundle bundle = data.getExtras();
                    String scanResult = bundle.getString("result");
                    //处理二维码
                    handleScanResult(scanResult);
                default:
                    break;
            }
        } 

这次的内容就到此结束了,如果想要这部分完整代码的请在评论留下邮箱,我重新写一份完整的Demo发给有需要的朋友 o(∩_∩)o

评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值