Android ZXing二维码、条形码的生成和解析

本文介绍了如何在Android应用中使用QRCodeUtil生成二维码,包括二维码的创建过程和显示方法,以及如何将设备位置信息通过二维码分享。同时提到了条形码的不同类型和用途。作者强调了个人技能提升的重要性,推荐了一份全面的Android开发学习资源。
摘要由CSDN通过智能技术生成

近期的一个手表项目需要用到二维码生成,于是就研究了一下。实现起来很简便,将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 block

e.printStackTrace();

}

int width = result.getWidth();

int height = result.getHeight();

int[] pixels = new int[width * height];

// All are 0, or black, by default

for (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;

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

题外话

我们见过很多技术leader在面试的时候,遇到处于迷茫期的大龄程序员,比面试官年龄都大。这些人有一些共同特征:可能工作了7、8年,还是每天重复给业务部门写代码,工作内容的重复性比较高,没有什么技术含量的工作。问到这些人的职业规划时,他们也没有太多想法。

其实30岁到40岁是一个人职业发展的黄金阶段,一定要在业务范围内的扩张,技术广度和深度提升上有自己的计划,才有助于在职业发展上有持续的发展路径,而不至于停滞不前。

不断奔跑,你就知道学习的意义所在!

注意:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

业务范围内的扩张,技术广度和深度提升上有自己的计划,才有助于在职业发展上有持续的发展路径,而不至于停滞不前。

不断奔跑,你就知道学习的意义所在!

注意:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-tyXfy0XA-1713730537335)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值