【Android】ZXing二维码扫描与生成

作者: 吾非言 | 来源:发表于2017-10-13 16:35 被阅读569次

    作者:邹峰立,微博:zrunker,邮箱:zrunker@yahoo.com,微信公众号:书客创作,个人平台:www.ibooker.cc

    本文选自书客创作平台第40篇文章。阅读原文

    书客创作

    二维码最早是由日本的一家公司定义的一种编码,它包括四角定位和中央编码等多部分组成。随着智能手机的普及,二维码也越来越受各种App的喜爱。而二维码的生成和扫描分析是一个非常复杂的过程,ZXing是谷歌公司的一个开源工程,非常方便的解决二维码的生成和扫描。

    ZXing使用

    先看一下最终效果图:

    最终效果图

    一、下载ZXing源码

    ZXing的github地址,Github上的源码太大,我这边提供一份,只征对于Android二维码扫描和生产的ZXing库3.1

    下载ZXing3.1库,是一个libzxing的Module文件。

    二、ZXing库导入工程

    下载下来的ZXing库文件,实际上是一个Module,这里以Android Studio2.2.3(简称AS)为例,说明如何导入工程。

    1、AS导入ZXing库Module

    点击File选择New选择Import Module...

    导入ZXing库Module1
    找到下载到本地的Zxing库,导入。 导入本地的Zxing库2
    导入成功工程变化,工程结构图。 工程结构图
    2、自己的工程引入Zxing库Module。 第一步 第二步 第三步
    这时候引入可能会出现下面的错误情况。 错误情况1
    解决办法:这种情况是指目前你的Android Studio Tools版本不支持libzxing中的版本,直接点击下载即可。 错误情况2
    解决办法:这种错误是指libzxing中最小版本为16,而在主工程中最小版本为15,所以在修改主工程build.gradle最小版本为16就好。 错误情况3
    解决办法:
    首先对比对比以下两张图,图一和图二。 libzxing清单文件 自己工程清单文件

    导入过程中可能会出现引入失败的情况。下载好的Zxing库版本与自己新建工程版本要一致,如果不一致可以手动进入自己的工程或者Zxing库工程AndroidManifest.xml修改版本。Application的设置也要一致,如果出现不一致也会引入Zxing失败,同样自己去修改清单文件AndroidManifest.xml。

    三、代码实现

    1、布局XML

    <?xml version="1.0" encoding="utf-8"?>  
    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"  
        android:layout_width="match_parent"  
        android:layout_height="match_parent"  
        android:background="#FFF"  
        android:scrollbars="none">  
    
        <LinearLayout  
            android:layout_width="match_parent"  
            android:layout_height="wrap_content"  
            android:orientation="vertical">  
    
            <TextView  
                android:id="@+id/tv_scan_result"  
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content"  
                android:padding="15dp"  
                android:text="显示扫描结果字符串" />  
    
            <Button  
                android:id="@+id/btn_scan_barcode"  
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content"  
                android:layout_gravity="center_horizontal"  
                android:layout_margin="10dp"  
                android:text="扫描二维码" />  
    
            <EditText  
                android:id="@+id/et_qr_string"  
                android:layout_width="match_parent"  
                android:layout_height="wrap_content"  
                android:inputType="text"  
                android:padding="15dp" />  
    
            <ImageView  
                android:id="@+id/iv_qr_image"  
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content"  
                android:layout_gravity="center"  
                android:contentDescription="@null"  
                android:padding="10dp"  
                android:src="@mipmap/ic_launcher" />  
    
            <CheckBox  
                android:id="@+id/logo"  
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content"  
                android:layout_margin="15dp"  
                android:text="是否显示logo(图片)" />  
    
            <Button  
                android:id="@+id/btn_add_qrcode"  
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content"  
                android:layout_gravity="center_horizontal"  
                android:layout_margin="10dp"  
                android:text="生成二维码" />  
    
        </LinearLayout>  
    </ScrollView>  
    

    在Activity界面当中初始化控件

    TextView resultTextView = (TextView) this.findViewById(R.id.tv_scan_result);  
    EditText qrStrEditText = (EditText) this.findViewById(R.id.et_qr_string);  
    ImageView qrImgImageView = (ImageView) this.findViewById(R.id.iv_qr_image);  
    CheckBox mCheckBox = (CheckBox) findViewById(R.id.logo);  
    Button scanBarCodeButton = (Button) this.findViewById(R.id.btn_scan_barcode);  
    Button generateQRCodeButton = (Button) this.findViewById(R.id.btn_add_qrcode);  
    

    2、扫描二维码

    在导入的ZXing库中,有一个CaptureActivity的页面,如果要扫描二维码启动该页面即可,如何接收该页面的回调值,就可以得到扫描出来的信息。

    // 打开扫描界面扫描条形码或二维码  
    Intent openCameraIntent = new Intent(MainActivity.this, CaptureActivity.class);  
    startActivityForResult(openCameraIntent, 0);  
    

    接收返回值

    @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");  
             resultTextView.setText(scanResult);  
         }  
    }  
    

    3、生成二维码

    对于生成二维码,目前支持两种样式,一种是没有logo的二维码,一种是有logo的二维码。

    String contentString = qrStrEditText.getText().toString();  
       if (!TextUtils.isEmpty(contentString)) {  
          // 根据字符串生成二维码图片并显示在界面上,第二个参数为图片的大小(350*350)  
          Bitmap qrCodeBitmap = EncodingUtils.createQRCode(contentString, 350, 350,mCheckBox.isChecked() ? BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher) : null);  
          qrImgImageView.setImageBitmap(qrCodeBitmap);  
       } else {  
          Toast.makeText(MainActivity.this, "Text can not be empty", Toast.LENGTH_SHORT).show();  
    }  
    

    要生成二维码需要借助于ZXing库中的EncodingUtils类中的createQRCode,该方法有四个参数,分别是String content, int widthPix, int heightPix, Bitmap logoBm。content表示上下文对象、widthPix表示生成二维码宽度以px为单位、heightPix表示生成二维码高度以px为单位、logoBm表示图标,如果不显示图片就设置其为null。

    注意:在扫描二维码的时候可能存在一个IO异常。
    这是因为在Android6.0+之后的版本调用照相机需要动态申请权限,否则无法启动相机。

    动态申请相机权限:

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            // 申请CAMERA权限
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 1);
    }
    

    权限申请结果处理:

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(1 == requestCode) {
             // todo 做相应的处理逻辑
        }
    }
    

    Github地址
    阅读原文


    微信公众号:书客创作

    相关文章

      网友评论

      • a8b570047034:扫描二维码的时候看到二维码都变形了 这个怎么弄
      • 8640e0afcca2:扫描二维码不成功!相机报错,displayFrameworkBugMessageAndExit()
        吾非言:@世界末末日 这是一个IO异常,在Android6.0+版本中,访问相机之前需要动态申请权限,你申请一下相机的权限就可以了。

      本文标题:【Android】ZXing二维码扫描与生成

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