HarmonyOS QR码生成

325 阅读3分钟

加入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>

Create QR Code Image

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.Abilityohos.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;
    }
}

我们有下一个结果。

The generated QR Code

你可以在这里找到完整的代码。

提示和技巧

  • 只有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的贡献者所表达的观点是他们自己的。