二维码如今是移动应用流量入口以及功能实现的重要工具,也是各App的流量入口,使用场景愈加丰富,广泛应用于支付、出行、餐饮、生活服务、智慧生活、零售及广告营销等主流场景。
然而,在实际生活中,扫码环境如光照强度、扫码角度、距离等,相机功能如缩放、对焦、曝光等和码图本身完整程度、弯曲程度等很大程度上会影响用户的扫码体验。
HarmonyOS SDK 统一扫码服务(Scan Kit)作为软硬协同的系统级扫码服务,帮助开发者的应用快速构建面向各种场景的码图识别和生成能力。统一扫码服务应用了多项计算机视觉技术和AI算法技术,不仅实现了远距离自动扫码,同时还针对多种复杂扫码场景(如暗光、污损、模糊、小角度、曲面码等)做了识别优化,实现远距离码或小型码的检测和自动放大,提升扫码成功率与用户体验。
其中统一扫码服务的默认界面扫码能力提供系统级体验一致的扫码界面,包含相机预览流,相册扫码入口,暗光环境闪光灯开启提示,支持单码和多码识别,具备相机预授权,调用接口时,无需开发者再次申请相机权限。适用于不同扫码场景的应用开发。
能力优势
接入简单:一行代码,接入简单;系统级接口,包体0增加。
免弹窗:系统相机权限预授权,保护用户信息安全。
识别率高:应用多项CV技术,提升扫码成功率和速度。
识别距离远:应用端侧AI算法技术,实现远距离识码。
业务流程
开发步骤
统一扫码服务提供了默认界面扫码的能力,由扫码接口直接控制相机实现最优的相机放大控制、自适应的曝光调节、自适应对焦调节等操作,保障流畅的扫码体验,减少开发者的工作量。
以下示例为调用Scan Kit的startScanForResult接口跳转扫码页面。
1.导入默认界面扫码模块,scanCore提供扫码类型定义,scanBarcode提供拉起默认界面扫码的方法和参数,导入方法如下。
import { scanCore, scanBarcode } from '@kit.ScanKit'; // 导入默认界面需要的日志模块和错误码模块 import { hilog } from '@kit.PerformanceAnalysisKit'; import { BusinessError } from '@kit.BasicServicesKit';
2.调用startScanForResult方法拉起默认扫码界面。
通过Promise方式得到扫码结果。
[@Entry](https://my.oschina.net/u/4127701) [@Component](https://my.oschina.net/u/3907912) struct ScanBarCodePage { build() { Column() { Row() { Button("Promise with options") .backgroundColor('#0D9FFB') .fontSize(20) .fontColor('#FFFFFF') .fontWeight(FontWeight.Normal) .align(Alignment.Center) .type(ButtonType.Capsule) .width('90%') .height(40) .margin({ top: 5, bottom: 5 }) .onClick(() => { // 定义扫码参数options let options: scanBarcode.ScanOptions = { scanTypes: [scanCore.ScanType.ALL], enableMultiMode: true, enableAlbum: true }; // 可调用getContext接口获取当前页面关联的UIAbilityContext scanBarcode.startScanForResult(getContext(this), options).then((result: scanBarcode.ScanResult) => { // 收到扫码结果后返回 hilog.info(0x0001, '[Scan CPSample]', `Succeeded in getting ScanResult by promise with options, result is ${JSON.stringify(result)}`); }).catch((error: BusinessError) => { hilog.error(0x0001, '[Scan CPSample]', `Failed to get ScanResult by promise with options. Code:${error.code}, message: ${error.message}`); }); }) } .height('100%') } .width('100%') } }
通过Callback回调函数得到扫码结果。
@Entry @Component struct ScanBarCodePage { build() { Column() { Row() { Button('Callback with options') .backgroundColor('#0D9FFB') .fontSize(20) .fontColor('#FFFFFF') .fontWeight(FontWeight.Normal) .align(Alignment.Center) .type(ButtonType.Capsule) .width('90%') .height(40) .margin({ top: 5, bottom: 5 }) .onClick(() => { // 定义扫码参数options let options: scanBarcode.ScanOptions = { scanTypes: [scanCore.ScanType.ALL], enableMultiMode: true, enableAlbum: true }; // 可调用getContext接口获取当前页面关联的UIAbilityContext scanBarcode.startScanForResult(getContext(this), options, (error: BusinessError, result: scanBarcode.ScanResult) => { if (error) { hilog.error(0x0001, '[Scan CPSample]', `Failed to get ScanResult by callback with options. Code: ${error.code}, message: ${error.message}`); return; } // 收到扫码结果后返回 hilog.info(0x0001, '[Scan CPSample]', `Succeeded in getting ScanResult by callback with options, result is ${JSON.stringify(result)}`); }) }) } .height('100%') } .width('100%') } }
了解更多详情>>