加入DZone社区,获得完整的会员体验。
简介
QR码(Quick Response code的缩写)是一种矩阵条码(或二维条码)。
HarmonyOS提供代码生成功能,根据给定的字符串和QR码图像大小,返回快速响应(QR)码图像的字节流。调用者可以使用QR码的字节流来生成一个QR码图像。
何时使用
您可以使用此功能,根据给定的字符串生成QR码图像。常见的应用场景包括。
- 社会或通信应用:根据输入的信息为联系人生成一个QR码
- 购物或支付应用:根据输入的链接为在线支付生成一个QR码。
如何开发
创建一个用户界面
我们将制作一个非常简单的界面;它只是一个按钮和一个视图,在那里我们将打印QR码图像。
<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
xmlns:ohos="http://schemas.huawei.com/res/ohos"
ohos:height="match_parent"
ohos:width="match_parent"
ohos:orientation="vertical"
ohos:padding="$float:margin">
<Button
ohos:id="$+id:getCodeButton"
ohos:height="match_content"
ohos:width="match_parent"
ohos:background_element="$graphic:background_button"
ohos:padding="$float:marginS"
ohos:text="$string:getGenCodeButtonLabel"
ohos:text_size="$float:buttonTextSize"
ohos:top_margin="$float:margin"/>
<Image
ohos:id="$+id:qrCodeImage"
ohos:height="match_content"
ohos:width="match_parent"
ohos:top_margin="$float:margin"/>
</DirectionalLayout>
在MainAbilitySlice 实现ConnectionCallback 接口,以实现与能力引擎的连接成功建立或失败后的操作。
import ohos.aafwk.ability.AbilitySlice;
import ohos.ai.cv.common.ConnectionCallback;
public class MainAbilitySlice extends AbilitySlice implements ConnectionCallback {
private boolean isConnect = false;
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_main);
}
@Override
public void onServiceConnect() {
isConnect = true;
}
@Override
public void onServiceDisconnect() {
isConnect = false;
}
}
根据上下文和connectionCallback ,调用VisionManager.init() 方法,建立与能力引擎的连接。确保上下文是一个ohos.aafwk.ability.Ability 或ohos.aafwk.ability.AbilitySlice 实例,或它们的子类实例。
VisionManager.init(MainAbilitySlice.this, this);
获得一个IBarcodeDetector对象,并将你项目的上下文传递给上下文参数。
IBarcodeDetector barcodeDetector = VisionManager.getBarcodeDetector(MainAbilitySlice.this);
定义预期QR码图像的大小,并根据图像大小为字节流数组分配空间。
int QR_LENGTH = 400; byte[] bytes = new byte[QR_LENGTH * QR_LENGTH * 4];
在barcodeDetector 上调用detect() 方法,根据给定的字符串生成QR码图像的字节流。
int detect = barcodeDetector.detect("https://developer.harmonyos.com/en", bytes, QR_LENGTH, QR_LENGTH);
如果返回值是HwHiAIResultCode.AIRESULT_SUCCESS(0),该方法被成功调用,你可以在图像组件中打印QR码,如PixelMap 。
if (detect == HwHiAIResultCode.AIRESULT_SUCCESS) { ImageSource imageSource = ImageSource.create(bytes, null); PixelMap pixelmap = imageSource.createPixelmap(null); qrImage.setPixelMap(pixelmap); barcodeDetector.release(); }
调用VisionManager.destroy() 方法以断开与代码生成能力引擎的连接
VisionManager.destroy();
完整的MainAbilitySlice ,如下所示。
import com.dtse.cjra.ohosqrdemo.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.Image;
import ohos.ai.cv.common.ConnectionCallback;
import ohos.ai.cv.common.VisionManager;
import ohos.ai.cv.qrcode.IBarcodeDetector;
import ohos.ai.engine.resultcode.HwHiAIResultCode;
import ohos.media.image.ImageSource;
import ohos.media.image.PixelMap;
public class MainAbilitySlice extends AbilitySlice implements ConnectionCallback {
private Image qrImage;
private boolean isConnect = false;
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_main);
initViews();
VisionManager.init(MainAbilitySlice.this, this);
}
private void initViews() {
qrImage = (Image) findComponentById(ResourceTable.Id_qrCodeImage);
findComponentById(ResourceTable.Id_getCodeButton).setClickedListener(click -> createQrCode());
}
private void createQrCode() {
if (isConnect) {
int QR_LENGTH = 400;
byte[] bytes = new byte[QR_LENGTH * QR_LENGTH * 4];
IBarcodeDetector barcodeDetector = VisionManager.getBarcodeDetector(MainAbilitySlice.this);
int detect = barcodeDetector.detect("https://developer.harmonyos.com/en", bytes, QR_LENGTH, QR_LENGTH);
if (detect == HwHiAIResultCode.AIRESULT_SUCCESS) {
ImageSource imageSource = ImageSource.create(bytes, null);
PixelMap pixelmap = imageSource.createPixelmap(null);
qrImage.setPixelMap(pixelmap);
barcodeDetector.release();
}
}
}
@Override
public void onActive() {
super.onActive();
}
@Override
public void onForeground(Intent intent) {
super.onForeground(intent);
}
@Override
protected void onStop() {
super.onStop();
VisionManager.destroy();
}
@Override
public void onServiceConnect() {
isConnect = true;
}
@Override
public void onServiceDisconnect() {
isConnect = false;
}
}
我们有下一个结果。
你可以在这里找到完整的代码。
提示和技巧
- 只有QR码可以被生成。由于QR码算法的限制,输入字符串不能超过2953个字符。
- 预期的QR码图像的宽度不能超过1920像素,高度不能超过1680像素。由于QR码是一种方形矩阵条码,建议QR码图像为方形。如果QR码图像是矩形的,QR码信息周围会留下空白区域。
- 要在真正的HarmonyOS设备上安装,你需要在AGC上添加UDID,UDID是一个64个字符的字符串,包括字母和数字
- 进入设备上的 "设置">"关于",继续点击 "构建号",直到显示出表明你已进入开发者模式的信息。
- 将电脑连接到设备上,然后在电脑上启动命令行工具。在hdc shell显示后,运行bm get --udid来获取手表的UDID。(也可以使用adb shell命令)
主题。
java, 开源, qr代码, 案例研究, harmonyOS, qr代码
DZone的贡献者所表达的观点是他们自己的。