HarmonyOS鸿蒙Next中Scan Kit扫码服务,如何监听无操作返回事件

HarmonyOS鸿蒙Next中Scan Kit扫码服务,如何监听无操作返回事件

【问题现象】

当使用Scan Kit扫码服务时,扫描成功或失败都能触发callback回调函数。但如果用户手动侧滑返回,不会触发任何回调,扫码相关资源不知何时被销毁导致内存泄露。

问题代码如下:

try
  scanBarcode.startScanForResult(getContext(this), options).then((result: scanBarcode.ScanResult) => {
     // 处理扫描结果
  }).catch((error: BusinessError) => {
     if (error.code === 1000500001) {
        // 处理扫码结果错误事件
      } 
  });
} catch (error) {
}

默认扫码页面效果:

点击放大

【背景知识】

Scan Kit主要分为扫码主要分为customSca(自定义扫码界面)scanBarCode(默认扫码界面):

1. 默认扫码界面

默认扫码界面能力提供系统级体验一致的扫码界面,Scan Kit对系统相机权限进行了预授权,调用接口时,无需开发者再次申请相机权限。

默认扫码时序图:

点击放大

默认扫码参考链接

2. 自定义扫码界面

自定义扫码界面能力提供了相机流控制接口,可根据自身需求自定义扫码界面,适用于对扫码界面有定制化需求的应用开发。同时需要开发者自己请求相机的使用权限。

自定义扫码时序图:

点击放大

自定义扫码参考链接

【定位思路】

从问题代码看出使用了默认扫码页面,但是只对callback回调返回的结果和扫码结果出现的错误进行了处理,该操作的前提是必须要进行扫码,对于没有进行扫码操作而返回到上一个界面的情况没有处理。

**思路:**默认扫码界面开启扫码,却没有进行任何扫码操作而直接返回上一页面时,可以从回调中判断是否是1000500002错误码,如果是该错误码则表示用户返回操作,此时销毁自定义扫码资源即可。

**扩展:**以上方案仅对默认扫码界面有效,如果是自定义扫码界面,没有1000500002错误码进行判断,但是手动侧滑返回会触发onBackPressed方法,可以在该方法内判断是否进行了扫码操作,如果没有操作,在该方法内进行无操作返回事件处理。

【解决方案】

  1. 默认扫码页面直接用回调的错误码1000500002判断。

使用scanBarcode.startScanForResult函数,并在回调函数error中判断错误码是否是1000500002,如果是则处理无操作返回事件。

try {
  scanBarcode.startScanForResult(getContext(this), options).then((result: scanBarcode.ScanResult) => {
     // 处理扫描结果
  }).catch((error: BusinessError) => {
     if (error.code === 1000500001) {
        // 处理扫码结果错误事件
      } else if (error.code === 1000500002) {
        // 处理无操作返回事件
      } 
  });
} catch (error) {
}
  1. 自定义扫码页面可以通过onBackPress回调监听侧滑返回。
  • 页面被@Entry组件修饰的场景

若页面用@Entry组件修饰,侧滑返回会触发onBackPress页面生命周期方法,可以在该方法中判断是否进行了扫码操作,如果没有操作在该方法内处理无操作返回事件。

onBackPress() {
   // 处理无操作返回事件
   return false
}
  • 使用Navigation导航框架管理页面的场景

从API version 11开始,当与Navigation绑定的页面栈中存在内容时,onBackPressed回调生效。当手动侧滑返回时触发该回调,并在该回调中处理无操作返回事件。

build() {
  NavDestination() {
  }
  .onBackPressed(() => {
    // 处理无操作返回事件
    return false
})

【总结】

  1. 默认扫码页面可以使用scanBarcode.startScanForResult接口的回调函数错误码直接判断。

  2. 自定义扫码页面根据项目的不同架构,主要有@Entry修饰的生命周期和NavDestination承载的生命周期,可以根据实际使用的场景进行解决方案选择。


更多关于HarmonyOS鸿蒙Next中Scan Kit扫码服务,如何监听无操作返回事件的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS鸿蒙Next中Scan Kit扫码服务,如何监听无操作返回事件的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,使用Scan Kit扫码服务

在HarmonyOS鸿蒙Next中,使用Scan Kit扫码服务时,可以通过ScanKitScanResultListener接口来监听扫码结果。要监听无操作返回事件,可以在onScanResult方法中判断扫码结果是否为空或无效。如果在一定时间内没有扫码操作,可以通过自定义计时器或Handler来触发无操作返回事件。具体实现如下:

  1. onScanResult方法中,判断扫码结果是否为空或无效。
  2. 如果扫码结果为空或无效,启动一个计时器或Handler,设置一个超时时间。
  3. 在超时时间内,如果没有任何扫码操作,触发无操作返回事件。

示例代码片段:

import { ScanResultListener } from '@ohos.scankit';

class MyScanResultListener implements ScanResultListener {
    private timeoutHandler: number | null = null;
    private timeoutDuration: number = 5000; // 5秒超时

    onScanResult(result: string): void {
        if (!result || result.trim() === '') {
            this.startTimeout();
        } else {
            this.clearTimeout();
            // 处理有效扫码结果
        }
    }

    private startTimeout(): void {
        if (this.timeoutHandler === null) {
            this.timeoutHandler = setTimeout(() => {
                this.handleNoOperation();
            }, this.timeoutDuration);
        }
    }

    private clearTimeout(): void {
        if (this.timeoutHandler !== null) {
            clearTimeout(this.timeoutHandler);
            this.timeoutHandler = null;
        }
    }

    private handleNoOperation(): void {
        // 处理无操作返回事件
    }
}

通过这种方式,可以在扫码服务中监听无操作返回事件。

回到顶部