【Android】Android生成二维码并动态刷新
目录
一、引言
二、生成二维码所需的库
三、代码实现步骤
3.1 创建布局文件
3.2 生成二维码的工具类
3.3 在 Activity 中实现定时刷新
3.4 效果展示
四、二维码生成的参数设置
4.1 数据
4.2 格式
4.3 尺寸
4.4 提示
4.4.1 纠错级别
4.4.2 指定字符集
4.4 3 空白边距
4.5 颜色设置
五、优化与注意事项
5.1 线程处理
5.2 兼容性测试
5.3 数据编码
六、总结
一、引言
二维码在现代移动应用中被广泛应用,例如用于信息分享、产品推广、移动支付等场景。在 Android 开发中,生成二维码是一项常见的功能需求。本文将详细介绍如何在 Android 应用中实现二维码的生成并动态刷新,包括所需的库、代码实现步骤以及相关的优化和注意事项等内容。
二、生成二维码所需的库
在 Android 中生成二维码,通常会使用到第三方库,其中比较常用的是 ZXing(Zebra Crossing)库。ZXing 是一个开源的条形码和二维码处理库,提供了丰富的功能和良好的兼容性。
要在项目中使用 ZXing 库,可以通过以下步骤将其添加到项目中:
- 在项目的 build.gradle 文件(通常是 app 模块下的 build.gradle)的 dependencies 块中添加以下依赖:
implementation 'com.google.zxing:core:3.4.1'
implementation 'com.journeyapps:zxing-android-embedded:4.3.0'
如果是新版本的Android Studio,则需要在项目的 build.gradle.kts 文件中去添加:
- 在项目的 build.gradle.kts 文件(通常是 app 模块下的 build.gradle.kts)的 dependencies 块中添加以下依赖:
implementation(libs.core)
implementation(libs.zxing.android.embedded)
这里添加了 ZXing 的核心库以及用于 Android 集成的库。
三、代码实现步骤
使用 Android 中常见的 ZXing 库来生成二维码,并利用 Handler 实现定时刷新
3.1 创建布局文件
首先,在 XML 布局文件中定义一个用于显示二维码的 ImageView:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/iv_code1"
android:layout_width="300dp"
android:layout_height="300dp"
android:layout_marginStart="50dp"
android:layout_marginTop="50dp"/>
</LinearLayout>
3.2 生成二维码的工具类
QRCodeUtil.java
在对应的 Java 代码中,以下是生成二维码的主要步骤:
package com.your.package.name.util;
import android.graphics.Bitmap;
import android.graphics.Color;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import java.util.HashMap;
import java.util.Map;
public class QRCodeCommonUtil {
public static Bitmap generateQRCode(String content, int width, int height) {
QRCodeWriter writer = new QRCodeWriter();
try {
// 设置容错率
Map<EncodeHintType, Object> hints = new HashMap<>();
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
// 设置字符集
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
// 生成二维码的位矩阵
BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, width, height, hints);
// 将位矩阵转换为像素数组
int[] pixels = new int[width * height];
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
pixels[y * width + x] = bitMatrix.get(x, y)? Color.BLACK : Color.WHITE;
}
}
// 创建Bitmap并设置像素
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
return bitmap;
} catch (WriterException e) {
e.printStackTrace();
return null;
}
}
}
3.3 在 Activity 中实现定时刷新
MainActivity.java
使用Handler延迟执行任务 :
package com.your.package.name;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.widget.ImageView;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import com.your.package.name.util.QRCodeUtil;
public class MainActivity extends AppCompatActivity {
private static final long REFRESH_INTERVAL = 10000; // 10秒刷新一次,单位:毫秒
private ImageView iv_code1;
private Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
iv_code1 = findViewById(R.id.iv_code1);
// 初始生成一次二维码
updateQRCode();
// 启动定时刷新任务
startRefreshTimer();
}
// 生成二维码
private void updateQRCode() {
// 这里设置要生成二维码的内容,比如一个网址等,这里以百度为例
String content = "https://www.baidu.com";
Bitmap qrCodeBitmap = QRCodeCommonUtil.generateQRCode(content, 500, 500);
if (qrCodeBitmap!= null) {
iv_code1.setImageBitmap(qrCodeBitmap);
}
}
private void startRefreshTimer() {
Runnable refreshRunnable = new Runnable() {
@Override
public void run() {
updateQRCodeWithLogo();
handler.postDelayed(this, REFRESH_INTERVAL);
}
};
handler.postDelayed(refreshRunnable, REFRESH_INTERVAL);
}
@Override
protected void onDestroy() {
super.onDestroy();
// 移除所有的消息,避免内存泄漏等问题
handler.removeCallbacksAndMessages(null);
}
}
3.4 效果展示
四、二维码生成的参数设置
在 ZXing(Zebra Crossing)库中,QRCodeWriter 是用于生成 QR 码(二维码)的一个类,QRCodeWriter().encode 方法用于将数据编码成 QR 码。该方法有以下几个参数:
4.1 数据
- 类型:String 或其他可编码为字符串的数据类型(如字节数组等)。
- 含义:这是要编码到 QR 码中的实际数据,例如一个 URL( "https://www.example.com";)、一段文本信息等。它是生成 QR 码的核心内容,决定了 QR 码所承载的具体信息。
4.2 格式
- 类型:BarcodeFormat 枚举类型。
- 含义:指定要生成的条形码或二维码的格式,在生成 QR 码时,这里必须设置为 BarcodeFormat.QR_CODE,表示生成一个 QR 码。常见的枚举值还有 BarcodeFormat.CODE_39(39 码)、BarcodeFormat.CODE_128(128 码)等,用于选择不同类型的条形码或二维码格式。
4.3 尺寸
在生成二维码时,可以通过设置 width 和 height 参数来指定二维码的尺寸。例如:
int width = 300;
int height = 300;
BitMatrix bitMatrix = new MultiFormatWriter().encode(data, BarcodeFormat.QR_CODE, width, height);
较大的尺寸会使二维码更清晰,但也会占用更多的内存和屏幕空间。
4.4 提示
- 类型:Map<EncodeHintType,?> 类型,这是一个包含编码提示信息的 Map。
- 含义:用于提供一些额外的编码参数,以控制 QR 码的生成过程。
4.4.1 纠错级别
二维码有不同的纠错级别,包括 L(低)、M(中)、Q(高)、H(最高)。纠错级别越高,二维码在部分损坏或遮挡的情况下仍能正确解码的能力越强,但同时生成的二维码会包含更多的冗余信息,导致尺寸可能会稍大。
ERROR_CORRECTION:用于设置纠错级别,可取值为 ErrorCorrectionLevel.L(低纠错)、ErrorCorrectionLevel.M(中纠错)、ErrorCorrectionLevel.Q(高纠错)、ErrorCorrectionLevel.H(最高纠错)。例如:
Map<EncodeHintType, ErrorCorrectionLevel> hints = new HashMap<>();
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
BitMatrix bitMatrix = new MultiFormatWriter().encode(data, BarcodeFormat.QR_CODE, width, height, hints);
这就设置了生成的 QR 码具有最高纠错能力。
4.4.2 指定字符集
CHARACTER_SET:用于指定字符集。
例如:
Map<EncodeHintType, ErrorCorrectionLevel> hints = new HashMap<>();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
BitMatrix bitMatrix = new MultiFormatWriter().encode(data, BarcodeFormat.QR_CODE, width, height, hints);
表示使用 UTF-8 字符集对数据进行编码。
4.4 3 空白边距
MARGIN:用于设置 QR 码与图像边缘的空白边距,以像素为单位。
默认值为 4,例如:
Map<EncodeHintType, ErrorCorrectionLevel> hints = new HashMap<>();
hints.put(EncodeHintType.MARGIN, 2);
BitMatrix bitMatrix = new MultiFormatWriter().encode(data, BarcodeFormat.QR_CODE, width, height, hints);
会将边距设置为 2 像素,边距越小,QR 码在图像中占据的空间越大。
4.5 颜色设置
生成的二维码默认是黑色前景和白色背景。如果需要自定义颜色,可以在将 BitMatrix 转换为 Bitmap 后,对 Bitmap 进行像素级的操作来修改颜色。例如:
在前面第三部分中的 3.2 生成二维码的工具类 中的将 位矩阵转换成像素数组 的代码中将 Color.BLACK 和 Color.WHITE 改成其他颜色即可。
// 将位矩阵转换为像素数组
int[] pixels = new int[width * height];
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
// 黑白
//pixels[y * width + x] = bitMatrix.get(x, y)? Color.BLACK : Color.WHITE;
// 红白
pixels[y * width + x] = bitMatrix.get(x, y)? Color.RED : Color.WHITE;
}
}
修改颜色之后效果展示:
五、优化与注意事项
5.1 线程处理
生成二维码可能是一个相对耗时的操作,特别是对于复杂的数据或较大的尺寸。为了避免阻塞主线程,导致界面卡顿,建议将二维码生成操作放在子线程中进行,然后在生成完成后通过 Handler 或 LiveData 等机制将生成的二维码 Bitmap 更新到 UI 线程的 ImageView 中。
5.2 兼容性测试
不同的 Android 设备和系统版本可能对二维码的显示和扫描有不同的表现。在开发完成后,需要在多种设备和系统上进行兼容性测试,确保生成的二维码能够正常显示和被扫描识别。
5.3 数据编码
要注意编码到二维码中的数据格式和长度限制。不同的二维码类型和纠错级别对数据长度有一定的限制。例如,普通的 QR 码对于数字、字母和部分符号的编码容量较大,而对于复杂的汉字或特殊字符可能会有一定的限制。
六、总结
在 Android 应用中生成二维码是一个实用且常见的功能。通过使用 ZXing 库,我们可以方便地实现二维码的生成。在实现过程中,需要合理设置二维码的参数,如尺寸、纠错级别和颜色等,同时要注意内存管理、线程处理以及兼容性测试等方面的问题。通过精心设计和优化,可以为用户提供良好的二维码生成体验,满足各种应用场景的需求。
以上文章详细介绍了在 Android 中生成二维码的过程,你可以根据实际需求进一步调整和扩展代码,以适应具体的项目要求。希望对你有所帮助!