鸿蒙手表开发之动态生成二维码

鸿蒙手表开发之动态生成二维码

前言:

最近入职新公司,由于之前的哥们临时离职,走得很突然,所以没有任何交接和文档,临时顶上公司手表应用的上架,更换了新的密钥和key之后重新测试功能和流程,基本上没啥大问题,鸿蒙那边的工作人员也测试通过了,但是说隐私政策页面有一点问题,内容有几个错误点,我检查了一下App中的隐私政策发现是本地写死的页面,于是询问鸿蒙的工作人员该如何修改,他们给出一个意见,用二维码生成一个页面,用户和测试人员扫码就可以加载对应的页面,而且这个url地址里面的内容是动态的,可以随意修改,不需要App频繁改动,对于后期的审核和上架基本上是一步到位,于是简单的学习了一下官方文档,百度查询了一下资料,生成了一个二维码界面。

1.新建一个隐私政策页面:

scala 复制代码
/**
 * @author:test
 * @date:2023/9/26 17:14
 * @description:隐私政策
 */
public class PrivacyPolicyQRCodeAbility extends Ability {
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setMainRoute(PrivacyPolicyQRCodeSlice.class.getName());
    }
}

2.生成二维码及扫描页面:

步骤如下:

  • 初始化view: initIView()
  • 初始化二维码引擎:VisionManager.init(PrivacyPolicyQRCodeSlice.this, connectionCallback);
  • 二维码连接回调:ConnectionCallback connectionCallback = new ConnectionCallback()
  • 连接成功后生成二维码:createQRCode(qrCodeUrlTxt);
  • 在界面退出时销毁引擎:VisionManager.destroy();
java 复制代码
package com.xxx.hwwear.slice;
​
import com.elvishew.xlog.XLog;
import com.yadea.hwwear.BuildConfig;
import com.yadea.hwwear.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.media.image.ImageSource;
import ohos.media.image.PixelMap;
import ohos.media.image.common.PixelFormat;
​
/**
 * @author:njb
 * @date:2023/9/26 17:14
 * @description:扫描二维码进入隐私政策页面
 */
public class PrivacyPolicyQRCodeSlice extends AbilitySlice {
    Image codeImage;
​
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_service_protocol_qr_code);
        initView();
    }
​
    private void initView() {
        codeImage = (Image) findComponentById(ResourceTable.Id_imgQrCode);
    }
​
    @Override
    public void onActive() {
        super.onActive();
        VisionManager.init(PrivacyPolicyQRCodeSlice.this, connectionCallback);
    }
​
    @Override
    public void onForeground(Intent intent) {
        super.onForeground(intent);
    }
​
    @Override
    protected void onBackground() {
        super.onBackground();
        VisionManager.destroy();
    }
​
    ConnectionCallback connectionCallback = new ConnectionCallback() {
        @Override
        public void onServiceConnect() {
            String qrCodeUrlTxt = "https://developer.huawei.com/consumer/cn/harmonyos";
            //连接成功生成二维码
            createQRCode(qrCodeUrlTxt);
        }
​
        @Override
        public void onServiceDisconnect() {
            if (BuildConfig.DEBUG) {
                XLog.d("Vision onServiceDisconnect");
            }
        }
    };
​
    /**
     * 创建二维码
     *
     * @param barText 需要生成二维码的字符串
     */
    private void createQRCode(String barText) {
        //实例化接口,获取二维码侦测器
        IBarcodeDetector barcodeDetector = VisionManager.getBarcodeDetector(PrivacyPolicyQRCodeSlice.this);
        //定义码生成图像的尺寸
        final int SAMPLE_LENGTH = getLayoutParams().width;
        //根据图像的大小,分配字节流数组的空间
        byte[] byteArray = new byte[SAMPLE_LENGTH * SAMPLE_LENGTH * 4];
        //调用IBarcodeDetector的detect()方法,根据输入的字符串信息生成相应的二维码图片字节流
        barcodeDetector.detect(barText, byteArray, SAMPLE_LENGTH, SAMPLE_LENGTH);
        //释放侦测器
        barcodeDetector.release();
        //通过SourceOptions指定数据源的格式信息
        ImageSource.SourceOptions srcOpts = new ImageSource.SourceOptions();
        //定义图片格式
        srcOpts.formatHint = "image/png";
        //创建图片源
        ImageSource imgSource = ImageSource.create(byteArray, srcOpts);
        //创建图像解码选项
        ImageSource.DecodingOptions decodingOpts = new ImageSource.DecodingOptions();
        decodingOpts.desiredPixelFormat = PixelFormat.ARGB_8888;
        //通过图片源创建PixelMap
        PixelMap pMap = imgSource.createPixelmap(decodingOpts);
        //赋值到图片标签
        codeImage.setPixelMap(pMap);
        //释放资源
        barcodeDetector.release();
        imgSource.release();
        if (pMap != null) {
            pMap.release();
        }
        //断开与能力引擎的连接
        VisionManager.destroy();
    }
}

3.生成二维码界面布局:

ini 复制代码
<?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:alignment="center"
    ohos:orientation="vertical">
​
    <Image
        ohos:id="$+id:imgQrCode"
        ohos:height="match_parent"
        ohos:width="match_parent"
        ohos:layout_alignment="center"/>
​
</DirectionalLayout>

4.点击隐私政策按钮跳转页面:

scss 复制代码
richText.addTouchEventListener((param1Component, param1TouchEvent) -> {
    Intent intent = new Intent();
    intent.setOperation((new Intent.OperationBuilder())
            .withBundleName(getBundleName())
            //隐私政策
            .withAbilityName(PrivacyPolicyQRCodeAbility.class.getName())
            .build());
    ProtocolAbilitySlice.this.startAbility(intent);
    return false;
},  29, 34);

5.配置页面:

bash 复制代码
{
  "name": "com.xxx.hwwear.PrivacyPolicyQRCodeAbility",
  "description": "$string:qrcodeabilityslice_description",
  "icon": "$media:icon",
  "label": "$string:entry_QRCodeAbilitySlice",
  "launchType": "standard",
  "orientation": "unspecified",
  "type": "page"
},

6.实现的效果如下:

7.扫码后的效果截图如下:

8.总结:

这里是以鸿蒙OS应用开发官网举例,这里的url可以随意动态切换,如果有个接口能提供这个地址更好,当然一般这些都不会经常改动,里面的内容后台可以随时修改,对于App或者手表应用都值得推荐,使用简单方便,本文基本上都是从0开始开发的,由于之前是做Android开发的,而且使用的是旧的Java语法,基本上没有遇到大的问题,当然其中的小问题还是有的.这里不是讲解让大家去学习新语言,如果不是工作需要,我不会接触鸿蒙和学习这些,而是记录一下工作中遇到的实际问题,后面等我大致了解清楚后再进行分享,要不然盲目学习会令人头疼,学完没有项目实战也是白搭,不推荐大家学太多东西。我只是工作需要而已,打卡收工,关机睡觉。

下一篇讲解如何将鸿蒙手表应用线上包通过adb install的方式安装到本地手表上,这里其实也是遇到了几个问题,都是在工作人员的指导下顺利完成,这里不得不说工作人员态度极好,回复也很快,基本上有问题都是远程全面指导,非常感谢!!

相关推荐
赏金术士20 分钟前
第六章:UI组件与Material3主题
android·ui·kotlin·compose
TechMerger2 小时前
Android 17 重磅重构!服役 20 年的 MessageQueue 迎来无锁改造,卡顿大幅优化!
android·性能优化
yuhuofei20214 小时前
【Python入门】Python中字符串相关拓展
android·java·python
dalancon4 小时前
Android Input Spy Window
android
dalancon6 小时前
InputDispatcher派发事件,查找目标窗口
android
我命由我123456 小时前
Android Framework P3 - MediaServer 进程、认识 ServiceManager 进程
android·c语言·开发语言·c++·visualstudio·visual studio·android runtime
天才少年曾牛7 小时前
Android14 新增系统服务后,应用调用出现 “hidden api” 警告的原因与解决方案
android·frameworks
赏金术士7 小时前
Jetpack Compose 底部导航实战教程(完整版)
android·kotlin·compose
随遇丿而安7 小时前
第5周:XML 资源、样式和主题,真正解决的是“页面以后还改不改得动”
android
zh_xuan8 小时前
Android 获取系统内存页大小:sysconf(_SC_PAGESIZE) 与 JNI 实现
android·jni·ndk·内存页大小