概述
上节讲述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();
// 生成失败时的处理
}
}
}
运行程序查看效果
用微信扫一扫,其内容是一串数组
4a3ada95-765b-415b-b53b-d2baf1e4a4d6,ruxiai如下图:
看下核心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;
}
}
}
运行查看效果:
获取嘟宝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用二维码显示功能。