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方法,可以在该方法内判断是否进行了扫码操作,如果没有操作,在该方法内进行无操作返回事件处理。
【解决方案】
- 默认扫码页面直接用回调的错误码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) {
}
- 自定义扫码页面可以通过onBackPress回调监听侧滑返回。
- 页面被@Entry组件修饰的场景
若页面用@Entry组件修饰,侧滑返回会触发onBackPress页面生命周期方法,可以在该方法中判断是否进行了扫码操作,如果没有操作在该方法内处理无操作返回事件。
onBackPress() {
// 处理无操作返回事件
return false
}
- 使用Navigation导航框架管理页面的场景
从API version 11开始,当与Navigation绑定的页面栈中存在内容时,onBackPressed回调生效。当手动侧滑返回时触发该回调,并在该回调中处理无操作返回事件。
build() {
NavDestination() {
}
.onBackPressed(() => {
// 处理无操作返回事件
return false
})
【总结】
-
默认扫码页面可以使用scanBarcode.startScanForResult接口的回调函数错误码直接判断。
-
自定义扫码页面根据项目的不同架构,主要有@Entry修饰的生命周期和NavDestination承载的生命周期,可以根据实际使用的场景进行解决方案选择。
更多关于HarmonyOS鸿蒙Next中Scan Kit扫码服务,如何监听无操作返回事件的实战教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于HarmonyOS鸿蒙Next中Scan Kit扫码服务,如何监听无操作返回事件的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,使用Scan Kit扫码服务
在HarmonyOS鸿蒙Next中,使用Scan Kit扫码服务时,可以通过ScanKit
的ScanResultListener
接口来监听扫码结果。要监听无操作返回事件,可以在onScanResult
方法中判断扫码结果是否为空或无效。如果在一定时间内没有扫码操作,可以通过自定义计时器或Handler
来触发无操作返回事件。具体实现如下:
- 在
onScanResult
方法中,判断扫码结果是否为空或无效。 - 如果扫码结果为空或无效,启动一个计时器或
Handler
,设置一个超时时间。 - 在超时时间内,如果没有任何扫码操作,触发无操作返回事件。
示例代码片段:
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 {
// 处理无操作返回事件
}
}
通过这种方式,可以在扫码服务中监听无操作返回事件。