Android下使用zxing3.2.1.jar解析与生成二维码

Stella981
• 阅读 552

使用谷歌zxing包,版本3.2.1.

不得不说,网上有些代码居然是错误的。更不得不说,由于版本更新,有些方法没有了,有些方法变得很麻烦了。

而最不得不说的是,安卓并不是照搬了所有的java代码,所以不是照搬了java的解析与生成就可以搞定的。

封装成工具类:

import java.io.File;
import java.util.HashMap;
import java.util.Map;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.Binarizer;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.EncodeHintType;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.NotFoundException;
import com.google.zxing.RGBLuminanceSource;
import com.google.zxing.Result;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
/**
 *条码码操作类
 */
public class CoreUtils {
    private static final int BLACK = 0xff000000; 
    private static final int WHITE = 0xffffffff;
    private static final int TRANSPARENT = 0;
      /**
     * 生成二维码
     * @param content 二维码文字内容
     * @param width 图片像素宽
     * @param height 图片像素高
     * @param charaterset 内容文字的编码方式,如gbk,utf-8
     * @param format 二维码图片的编码方式
     * @return Bitmap对象
     */
    public static Bitmap creat2DCore(String content,int width,int height,String charaterset,BarcodeFormat format){
        if (content == null || "".equals(content)) {
            return null;
        }
        //配置参数
        HashMap<EncodeHintType,Object> hints = new HashMap<EncodeHintType,Object>();
        hints.put(EncodeHintType.CHARACTER_SET,charaterset);
        //容错级别
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
        //设置空白边距的宽度
        //hints.put(EncodeHintType.MARGIN, 2); 
        // 图像数据转换,使用了矩阵转换
        //BitMatrix bitMatrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
        BitMatrix bitMatrix = null;
        try {
            bitMatrix = new MultiFormatWriter().encode(content, format, width, height, hints);
        } catch (WriterException e) {
            e.printStackTrace();
        }
        int[] pixels = new int[width * height];
        //事实上这里应该封装的。谷歌没有做。类似javase中的BufferImage
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                if (bitMatrix.get(x, y)) {
                    pixels[y * width + x] = Color.BLACK;
                } else {
                    pixels[y * width + x] = Color.WHITE;
                }
            }
        }
        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
        return bitmap;
    }
      /**
     * 二维码的解析
     * @param bitmap 二维码图片对象
     * @param charaterset 编码。以此文字编码解析二维码文字内容
     * @return Result 对象。谷歌封装了解析的相关结果
     */
    public static Result parseCode(Bitmap bitmap,String charaterset) {  
            MultiFormatReader formatReader = new MultiFormatReader();  
            
            int bw = bitmap.getWidth();
            int bh = bitmap.getHeight();
/*
* 似乎之前的版本中,是封装bitmap对象到RgbLuminanceSource构造方法里的,现在变麻烦了
* 我只能说,很糟糕的改变
* 
*/            int[] pixels = new int[bw*bh];
            bitmap.getPixels(pixels, 0, bw, 0, 0, bw, bh);
            LuminanceSource    source = new RGBLuminanceSource(bw, bh,pixels);
            Binarizer binarizer = new HybridBinarizer(source);  
            BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);  
   
            Map<DecodeHintType, String> hints = new HashMap<DecodeHintType,String>();  
            hints.put(DecodeHintType.CHARACTER_SET, charaterset);  
//            Map hints = new HashMap();
//            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");//其他版本的写法
            Result result = null;
            try {
                result = formatReader.decode(binaryBitmap, hints);
            } catch (NotFoundException e) {
                e.printStackTrace();
            }  
            return result; 
        }  
}

使用:

//生成二维码并显示
Bitmap bitmap = CoreUtils.creat2DCore(et_text.getText().toString(), 300, 300, "gbk", BarcodeFormat.QR_CODE);
view.setBackground(new BitmapDrawable(getResources(), background));
//解析二维码并显示
Result result = CoreUtils.parseCode(background,"utf-8");
String text = result.getText();
Toast.makeText(getContext(), text, Toast.LENGTH_LONG).show();
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
2年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
2年前
Java日期时间API系列30
  实际使用中,经常需要使用不同精确度的Date,比如保留到天2020042300:00:00,保留到小时,保留到分钟,保留到秒等,常见的方法是通过格式化到指定精确度(比如:yyyyMMdd),然后再解析为Date。Java8中可以用更多的方法来实现这个需求,下面使用三种方法:使用Format方法、 使用Of方法和使用With方法,性能对比,使用
Stella981 Stella981
2年前
JOptionPane修改图标
1.在Linux平台下.JOptionPane会显示Java默认的图标,在window平台不显示图标,如何替换这个图标了?2JOptionPane.setIcon(Icon)修改的是内容区域的icon,而不是左上角的Icon.所以需要通过修改Jdialog/Frame的图标来达到修改默认图标的问题.3.代码:if(JOptio