Android ZXing二维码、条形码的生成和解析
来源:互联网 发布:手游淘宝交易平台 编辑:程序博客网 时间:2024/04/29 10:33
ZXing(Zebra Crossing)是Google开发的一个二维码解析和生成的开源库。
ZXing GitHub地址
近期的一个手表项目需要用到二维码生成,于是就研究了一下。实现起来很简便,将jar包放入工程,就可以直接使用API了。
设备将位置信息更新给服务器,在浏览器输入URL访问指定ID设备的位置信息。这个URL可以用二维码的形式展示出来。
1.生成二维码:
private void initialLayout() {ImageView imageQRCode = (ImageView) findViewById(R.id.imageQRCode);String contentQRCode = Constant.Server.URL_MAP_INDEX + MyApp.deviceId;try {// 根据字符串生成二维码图片并显示在界面上,第二个参数为图片的大小(310*310)Bitmap bitmapQRCode = QRCodeUtil.createQRCode(contentQRCode,310);imageQRCode.setImageBitmap(bitmapQRCode);} catch (WriterException e) {e.printStackTrace();}}
QRCodeUtil:
import java.util.Hashtable;import android.graphics.Bitmap;import com.google.zxing.BarcodeFormat;import com.google.zxing.EncodeHintType;import com.google.zxing.MultiFormatWriter;import com.google.zxing.WriterException;import com.google.zxing.common.BitMatrix;public final class QRCodeUtil {private static final int BLACK = 0xff000000;public static Bitmap createQRCode(String str, int widthAndHeight)throws WriterException {Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();hints.put(EncodeHintType.CHARACTER_SET, "utf-8");BitMatrix matrix = new MultiFormatWriter().encode(str,BarcodeFormat.QR_CODE, widthAndHeight, widthAndHeight);int width = matrix.getWidth();int height = matrix.getHeight();int[] pixels = new int[width * height];for (int y = 0; y < height; y++) {for (int x = 0; x < width; x++) {if (matrix.get(x, y)) {pixels[y * width + x] = BLACK;}}}Bitmap bitmap = Bitmap.createBitmap(width, height,Bitmap.Config.ARGB_8888);bitmap.setPixels(pixels, 0, width, 0, 0, width, height);return bitmap;}}
效果图:
可以用微信扫一扫,也可以用自己写的解析程序扫描,进入指定的URL。
2.生成条形码
条形码有很多种类,二维(条形)码就是其中一种。表示内容也有不同,有的只能表示纯数字,不能表示字母。
BarcodeFormat.CODE_128; // 表示高密度数据, 字符串可变长,符号内含校验码BarcodeFormat.CODE_39;BarcodeFormat.CODE_93;BarcodeFormat.CODABAR; // 可表示数字0 - 9,字符$、+、 -、还有只能用作起始/终止符的a,b,c d四个字符,可变长度,没有校验位BarcodeFormat.DATA_MATRIX;BarcodeFormat.EAN_8;BarcodeFormat.EAN_13;BarcodeFormat.ITF;BarcodeFormat.PDF417; // 二维码BarcodeFormat.QR_CODE; // 二维码BarcodeFormat.RSS_EXPANDED;BarcodeFormat.RSS14;BarcodeFormat.UPC_E; // 统一产品代码E:7位数字,最后一位为校验位BarcodeFormat.UPC_A; // 统一产品代码A:12位数字,最后一位为校验位BarcodeFormat.UPC_EAN_EXTENSION;
ublic static Bitmap creatBarcode(Context context, String contents,int desiredWidth, int desiredHeight, boolean displayCode) {Bitmap ruseltBitmap = null;int marginW = 20;BarcodeFormat barcodeFormat = BarcodeFormat.CODE_128;if (displayCode) {Bitmap barcodeBitmap = encodeAsBitmap(contents, barcodeFormat,desiredWidth, desiredHeight);Bitmap codeBitmap = creatCodeBitmap(contents, desiredWidth + 2* marginW, desiredHeight, context);ruseltBitmap = mixtureBitmap(barcodeBitmap, codeBitmap, new PointF(0, desiredHeight));} else {ruseltBitmap = encodeAsBitmap(contents, barcodeFormat,desiredWidth, desiredHeight);}return ruseltBitmap;}protected static Bitmap encodeAsBitmap(String contents,BarcodeFormat format, int desiredWidth, int desiredHeight) {final int WHITE = 0xFFFFFFFF;final int BLACK = 0xFF000000;MultiFormatWriter writer = new MultiFormatWriter();BitMatrix result = null;try {result = writer.encode(contents, format, desiredWidth,desiredHeight, null);} catch (WriterException e) {// TODO Auto-generated catch blocke.printStackTrace();}int width = result.getWidth();int height = result.getHeight();int[] pixels = new int[width * height];// All are 0, or black, by defaultfor (int y = 0; y < height; y++) {int offset = y * width;for (int x = 0; x < width; x++) {pixels[offset + x] = result.get(x, y) ? BLACK : WHITE;}}Bitmap bitmap = Bitmap.createBitmap(width, height,Bitmap.Config.ARGB_8888);bitmap.setPixels(pixels, 0, width, 0, 0, width, height);return bitmap;}protected static Bitmap creatCodeBitmap(String contents, int width,int height, Context context) {TextView tv = new TextView(context);LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);tv.setLayoutParams(layoutParams);tv.setText(contents);tv.setHeight(height);tv.setGravity(Gravity.CENTER_HORIZONTAL);tv.setWidth(width);tv.setDrawingCacheEnabled(true);tv.setTextColor(Color.BLACK);tv.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));tv.layout(0, 0, tv.getMeasuredWidth(), tv.getMeasuredHeight());tv.buildDrawingCache();Bitmap bitmapCode = tv.getDrawingCache();return bitmapCode;}protected static Bitmap mixtureBitmap(Bitmap first, Bitmap second,PointF fromPoint) {if (first == null || second == null || fromPoint == null) {return null;}int marginW = 20;Bitmap newBitmap = Bitmap.createBitmap(first.getWidth() + second.getWidth() + marginW,first.getHeight() + second.getHeight(), Config.ARGB_4444);Canvas cv = new Canvas(newBitmap);cv.drawBitmap(first, marginW, 0, null);cv.drawBitmap(second, fromPoint.x, fromPoint.y, null);cv.save(Canvas.ALL_SAVE_FLAG);cv.restore();return newBitmap;}
creatBarcode的最后一个参数:是否要在条形码下方显示生成的内容。
ImageView imageBarCode = (ImageView) findViewById(R.id.imageBarCode);imageBarCode.setImageBitmap(QRCodeUtil.creatBarcode(getApplicationContext(), "78480000b4a5", 600, 400, true));
生成结果:
3.解析-zxing.CaptureActivity中handleDecode处理解析好的数据即可:
/** * A valid barcode has been found, so give an indication of success and show * the results. * * @param rawResult The contents of the barcode. * @param scaleFactor amount by which thumbnail was scaled * @param barcode A greyscale bitmap of the camera data which was decoded. */ public void handleDecode(final Result rawResult, Bitmap barcode, float scaleFactor) { inactivityTimer.onActivity(); boolean fromLiveScan = barcode != null; if (fromLiveScan) { beepManager.playBeepSoundAndVibrate(); } finish(); String scanResult = rawResult.getText(); if (null != scanResult && scanResult.trim().length() > 0) { Intent intentBind = new Intent(CaptureActivity.this, BindActivity.class); intentBind.putExtra("physicalId", scanResult); startActivity(intentBind); } switch (source) { case NATIVE_APP_INTENT: case PRODUCT_SEARCH_LINK: break; case ZXING_LINK: break; case NONE: break; } }
0 2
- Android ZXing二维码、条形码的生成和解析
- ZXing 生成二维码和条形码
- Android基于Zxing实现二维码,条形码扫描和生成二维码
- Android学习之 google Zxing 二维码条形码生成与解析
- Zxing生成二维码 条形码
- iOS 条形码 二维码 的生成 和 扫描 zBarSDK zXing
- 用ZXing 生成条形码和二维码图片
- ZXing二维码、条形码生成和扫描
- zxing实现二维码的生成和解析
- Android二维码开源项目zxing用例简化和生成二维码、条形码
- Android二维码的扫描和生成(ZXing)
- zxing生成二维码或者条形码
- Zxing二维码、条形码扫描/生成
- 二维码及带logo二维码的生成和解析-Zxing
- java zxing二维码(可带logo)、条形码生成解析
- ZXing生成条形码、二维码、带logo二维码
- 碎步二:zxing核心包生成条形码和二维码
- ZXing生成和读取条形码二维码(C#)
- 在云平台下进行Openstack安装
- 【codevs1082】线段树练习 3
- python连接MySQL源码
- redis扩展安装
- bzoj1864(树形DP)
- Android ZXing二维码、条形码的生成和解析
- 1002. A+B for Polynomials (25)
- Looper
- NSSet和NSMutableSet
- Cursor query详解
- mysql 列转行的技巧
- 【图像理解】自动生成图像的文本描述
- js 获取当前周几
- solr入门之搜索建议的具体查询及拼音加汉字搜索建议的思考