Android使用ZXing扫描接口实现二维码扫描

项目中有需求使用zxing实现二维码扫描,但是不想使用UI组件,所以将zxingcore重新编译成jar,可引用到项目里,把yuv数据送入扫描接口,实现二维码扫描。

一、在项目里引入zxingcore.jar(以Android studio工程为例)

将zxingcore.jar放入app/libs文件夹下并引用进工程

zxingcore.jar

Android使用ZXing扫描接口实现二维码扫描_第1张图片

app下build.gradle

implementation files('libs/zxingcore.jar')

二、新建DecodeUtil工具类

package com.cwang.utils.zxingutils;

import android.os.Build;
import android.util.Log;

import com.google.zxing.BinaryBitmap;
import com.google.zxing.PlanarYUVLuminanceSource;
import com.google.zxing.ReaderException;
import com.google.zxing.Result;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.QRCodeReader;
import com.interjoy.utils.systemutils.HardwareManager;

/**
 * 二维码扫描工具类
 * Created by cwang on 2018/11/28.
 */
public class DecodeUtil {
    private static String deviceModel = Build.MODEL;//读取设备型号

    private static QRCodeReader qrCodeReader;

    /**
     * 设置扫描区域
     * @param data
     * @param width
     * @param height
     * @return
     */
    private static PlanarYUVLuminanceSource buildLuminanceSource(byte[] data, int width, int height) {
        if (HardwareManager.isX5Dev(deviceModel) || HardwareManager.isX8Dev(deviceModel)) // 限制扫描区域
            return new PlanarYUVLuminanceSource(data, width, height, width * 3 / 8, height * 3 / 8, width / 4, height / 4, false);
        else // 直接返回整幅图像的数据,而不计算聚焦框大小。
            return new PlanarYUVLuminanceSource(data, width, height, 0, 0, width, height, false);
    }

    /**
     * 二维码检测
     *
     * @param data   YUV数据
     * @param width  YUV数据的宽度
     * @param height YUV数据的高度
     */
    public static void decode(byte[] data, int width, int height, DecodeCallbackInterface DecodeCallback) {
        if (qrCodeReader == null) qrCodeReader = new QRCodeReader();
        Result rawResult = null;
        PlanarYUVLuminanceSource source = buildLuminanceSource(data, width, height);
        if (source != null) {
            BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
            try {
                rawResult = qrCodeReader.decode(bitmap);
                DecodeCallback.DecodeCallback(rawResult.getText());
            } catch (ReaderException re) {
                re.printStackTrace();
            } finally {
                qrCodeReader.reset();
            }
        }
    }

    /**
     * 扫描结果回调
     */
    public interface DecodeCallbackInterface {
        void DecodeCallback(String CodeStr);
    }
}

三、调用扫描二维码函数

DecodeUtil.decode(data, frontCameraWidth, frontCameraHeight, new DecodeUtil.DecodeCallbackInterface() {
    @Override
    public void DecodeCallback(String CodeStr) {
        Log.i(Tag, "二维码扫描结果为 = " + CodeStr);
    }
});

 

你可能感兴趣的:(Android开发)