HarmonyOS鸿蒙Next中如何解决自定义扫码只能扫描一次,无法持续扫码的问题

HarmonyOS鸿蒙Next中如何解决自定义扫码只能扫描一次,无法持续扫码的问题

【问题现象】

在自定义界面扫码功能中,第一次扫码成功后触发Callback回调拿到扫码结果后,继续扫码后无法再次触发Callback回调。

具体场景举例: 有十个二维码,需要连续扫描十次,拿到二维码的数组后返回上一级页面进行处理。实际操作时会发现扫描完第一个二维码获取结果后,继续扫第二个二维码时Callback回调不会触发,就导致无法获取到第二次的扫码结果。

问题代码如下:

.onLoad(async () => {
  customScan.start()
    .then(async (result: Array<scanBarcode.ScanResult>) => {
       // 处理扫码结果
       this.showScanResult(result);
    });
 })

【背景知识】

rescan()方法: 触发一次重新扫码。如果扫描结果不是预期结果,可以调用该接口触发下一次扫描。该接口必须在启动相机流start接口后,stop接口之前使用,未启动相机流调用会抛出内部错误的异常。仅对start接口的Callback异步回调有效,Promise异步回调接口无效。

自定义持续扫码时序图如下:

点击放大

自定义扫码参考文档

【定位思路】

  1. 从问题代码可以了解到使用的是自定义扫码功能,调用 customScan.start()接口后通过Callback回调函数得到扫码结果,但是start接口只执行一次扫码,返回结果后扫码识别功能结束。

  2. 在Callback回调函数得到扫码结果后只对结果进行了处理,没有再进行其他操作。当前通过start接口开启的扫码识别功能已经结束,导致后续再进行扫码也无法触发Callback回调。

调用start接口通过Callback回调得到第一次扫码结果,将结果进行处理后调用rescan接口重新触发扫码识别,通过变量控制rescan接口调用的的次数就可以获取到连续扫码的结果。

【解决方案】

在start接口的异步回调中调用rescan接口,用于实现持续扫码功能。

.onLoad(async () => {
  customScan.start()
   .then(async (result: Array<scanBarcode.ScanResult>) => {
      // 处理扫码结果
      this.showScanResult(result);
      //调用rescan接口重新触发扫码识别
      customScan.rescan();
   });
 })

【总结】

如需不重启相机并重新触发一次扫码,可以在start接口的Callback异步回调中,调用rescan接口。


更多关于HarmonyOS鸿蒙Next中如何解决自定义扫码只能扫描一次,无法持续扫码的问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS鸿蒙Next中如何解决自定义扫码只能扫描一次,无法持续扫码的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,自定义扫码功能无法持续扫码的问题

在HarmonyOS鸿蒙Next中,自定义扫码功能无法持续扫码的问题通常与生命周期管理或事件处理机制有关。确保在扫码成功后,扫码组件没有被销毁或未正确重置。可以通过以下方式解决:

  1. 生命周期管理:在onPageShowonPageActive生命周期回调中重新初始化扫码组件,确保每次页面显示时扫码功能可用。

  2. 事件处理:在扫码成功的回调函数中,手动调用扫码组件的startScan方法,重新启动扫码功能,而不是直接结束扫码流程。

  3. 组件状态重置:在扫码成功后,检查扫码组件的状态,确保其未被置为不可用或未释放资源。

  4. 避免资源释放:确保在扫码过程中,扫码组件相关的资源(如相机、解码器等)未被提前释放。

通过以上方法,可以确保自定义扫码功能在鸿蒙Next中持续运行。

回到顶部