Android Zxing框架 生成二维码+扫码功能

zxing是一个二维码的框架。

配置

1、
在这里插入图片描述implementation 'com.journeyapps:zxing-android-embedded:4.1.0'
如果报错在这个文件的android下加上如下配置,让其支持Java1.8,不然只有1.7、1.6
(可在'app'右键---->open module settings------>Module看到)

compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

2、
在这里插入图片描述
<uses-sdk tools:overrideLibrary="com.google.zxing.client.android" /> <uses-permission android:name="android.permission.CAMERA"/>

记得点击Sync Now

生成二维码

步骤:
1、自定义一个负责生成二维码的类,方便调用,返回一个Bitmap

要点:利用Zxing中的 BarcodeEncoderencodeBitmap方法

public Bitmap encodeBitmap(String contents, BarcodeFormat format, int width, int height, Map<EncodeHintType, ?> hints) throws WriterException

encodeBitmap方法

参数内容
contents码的内容
format码的类型(二维码、条形码…)
width码的宽度
height码的高度
hints码的额外参数

Map<EncodeHintType, ?> hints码的额外参数
这里列举了一些常用的
这些都是Zxing中定义好的

参数内容
EncodeHintType.ERROR_CORRECTION设置容错率 L>M>Q>H 等级越高扫描时间越长,准确率越高
EncodeHintType.CHARACTER_SET设置字符集
EncodeHintType.MARGIN设置边距

QRcode类

package com.example.xianyu;
import android.graphics.Bitmap;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.journeyapps.barcodescanner.BarcodeEncoder;
import java.util.HashMap;
import java.util.Map;

public class  QRcode{
   public Bitmap qrcode(String content){
    int width = 400;
    int height = 400;
       //HashMap设置二维码参数
       Map map = new HashMap();
       //   设置容错率 L>M>Q>H  等级越高扫描时间越长,准确率越高
       map.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
       //设置字符集
       map.put(EncodeHintType.CHARACTER_SET,"utf-8");
       //设置外边距
       map.put(EncodeHintType.MARGIN,1);
       //利用编码器,生成二维码
       BarcodeEncoder barcodeEncoder = new BarcodeEncoder();
       Bitmap bitmap = null;
       try {
           bitmap = barcodeEncoder.encodeBitmap(content, BarcodeFormat.QR_CODE, width, height,map);
       } catch (WriterException e) {
           e.printStackTrace();
       }
       return  bitmap;
    }
}

2、在要生成二维码的Activity,调用上述类,输入二维码内容生成二维码,之后显示在ImageView组件上

MainActivity

public class MainActivity extends AppCompatActivity {
 ImageView Code;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Code = findViewById(R.id.iv_code);
        QRcode qrcode = new QRcode();
        Bitmap  bitmap= qrcode.qrcode("CSDN");
        Code.setImageBitmap(bitmap);
        }

成功获得二维码内容
在这里插入图片描述

扫码

步骤:
1、给点击扫码的组件添加点击监听事件

2、在监听事件中,利用IntentstartActivityForResult跳到Zxing定义好的默认的扫码界面CaptureActivity中(也可以自定义扫码界面)

3、重写onActivityResult方法处理二维码返回的内容

要点:
其中的REQUEST_CODEZxing是定义好的,一定要使用这个CODE
不然在onActivityResult方法中解析二维码将会不起作用

IntentIntegrator.parseActivityResult(requestCode, resultCode, data);

这段源码可知REQUEST_CODE要相等才会进行二维码解析,否则将会返回 null

public static IntentResult parseActivityResult(int requestCode, int resultCode, Intent intent) {
        if (requestCode == REQUEST_CODE) {
            return parseActivityResult(resultCode, intent);
        }
        return null;
    }

设置监听:

Code.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              Intent intent = new Intent(MainActivity.this, CaptureActivity.class);
              startActivityForResult(intent,REQUEST_CODE);
          }
      });

重写Activity中的onActivityResult得到二维码内容,我这里只是将获得的内容进行简单的输出

@Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
            IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
        if(result != null) {
            if(result.getContents() == null) {
                Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show();
            }
        } else {
            super.onActivityResult(requestCode, resultCode, data);
        }
        }

总结

更多内容请到github查看:https://github.com/zxing/zxing

喜欢Android的可以给我点个关注,不断更新干货
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐