美文网首页androidAndroid开发Android开发
二维码认识及Android快速接入

二维码认识及Android快速接入

作者: 奔跑吧李博 | 来源:发表于2018-02-22 18:03 被阅读514次

    什么是二维码?

    二维码又称QR Code,QR全称Quick Response。是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的;

    二维码是一种比一维码更高级的条码格式。一维码只能在一个方向(一般是水平方向)上表达信息,而二维码在水平和垂直方向都可以存储信息。一维码只能由数字和字母组成,而二维码能存储汉字、数字和图片等信息,因此二维码的应用领域要广得多。

    常用功能

    • 信息获取(名片、地图、WIFI密码、资料)
    • 网站跳转(跳转到微博、手机网站、网站)
    • 广告推送(用户扫码,直接浏览商家推送的视频、音频广告)
    • 手机电商(用户扫码、手机直接购物下单)
    • 防伪溯源(用户扫码、即可查看生产地;同时后台可以获取最终消费地)
    • 优惠促销(用户扫码,下载电子优惠券,抽奖)
    • 会员管理(用户手机上获取电子会员信息、VIP服务)
    • 手机支付(扫描商品二维码,通过银行或第三方支付提供的手机端通道完成支付)
    更专业的讲解来自于一位知乎的朋友(https://www.zhihu.com/question/28062200)

    demo代码直通车

    制作效果:
    giphy.gif
    来自哪个库?

    二维码使用功能在我们App中使用相当常见。本文章推荐使用库android-zxingLibrary

    使用步骤:

    1. 引用库
    compile 'cn.yipianfengye.android:zxing-library:2.2'
    
    1. 在项目Application类的onCreate方法中初始化
    ZXingLibrary.initDisplayOpinion(this);
    
    1. 生成二维码图片方式,createImage()方法最后一个参数传图片就让二维码带有图标。
                    String codeStr = etInput.getText().toString();
                    Bitmap bitmap = CodeUtils.createImage(codeStr,200,200,null);
                    ivShow.setImageBitmap(bitmap);
    
    1. 启动默认扫描界面,启动库自带CaptureActivity类:
                    Intent intent = new Intent(MainActivity.this, CaptureActivity.class);
                    startActivityForResult(intent,REQUEST_CODE);
    
    1. 在Activity的onActivityResult方法中接收扫描结果
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
    
            if(requestCode == REQUEST_CODE){
                if(null != data){
                    Bundle bundle = data.getExtras();
                    if(bundle == null){
                        return;
                    }
    
                    if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_SUCCESS) {
                        String result = bundle.getString(CodeUtils.RESULT_STRING);
                        Toast.makeText(this, "解析结果:" + result, Toast.LENGTH_LONG).show();
                    } else if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_FAILED) {
                        Toast.makeText(MainActivity.this, "解析二维码失败", Toast.LENGTH_LONG).show();
                    }
                }
            }
        }
    

    默认扫描界面样式:


    image.png

    自定义扫描界面,创建MyCaptureActivity类。

    1. 初始化CaptureFragment类,是该库自带的扫描的Fragment。
        private void init() {
            CaptureFragment captureFragment = new CaptureFragment();
            //定制化扫描框UI
            CodeUtils.setFragmentArgs(captureFragment,R.layout.view_qrcode_scan);
            //分析结果回调
            captureFragment.setAnalyzeCallback(analyzeCallback);
            getSupportFragmentManager().beginTransaction().replace(R.id.fl_scan,captureFragment).commit();
        }
    
    CaptureFragment代码
    1. 定制化UI view_qrcode_scan.xml布局:
    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
    
        <SurfaceView
            android:id="@+id/preview_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    
        <com.uuzuche.lib_zxing.view.ViewfinderView
            android:id="@+id/viewfinder_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:inner_width="250dp"
            app:inner_height="250dp"
            app:inner_margintop="130dp"
            app:inner_corner_color="#fff"
            app:inner_corner_length="30dp"
            app:inner_corner_width="4dp"
            app:inner_scan_speed="12"
            app:inner_scan_iscircle="false" />
    
    </FrameLayout>
    

    扫描框自定义属性:

    <declare-styleable name="innerrect">
            <attr name="inner_width" format="dimension"/><!-- 控制扫描框的宽度 -->
            <attr name="inner_height" format="dimension"/><!-- 控制扫描框的高度 -->
            <attr name="inner_margintop" format="dimension" /><!-- 控制扫描框距离顶部的距离 -->
            <attr name="inner_corner_color" format="color" /><!-- 控制扫描框四角的颜色 -->
            <attr name="inner_corner_length" format="dimension" /><!-- 控制扫描框四角的长度 -->
            <attr name="inner_corner_width" format="dimension" /><!-- 控制扫描框四角的宽度 -->
            <attr name="inner_scan_bitmap" format="reference" /><!-- 控制扫描图 -->
            <attr name="inner_scan_speed" format="integer" /><!-- 控制扫描速度 -->
            <attr name="inner_scan_iscircle" format="boolean" /><!-- 控制小圆点是否展示 -->
        </declare-styleable>
    
    1. analyzeCallback是我们定义的扫描回调函
        CodeUtils.AnalyzeCallback analyzeCallback = new CodeUtils.AnalyzeCallback() {
            @Override
            public void onAnalyzeSuccess(Bitmap mBitmap, String result) {
                Intent resultIntent = new Intent();
                Bundle bundle = new Bundle();
                bundle.putInt(CodeUtils.RESULT_TYPE, CodeUtils.RESULT_SUCCESS);
                bundle.putString(CodeUtils.RESULT_STRING, result);
                resultIntent.putExtras(bundle);
                setResult(RESULT_OK, resultIntent);
                finish();
            }
    
            @Override
            public void onAnalyzeFailed() {
                Intent resultIntent = new Intent();
                Bundle bundle = new Bundle();
                bundle.putInt(CodeUtils.RESULT_TYPE, CodeUtils.RESULT_FAILED);
                bundle.putString(CodeUtils.RESULT_STRING, "");
                resultIntent.putExtras(bundle);
                setResult(RESULT_OK, resultIntent);
                finish();
            }
        };
    

    好了,打完收工。

    相关文章

      网友评论

      本文标题:二维码认识及Android快速接入

      本文链接:https://www.haomeiwen.com/subject/ldzbtftx.html