Android 中使用开源库 ZXing 生成二维码图片

在 Android 中生成二维码是一个比较常见的功能,可以使用开源库 ZXing(Zebra Crossing)库来实现,这是一个非常流行的二维码生成和扫描库。

1、添加依赖库

  • 在 app/build.gradle.kt 中添加依赖库。
dependencies { 
	......
    implementation("com.google.zxing:core:3.5.3")
    implementation("com.journeyapps:zxing-android-embedded:4.3.0")
}

2、创建 QRCodeUtil 工具类

  • 创建一个工具类来封装二维码生成的逻辑。
  • hints[EncodeHintType.CHARACTER_SET] = “UTF-8” 设置编码方式
  • hints[EncodeHintType.MARGIN] = 1 设置边距
  • hints[EncodeHintType.ERROR_CORRECTION] = ErrorCorrectionLevel.L 设置容错率。容错率分四个等级:L ≈ 7 % M ≈ 15 % Q ≈ 25 % H ≈ 30 %(最高),默认为 L 级别。若计划在二维码中央加 Logo,建议至少选 M,最好 H。
  • 同样内容,容错率越高,二维码打印面积越大,或同等面积下每个小方块更小,扫描时对摄像头分辨率、抖动、对焦要求反而更高。
  • 容错率选择场景:没有 Logo、无物理损伤风险时,L(7 %)或 M(15 %) 是最均衡选择;当你确定二维码会被部分遮挡/污损时(户外强光、褶皱、中间贴 20 % Logo等),才升级到 H——同时接受它“更大、更密、稍慢”的代价。
package com.android.example

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.qrcode.QRCodeWriter
import java.util.EnumMap


object QRCodeUtil {

    /**
     * 根据内容生成二维码图片
     */
    fun generateQRCode(content: String, width: Int, height: Int): Bitmap? {
        val qrCodeWriter = QRCodeWriter()
        val hints: MutableMap<EncodeHintType, Any?> = EnumMap(EncodeHintType::class.java)
        hints[EncodeHintType.CHARACTER_SET] = "UTF-8"
        // 设置二维码边距
        hints[EncodeHintType.MARGIN] = 1
        // 设置容错率 L~7%  M~15%  Q~25%  H~30% 默认为 L 等级
        hints[EncodeHintType.ERROR_CORRECTION] = ErrorCorrectionLevel.L

        try {
            val bitMatrix =
                qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, width, height, hints)
            val pixels = IntArray(width * height)
            for (y in 0..<height) {
                for (x in 0..<width) {
                    if (bitMatrix[x, y]) {
                        pixels[y * width + x] = Color.BLACK
                    } else {
                        pixels[y * width + x] = Color.WHITE
                    }
                }
            }
            return Bitmap.createBitmap(pixels, 0, width, width, height, Bitmap.Config.ARGB_8888)
        } catch (e: WriterException) {
            e.printStackTrace()
        }
        return null
    }
}

3、使用工具类生成二维码

  • Activity 中调用 QRCodeUtil 工具类来生成二维码,并显示在 ImageView 控件中。
package com.android.example

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.android.repairmanagement.databinding.ActivityMainBinding

class MainActivity: AppCompatActivity() {

    private lateinit var viewBinding: ActivityMainBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        viewBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(viewBinding.root)

        val content = "http://www.example.cn/main"
        // 生成 200x200 的二维码图片
        val qrCodeBitmap = QRCodeUtil.generateQRCode(content, 200, 200)
        viewBinding.imageView.setImageBitmap(qrCodeBitmap)
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值