当前位置: 首页 > article >正文

【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 中生成二维码的过程,你可以根据实际需求进一步调整和扩展代码,以适应具体的项目要求。希望对你有所帮助!

 


http://www.kler.cn/a/449020.html

相关文章:

  • MySQL数据库——复制表数据与结构
  • YoloV8改进策略:Head改进|DynamicHead,利用注意力机制统一目标检测头部|即插即用
  • Python 写的 智慧记 进销存 辅助 程序 导入导出 excel 可打印
  • 算法,递归和迭代
  • K8s HPA的常用功能介绍
  • 单元测试mock框架Mockito
  • 架构师之路--达梦数据库学习计划
  • Linux用户与权限管理详解
  • Java模拟Mqtt客户端连接Mqtt Broker
  • 增强LabVIEW与PLC通信稳定性
  • 培训机构Day15
  • 小型 Vue 项目,该不该用 Pinia 、Vuex呢?
  • 云原生大数据计算服务 MaxCompute 是什么?
  • 图像处理基础 | 查看两张图像的亮度差异,Y通道相减
  • 《深入浅出 Servlet:Java Web 开发的基石》(二)
  • JMeter 使用详解
  • 银河麒麟 SSH Vscode连接
  • C++简明教程(文章要求学过一点C语言)(2)
  • 【网络云计算】2024第52周-每日【2024/12/23】小测-理论实操
  • 【一文了解】C#重点-委托1
  • Linux下Java通过JNI调用C++
  • NodeMCU驱动28BYJ-48型步进电机(Arduino)
  • Golang中的Goroutine调度策略
  • 爬虫自动化(DrissionPage)
  • [机器学习]XGBoost(3)——确定树的结构
  • python实现Excel转图片