Android中怎么利用zxing生成二维码
Android中利用zxing库生成二维码
二维码已经成为一个常见的标记工具,被广泛用于商业、交通、教育等领域。在Android中,可以使用zxing库来实现二维码的生成和解析。zxing库是一个开源的二维码扫描库,实现了二维码、一维码的扫描和生成。本文主要介绍如何在Android项目中利用zxing库生成二维码。
一、添加zxing库
1.1 下载zxing库
可以在官网下载最新版的zxing库:https://github.com/zxing/zxing
也可以在Gradle中添加依赖:
repositories {
jcenter()
}
dependencies {
compile 'com.journeyapps:zxing-android-embedded:3.6.0'
}
1.2 添加权限
在AndroidManifest.xml文件中添加相应的权限:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
二、生成二维码
2.1 创建一个activity用于生成二维码
在Android Studio中创建一个新的activity,比如我们在这里创建了GenerateQRCodeActivity。在activity的xml文件中添加一个ImageView控件用于显示二维码。在activity的java代码中,使用zxing库生成二维码,并将其显示在ImageView中。
2.2 生成二维码核心代码
使用zxing库生成二维码,需要先创建一个BitMatrix对象,通过该对象可以将二维码渲染为Bitmap对象:
private void generateQRCode() {
String content = "这是二维码的内容";
int width = 400, height = 400;
try {
//生成二维码
BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height);
int[] pixels = new int[width * height];
//将二维码渲染成Bitmap对象
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
if (bitMatrix.get(x, y)) {
pixels[y * width + x] = 0xff000000;
} else {
pixels[y * width + x] = 0xffffffff;
}
}
}
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
mImageView.setImageBitmap(bitmap);
} catch (WriterException e) {
e.printStackTrace();
}
}
上述代码中,我们将要生成的二维码内容设置为"这是二维码的内容",大小为400*400。MultiFormatWriter是zxing库提供的一个工具类,用于生成二维码,BarcodeFormat.QR_CODE表示生成二维码格式。渲染二维码核心代码:将二维码的像素点一一渲染出来,设置成黑色或白色像素点,最终通过 Bitmap.createBitmap 创建 Bitmap 对象,再将生成的 Bitmap 对象设置给 ImageView 控件,即可在界面上显示二维码。
完整代码:
public class GenerateQRCodeActivity extends AppCompatActivity {
private ImageView mImageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_generate_qrcode);
mImageView = findViewById(R.id.iv_qr_code);
generateQRCode();
}
/**
* 生成二维码
*/
private void generateQRCode() {
String content = "这是二维码的内容";
int width = 400, height = 400;
try {
//生成二维码
BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height);
int[] pixels = new int[width * height];
//将二维码渲染成Bitmap对象
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
if (bitMatrix.get(x, y)) {
pixels[y * width + x] = 0xff000000;
} else {
pixels[y * width + x] = 0xffffffff;
}
}
}
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
mImageView.setImageBitmap(bitmap);
} catch (WriterException e) {
e.printStackTrace();
}
}
}
效果如下:
三、生成带logo的二维码
二维码加上logo更能吸引人眼球。同样可以使用zxing库来生成带logo的二维码。
3.1 添加logo
可以通过调用该方法获取Application中的App icon:
ApplicationInfo applicationInfo = context.getApplicationInfo();
int resId = applicationInfo.icon;
Drawable drawable = context.getResources().getDrawable(resId);
也可以在保存logo的 mipmap 文件夹中添加一个新的logo,这里我们放在 app/src/main/res/mipmap 文件夹中。
3.2 生成带logo的二维码
绘制logo
将生成的二维码放置在画布上,并将logo在二维码中心处绘制:
public Bitmap drawLogo(Bitmap qrBitmap, Bitmap logoBitmap) {
int qrWidth = qrBitmap.getWidth();
int qrHeight = qrBitmap.getHeight();
int logoWidth = logoBitmap.getWidth();
int logoHeight = logoBitmap.getHeight();
Bitmap bitmap = Bitmap.createBitmap(qrWidth, qrHeight, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
canvas.drawBitmap(qrBitmap, 0, 0, null);
canvas.save(Canvas.ALL_SAVE_FLAG);
//绘制logo,位置在二维码中心处
canvas.drawBitmap(logoBitmap, (qrWidth - logoWidth) / 2, (qrHeight - logoHeight) / 2, null);
canvas.restore();
return bitmap;
}
绘制logo的核心代码,使用Canvas绘图功能:
//创建一个新的Bitmap对象
Bitmap bitmap = Bitmap.createBitmap(qrWidth, qrHeight, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
//将二维码放置在画布上
canvas.drawBitmap(qrBitmap, 0, 0, null);
//绘制logo,位置在二维码中心处
canvas.drawBitmap(logoBitmap, (qrWidth - logoWidth) / 2, (qrHeight - logoHeight) / 2, null);
完整代码:
public class GenerateQRCodeActivity extends AppCompatActivity {
private static final int QR_WIDTH = 400, QR_HEIGHT = 400;
private ImageView mImageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_generate_qrcode);
mImageView = findViewById(R.id.iv_qr_code);
generateQRCode();
}
/**
* 生成二维码
*/
private void generateQRCode() {
String content = "这是二维码的内容";
try {
//生成二维码
BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QR_WIDTH, QR_HEIGHT);
//将二维码渲染成Bitmap对象
int[] pixels = new int[QR_WIDTH * QR_HEIGHT];
for (int y = 0; y < QR_HEIGHT; y++) {
for (int x = 0; x < QR_WIDTH; x++) {
if (bitMatrix.get(x, y)) {
pixels[y * QR_WIDTH + x] = 0xff000000;
} else {
pixels[y * QR_WIDTH + x] = 0xffffffff;
}
}
}
Bitmap qrBitmap = Bitmap.createBitmap(QR_WIDTH, QR_HEIGHT, Bitmap.Config.ARGB_8888);
qrBitmap.setPixels(pixels, 0, QR_WIDTH, 0, 0, QR_WIDTH, QR_HEIGHT);
//生成带logo的二维码
Bitmap logoBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
Bitmap bitmap = drawLogo(qrBitmap, logoBitmap);
mImageView.setImageBitmap(bitmap);
} catch (WriterException e) {
e.printStackTrace();
}
}
/**
* 绘制logo
*
* @param qrBitmap 二维码Bitmap
* @param logoBitmap logo Bitmap
* @return 返回生成的带logo的二
