Android手把手编写儿童手机远程监控App之二维码库zxing详解

0 阅读5分钟

概述

上节讲述UUID,UUID通用唯一标识符,每次生成都是在全球范围内不会重复的ID,如:4a3ada95-765b-415b-b53b-d2baf1e4a4d6。多嘟宝中使得每一位都是唯一特例,不重复。嘟宝作为后台服务程序,使用MQTT在后台与服务器保持长期连接,响应嘟妈指令,与嘟妈建立音视频通信。目前完成的任务包括:

  • 开机自启动
  • 前台任务
  • MQTT连接、推送、订阅、医嘱
  • 嘟宝唯一识别码uuid 嘟妈想要给嘟宝发送信息指令,必须先知道嘟宝的ID,dubaoID。但嘟宝ID是很长的字符串,若让嘟妈手动输入,费心费力易出错,惹恼嘟妈。二维码是很不错的解决方案。 在这里插入图片描述转存失败,建议直接上传图片文件 在这里插入图片描述 在这里插入图片描述

二维码:QR Code(Quick Response Code),是一种用来存储信息的二维条码,由黑白方块组成,不同排列代表不同数据。手机摄像头识别后,自动解码成文字。它有以下优点:

  • 信息量大
  • 扫描速度快
  • 容错率高(有一点损坏也能识别)

zxing二维码库

ZXing(Zebra Crossing) 是一个开源的条码与二维码处理库,支持多种编码格式(如QR Code、EAN、Code 128等),可用于生成和解析二维码/条形码,广泛应用于Android应用、后端服务以及嵌入式设备中,具有跨平台、稳定性高和易于集成等特点。 GitHub地址

嘟宝工程应用zxing库

路径在build.gradle 文件,注意有两个build.gradle文件。是含有Module:DuBao:app模块,在dependencies模块中添加依赖:

 implementation 'com.google.zxing:core:3.4.1'
 implementation 'com.journeyapps:zxing-android-embedded:4.3.0'

点击SyncNow ,下载库同步到工程内。 如下图 在这里插入图片描述 其中ZXing 是 ZXing 的核心库(core模块),zxing-android-embedded是再次封装,实现生成二维码、扫描等诸多功能。

生成一个简单二维码

  • 在MainActivity资源文件activity_main.xml添加ImageView显示二维码
  • 在MainActivity onCreate函数中调用zxing-android-embedded库,生成二维码

activity_main代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_vertical"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/qrCode"
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:layout_gravity="center" />


</LinearLayout>

MainActivity代码

package com.zilong.dubao;

import androidx.appcompat.app.AppCompatActivity;

import android.graphics.Bitmap;
import android.os.Bundle;
import android.widget.ImageView;

import com.google.zxing.BarcodeFormat;
import com.journeyapps.barcodescanner.BarcodeEncoder;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ImageView qrCodeImageView = findViewById(R.id.qrCode);
        String textToEncode = "4a3ada95-765b-415b-b53b-d2baf1e4a4d6";
        try {
            // 使用 BarcodeEncoder 生成二维码 Bitmap
            BarcodeEncoder barcodeEncoder = new BarcodeEncoder();
            Bitmap bitmap = barcodeEncoder.encodeBitmap(textToEncode, BarcodeFormat.QR_CODE, 400, 400);

            // 显示二维码
            qrCodeImageView.setImageBitmap(bitmap);
        } catch (Exception e) {
            e.printStackTrace();
            // 生成失败时的处理
        }

    }

}

运行程序查看效果

Snipaste_2026-04-29_15-22-07.png 用微信扫一扫,其内容是一串数组4a3ada95-765b-415b-b53b-d2baf1e4a4d6,ruxiai如下图:

Snipaste_2026-04-29_15-23-38.png 看下核心api

 BarcodeEncoder barcodeEncoder = new BarcodeEncoder();
 Bitmap bitmap = barcodeEncoder.encodeBitmap(textToEncode, BarcodeFormat.QR_CODE, 400, 400);

encodeBitmap函数返回Bitmap 类型,给ImageView显示控件用。参数:

  • textToEncode二维码内容,是一个字符串4a3ada95-765b-415b-b53b-d2baf1e4a4d6,嘟宝ID
  • BarcodeFormat.QR_CODE二维码类型
  • 400二维码长、宽

美化嘟宝二维码

美化二维码的方式很多,例如:圆角码点 + 渐变 + Logo,但每增加一层美化,扫码难度就增加一分。建议从简单的渐变或圆角开始,逐步进阶。 这里Logo美化二维码,在二维码中间放入嘟宝图片。

  • 准备嘟宝logo.png放入DuBao\app\src\main\res\layout目录中。

MainActivity源码

package com.zilong.dubao;

import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.os.Bundle;
import android.widget.ImageView;

import com.google.zxing.BarcodeFormat;
import com.journeyapps.barcodescanner.BarcodeEncoder;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ImageView qrCodeImageView = findViewById(R.id.qrCode);
        String textToEncode = "4a3ada95-765b-415b-b53b-d2baf1e4a4d6";
        Bitmap logo = BitmapFactory.decodeResource(getResources(), R.drawable.fav);
        Bitmap bitmap=createQRCodeWithLogo(textToEncode,400,logo);
        qrCodeImageView.setImageBitmap(bitmap);


    }
    private   Bitmap createQRCodeWithLogo(String content, int qrSize, Bitmap logo) {
        if (content == null || content.isEmpty() || qrSize <= 0) {
            return null;
        }
        try {
            // 1. 先生成基础二维码
            BarcodeEncoder encoder = new BarcodeEncoder();
            Bitmap qrCode = encoder.encodeBitmap(content, BarcodeFormat.QR_CODE, qrSize, qrSize);
            // 没有Logo就直接返回二维码
            if (logo == null) {
                return qrCode;
            }
            // 2. 准备绘制合并
            Bitmap mergedBitmap = Bitmap.createBitmap(qrSize, qrSize, qrCode.getConfig());
            Canvas canvas = new Canvas(mergedBitmap);
            // 3. 绘制基础二维码
            canvas.drawBitmap(qrCode, 0, 0, null);
            // 4. 计算Logo尺寸(建议不超过二维码宽度的1/4)
            int logoSize = qrSize / 4;
            // 缩放Logo(保持宽高比)
            Bitmap scaledLogo = Bitmap.createScaledBitmap(logo, logoSize, logoSize, false);
            // 5. 计算Logo绘制位置(居中)
            float left = (qrSize - logoSize) / 2f;
            float top = (qrSize - logoSize) / 2f;
            // 6. 可选:给Logo添加白色背景圆框(让Logo更突出,扫码更友好)
            Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
            paint.setColor(0xFFFFFFFF);
            canvas.drawRoundRect(new RectF(left - 5, top - 5, left + logoSize + 5, top + logoSize + 5), 15, 15, paint);
            // 7. 绘制Logo
            canvas.drawBitmap(scaledLogo, left, top, null);
            return mergedBitmap;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

}

运行查看效果:

Snipaste_2026-04-29_15-57-25.png

获取嘟宝id二维码显示

MainActivity源码

package com.zilong.dubao;

import androidx.appcompat.app.AppCompatActivity;

import android.graphics.Bitmap;
import android.os.Bundle;
import android.widget.ImageView;

import com.google.zxing.BarcodeFormat;
import com.journeyapps.barcodescanner.BarcodeEncoder;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        showqrQRCode();

    }
    private void showqrQRCode(){
        ImageView qrCodeImageView = findViewById(R.id.qrCode);
        uuid u=new uuid();
        String textToEncode =u.getuuid(this);
        try {
            // 使用 BarcodeEncoder 生成二维码 Bitmap
            BarcodeEncoder barcodeEncoder = new BarcodeEncoder();
            Bitmap bitmap = barcodeEncoder.encodeBitmap(textToEncode, BarcodeFormat.QR_CODE, 400, 400);
            // 显示二维码
            qrCodeImageView.setImageBitmap(bitmap);
        } catch (Exception e) {
            e.printStackTrace();
            // 生成失败时的处理
        }

    }

}

uuid源码

package com.zilong.dubao;

import static android.content.Context.MODE_PRIVATE;

import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;

import java.util.UUID;

public class uuid {
    private String createUUID(){
        String s="";
        s=UUID.randomUUID().toString();
        return s;

    }
    public String getuuid(Context context){
        SharedPreferences  preferences=context.getSharedPreferences("uuid",MODE_PRIVATE);
        String uuid= preferences.getString("id","");
        if (uuid.equals("")){
            uuid=createUUID();
            SharedPreferences.Editor editor=context.getSharedPreferences("uuid",MODE_PRIVATE).edit();
            editor.putString("id",uuid);
            editor.apply();
            return uuid;
        }
        return uuid;
    }
}

至此,嘟宝完成uuid用二维码显示功能。