基本概念
自定义界面扫码能力提供了相机流控制接口,可根据自身需求自定义扫码界面,适用于对扫码界面有定制化需求的应用开发。
说明
通过自定义页面扫码可以实现应用内的扫码功能,为了应用更好的体验,推荐同时接入“扫码直达”服务,应用可以同时支持系统扫码入口(控制中心扫一扫)和应用内扫码两种方式跳转到指定服务页面。
场景介绍
自定义界面扫码能力提供扫码相机流控制接口,支持相机流的初始化、开启、暂停、释放、重新扫码功能;支持闪光灯的状态获取、开启、关闭;支持变焦比的获取和设置;支持设置相机焦点和连续自动对焦;支持对条形码、二维码、MULTIFUNCTIONAL CODE进行扫码识别(具体类型参见ScanType),并获得码类型、码值、码位置信息、相机预览流(YUV)。该能力可用于单码和多码的扫描识别。
开发者集成自定义界面扫码能力可以自行定义扫码的界面样式,请按照业务流程完成扫码接口调用实现实时扫码功能。建议开发者基于Sample Code做个性化修改。
说明
YUV(相机预览流图像数据)适合于扫码和识物的综合识别场景,开发者需要自己控制相机流,普通扫码场景无需关注。
约束与限制
- 需要请求相机的使用权限。
- 需要开发者自行实现扫码的人机交互界面。例如:多码场景需要暂停相机流由用户选择一个码图进行识别。
业务流程
- **发起请求:**用户向开发者的应用发起扫码请求,应用拉起已定义好的扫码界面。
- **申请授权:**应用需要向用户申请相机权限授权。若未同意授权,则无法使用此功能。
- **启动自定义界面扫码:**在扫码前必须调用init接口初始化自定义扫码界面,加载资源。相机流初始化结束后,调用start接口开始扫码。
- **自定义界面扫码相机操作:**可以配置自定义界面扫码相机操作参数,调整相应功能,包括闪光灯、变焦、焦距、暂停、重启扫码等。例如:
- 根据当前码图位置,比如当前码图太远或太近时,调用getZoom获取变焦比,setZoom接口设置变焦比,调整焦距以便于用户扫码。
- 根据当前扫码的光线条件或根据on(‘lightingFlash’)监听闪光灯开启时机,通过getFlashLightStatus接口先获取闪光灯状态,再调用openFlashLight/closeFlashLight接口控制闪光灯开启或关闭,以便于用户进行扫码。
- 调用setFocusPoint设置对焦位置,resetFocus恢复默认对焦模式,以便于用户进行扫码。
- 在应用处于前后台或其他特殊场景需要中断/重新进行扫码时,可调用stop或start接口来控制相机流达到暂停或重新扫码的目的。
- **自定义界面扫码:**Scan Kit API在扫码完成后会返回扫码结果。同时根据开发者的需要,Scan Kit API会返回每帧相机预览流数据。如需不重启相机并重新触发一次扫码,可以在start接口的Callback异步回调中,调用rescan接口。完成扫码后,需调用release接口进行释放扫码资源的操作。
- **获取结果:**解析码值结果跳转应用服务页。
接口说明
自定义界面扫码提供init、start、stop、release、getFlashLightStatus、openFlashLight、closeFlashLight、setZoom、getZoom、setFocusPoint、resetFocus、rescan、on(‘lightingFlash’)、off(‘lightingFlash’)接口,其中部分接口返回值有两种返回形式:Callback和Promise回调。Callback和Promise回调函数只是返回值方式不一样,功能相同。具体API说明详见接口文档。
开发步骤
自定义界面扫码接口支持自定义UI界面,识别相机流中的条形码,二维码以及MULTIFUNCTIONAL CODE,并返回码图的值、类型、码的位置信息(码图最小外接矩形左上角和右下角的坐标)以及相机预览流(YUV)。
以下示例为调用自定义界面扫码接口拉起相机流并返回扫码结果和相机预览流(YUV)。
-
在开发应用前,需要先申请相机相关权限,确保应用拥有访问相机的权限。在“module.json5”文件中配置相机权限,具体配置方式,请参见声明权限。
-
使用接口requestPermissionsFromUser请求用户授权。具体申请方式及校验方式,请参见向用户申请授权。
-
导入自定义界面扫码接口以及相关接口模块,导入方法如下。
import { scanCore, scanBarcode, customScan } from '@kit.ScanKit';
// 导入功能涉及的权限申请、回调接口
import { router, promptAction, display } from '@kit.ArkUI';
import { AsyncCallback, BusinessError } from '@kit.BasicServicesKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { common, abilityAccessCtrl } from '@kit.AbilityKit';
-
遵循业务流程完成自定义界面扫码功能。
说明
- 在设置start接口的viewControl参数时,width和height与XComponent的宽高值相同,start接口会根据XComponent的宽高比例从相机的分辨率选择最优分辨率,如果比例与相机的分辨率比例相差过大会返回内部错误。当前支持的分辨率比例为16:9、4:3、1:1。竖屏场景下,XComponent的高度需要大于宽度,且高宽比在支持的分辨率比例中。横屏场景下,XComponent的宽度需要大于高度,且宽高比在支持的分辨率比例中。
- XComponent的宽高需根据使用场景计算适配。例如:在开发设备为折叠屏时,需按照折叠屏的展开态和折叠态分别计算XComponent的宽高,start接口会根据XComponent的宽高适配对应的相机分辨率。设备屏幕宽高可通过display.getDefaultDisplaySync方法获取(获取的为px单位,需要通过px2vp方法转为vp)。
- 通过Promise方式回调,调用自定义界面扫码接口拉起相机流并返回扫码结果。
@Entry
@Component
struct CustomScanPage {
@State userGrant: boolean = false // 是否已申请相机权限
@State surfaceId: string = '' // xComponent组件生成id
@State isShowBack: boolean = false // 是否已经返回扫码结果
@State isFlashLightEnable: boolean = false // 是否开启了闪光灯
@State isSensorLight: boolean = false // 记录当前环境亮暗状态
@State cameraHeight: number = 640 // 设置预览流高度,默认单位:vp
@State cameraWidth: number = 360 // 设置预览流宽度,默认单位:vp
@State cameraOffsetX: number = 0 // 设置预览流x轴方向偏移量,默认单位:vp
@State cameraOffsetY: number = 0 // 设置预览流y轴方向偏移量,默认单位:vp
@State zoomValue: number = 1 // 预览流缩放比例
@State setZoomValue: number = 1 // 已设置的预览流缩放比例
@State scaleValue: number = 1 // 屏幕缩放比
@State pinchValue: number = 1 // 双指缩放比例
@State displayHeight: number = 0 // 屏幕高度,单位vp
@State displayWidth: number = 0 // 屏幕宽度,单位vp
@State scanResult: Array<scanBarcode.ScanResult> = [] // 扫码结果
private mXComponentController: XComponentController = new XComponentController()
private TAG: string = '[customScanPage]'
async onPageShow() {
// 自定义启动第一步,用户申请权限
await this.requestCameraPermission();
// 多码扫码识别,enableMultiMode: true 单码扫码识别enableMultiMode: false
let options: scanBarcode.ScanOptions = {
scanTypes: [scanCore.ScanType.ALL],
enableMultiMode: true,
enableAlbum: true
}
// 自定义启动第二步:设置预览流布局尺寸
this.setDisplay();
// 自定义启动第三步,初始化接口
customScan.init(options);
}
async onPageHide() {
// 页面消失或隐藏时,停止并释放相机流
this.userGrant = false;
this.isFl