概述:能够根据给定的字符串信息和二维码图片尺寸,返回相应的二维码图片字节流。也可以通过二维码字节流生成二维码。

本文将以一个点击按钮,将输入的字符串生成一个二维码为例。文章末尾附上源代码

限制:

1.当前仅支持生成QR二维码(Quick Response Code)。由于QR二维码算法限制,字符串信息的长度不能超过2953个字符。

2.生成的二维码图片的宽度不能超过1920像素,高度不能超过1680像素。由于QR二维码是通过正方形阵列承载信息的,建议二维码采用正方形,当这个二维码采用长方形时,会在QR二维码信息的周边区域留白。

接口说明

码生成能力提供了IBarcodeDetector接口,常用的方法功能如下:

/**barcodeInput:要转换的字符串
*bitmapOutput:二维码输出流
*width:图片宽度
*	height:图片高度
*/

int detect(String barcodeInput, byte[] bitmapOutput, int width, int height)

//释放IBarcodeDeteteor接口,释放相关资源
int relese()

实现步骤

1.定义ConnectionCallback回调,实现连接能力引擎成功与否。

private ConnectionCallback connectionCallback = new ConnectionCallback() {
        @Override
        public void onServiceConnect() {

        }

        @Override
        public void onServiceDisconnect() {

        }
    };

2.调用VisionManager.init()方法,将此工程的context和ConnectionCallback作为入参,建立与能力引擎的连接。

private void initEngine(){
        VisionManager.init(this,connectionCallback);
    }

3.在点击按钮监听事件里对IBarcodeDetector实例化,生成图片等操作

 private void getImage(Component component){
        iBarcodeDetector = VisionManager.getBarcodeDetector(this);
        final  int IMAGE_LENGTH = 512;
        byte[] byteArray = new byte[IMAGE_LENGTH * IMAGE_LENGTH * 4];

        int result1 = iBarcodeDetector.detect(textField.getText(),byteArray,IMAGE_LENGTH,IMAGE_LENGTH);

        if(result1 == 0){
            InputStream inputStream = new ByteArrayInputStream(byteArray);
            ImageSource imageSource = ImageSource.create(inputStream,null);
            PixelMap pixelMap =imageSource.createPixelmap(null);
            imageSource.createPixelmap(null);
            outImage.setPixelMap(pixelMap);
        }
    }

/**
实例化IBarcodeDetector对象之后,调用detect方法,将文本输入框textFied的值作为要转换的字符串。
IMAGE_LENGTH作为图片宽高,byteArray作为图片输出流。如果成功会返回状态码0
*/

4.最高调用VisionManager.destory()方法断开连接

        VisionManager.destroy();

5.运行结果

用手机扫描二维码功能扫描就会看到你输入的结果了。(中文会因为编码问题而出现乱码)

代码

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_content"
    ohos:width="match_content"
    ohos:alignment="center"
    ohos:orientation="vertical">
    <TextField
        ohos:id="$+id:inputText"
        ohos:height="match_content"
        ohos:width="match_parent"
        ohos:text_size="25fp"
        ohos:text=""
        ohos:multiple_lines="true"
        ohos:top_margin="30vp"
        ohos:margin="20vp"/>

    <Image
        ohos:id="$+id:image"
        ohos:height="512vp"
        ohos:width="512vp"/>

    <Button
        ohos:id="$+id:button"
        ohos:height="match_content"
        ohos:width="match_parent"
        ohos:text="生成"
        ohos:text_size="23fp"
        ohos:background_element="#0d000000"/>

</DirectionalLayout>

MainAbilitySliice.java

public class MainAbilitySlice extends AbilitySlice {
    private Image outImage;
    private IBarcodeDetector iBarcodeDetector;
    private TextField textField;

    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_main);

        initComponent();
        initEngine();
    }

    private void initComponent(){
        outImage = (Image)findComponentById(ResourceTable.Id_image);
        textField = (TextField)findComponentById(ResourceTable.Id_inputText);
        Component startButton = findComponentById(ResourceTable.Id_button);
        startButton.setClickedListener(this::getImage);
    }

    private void initEngine(){
        VisionManager.init(this,connectionCallback);
    }

    private void getImage(Component component){
        iBarcodeDetector = VisionManager.getBarcodeDetector(this);
        final  int IMAGE_LENGTH = 512;
        byte[] byteArray = new byte[IMAGE_LENGTH * IMAGE_LENGTH * 4];

        int result1 = iBarcodeDetector.detect(textField.getText(),byteArray,IMAGE_LENGTH,IMAGE_LENGTH);

        if(result1 == 0){
            InputStream inputStream = new ByteArrayInputStream(byteArray);
            ImageSource imageSource = ImageSource.create(inputStream,null);
            PixelMap pixelMap =imageSource.createPixelmap(null);
            imageSource.createPixelmap(null);
            outImage.setPixelMap(pixelMap);
        }
    }

    @Override
    public void onActive() {
        super.onActive();
    }

    @Override
    public void onForeground(Intent intent) {
        super.onForeground(intent);
    }

    @Override
    protected void onStop() {
        super.onStop();
        if(iBarcodeDetector != null){
            iBarcodeDetector.release();
        }
        VisionManager.destroy();
    }

    private ConnectionCallback connectionCallback = new ConnectionCallback() {
        @Override
        public void onServiceConnect() {

        }
        @Override
        public void onServiceDisconnect() {

        }
    };
}
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐