使用谷歌zxing包,版本3.2.1.
不得不说,网上有些代码居然是错误的。更不得不说,由于版本更新,有些方法没有了,有些方法变得很麻烦了。
而最不得不说的是,安卓并不是照搬了所有的java代码,所以不是照搬了java的解析与生成就可以搞定的。
封装成工具类:
1import java.io.File; 2import java.util.HashMap; 3import java.util.Map; 4import com.google.zxing.BarcodeFormat; 5import com.google.zxing.Binarizer; 6import com.google.zxing.BinaryBitmap; 7import com.google.zxing.DecodeHintType; 8import com.google.zxing.EncodeHintType; 9import com.google.zxing.LuminanceSource; 10import com.google.zxing.MultiFormatReader; 11import com.google.zxing.MultiFormatWriter; 12import com.google.zxing.NotFoundException; 13import com.google.zxing.RGBLuminanceSource; 14import com.google.zxing.Result; 15import com.google.zxing.WriterException; 16import com.google.zxing.common.BitMatrix; 17import com.google.zxing.common.HybridBinarizer; 18import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; 19import android.graphics.Bitmap; 20import android.graphics.BitmapFactory; 21import android.graphics.Canvas; 22import android.graphics.Color; 23/** 24 *条码码操作类 25 */ 26public class CoreUtils { 27 private static final int BLACK = 0xff000000; 28 private static final int WHITE = 0xffffffff; 29 private static final int TRANSPARENT = 0; 30 /** 31 * 生成二维码 32 * @param content 二维码文字内容 33 * @param width 图片像素宽 34 * @param height 图片像素高 35 * @param charaterset 内容文字的编码方式,如gbk,utf-8 36 * @param format 二维码图片的编码方式 37 * @return Bitmap对象 38 */ 39 public static Bitmap creat2DCore(String content,int width,int height,String charaterset,BarcodeFormat format){ 40 if (content == null || "".equals(content)) { 41 return null; 42 } 43 //配置参数 44 HashMap<EncodeHintType,Object> hints = new HashMap<EncodeHintType,Object>(); 45 hints.put(EncodeHintType.CHARACTER_SET,charaterset); 46 //容错级别 47 hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); 48 //设置空白边距的宽度 49 //hints.put(EncodeHintType.MARGIN, 2); 50 // 图像数据转换,使用了矩阵转换 51 //BitMatrix bitMatrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints); 52 BitMatrix bitMatrix = null; 53 try { 54 bitMatrix = new MultiFormatWriter().encode(content, format, width, height, hints); 55 } catch (WriterException e) { 56 e.printStackTrace(); 57 } 58 int[] pixels = new int[width * height]; 59 //事实上这里应该封装的。谷歌没有做。类似javase中的BufferImage 60 for (int y = 0; y < height; y++) { 61 for (int x = 0; x < width; x++) { 62 if (bitMatrix.get(x, y)) { 63 pixels[y * width + x] = Color.BLACK; 64 } else { 65 pixels[y * width + x] = Color.WHITE; 66 } 67 } 68 } 69 Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 70 bitmap.setPixels(pixels, 0, width, 0, 0, width, height); 71 return bitmap; 72 } 73 /** 74 * 二维码的解析 75 * @param bitmap 二维码图片对象 76 * @param charaterset 编码。以此文字编码解析二维码文字内容 77 * @return Result 对象。谷歌封装了解析的相关结果 78 */ 79 public static Result parseCode(Bitmap bitmap,String charaterset) { 80 MultiFormatReader formatReader = new MultiFormatReader(); 81 82 int bw = bitmap.getWidth(); 83 int bh = bitmap.getHeight(); 84/* 85* 似乎之前的版本中,是封装bitmap对象到RgbLuminanceSource构造方法里的,现在变麻烦了 86* 我只能说,很糟糕的改变 87* 88*/ int[] pixels = new int[bw*bh]; 89 bitmap.getPixels(pixels, 0, bw, 0, 0, bw, bh); 90 LuminanceSource source = new RGBLuminanceSource(bw, bh,pixels); 91 Binarizer binarizer = new HybridBinarizer(source); 92 BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer); 93 94 Map<DecodeHintType, String> hints = new HashMap<DecodeHintType,String>(); 95 hints.put(DecodeHintType.CHARACTER_SET, charaterset); 96// Map hints = new HashMap(); 97// hints.put(EncodeHintType.CHARACTER_SET, "utf-8");//其他版本的写法 98 Result result = null; 99 try { 100 result = formatReader.decode(binaryBitmap, hints); 101 } catch (NotFoundException e) { 102 e.printStackTrace(); 103 } 104 return result; 105 } 106}
使用:
1//生成二维码并显示 2Bitmap bitmap = CoreUtils.creat2DCore(et_text.getText().toString(), 300, 300, "gbk", BarcodeFormat.QR_CODE); 3view.setBackground(new BitmapDrawable(getResources(), background)); 4//解析二维码并显示 5Result result = CoreUtils.parseCode(background,"utf-8"); 6String text = result.getText(); 7Toast.makeText(getContext(), text, Toast.LENGTH_LONG).show();