请协助提供华为人脸识别和卡片识别前端页面demo;以及能否提供公安认证?https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-useriam-userauth-V5
目前api12版本提供了人脸活体识别和卡片识别功能,以下为为示例代码:人脸识别:import { common, abilityAccessCtrl, Permissions } from '@kit.AbilityKit'; import { interactiveLiveness } from "@kit.VisionKit"; import { BusinessError } from '@kit.BasicServicesKit'; @Entry @Component struct LivenessIndex { private context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; private array: Array<Permissions> = ["ohos.permission.CAMERA"]; @State actionsNum: number = 0; @State isSilentMode: string = 'INTERACTIVE_MODE'; @State routeMode: string = 'replace'; @State resultInfo: interactiveLiveness.InteractiveLivenessResult = { livenessType: 0 }; @State failResult: Record<string, number | string> = { 'code': 1008302000, 'message': '' }; build() { Stack({ alignContent: Alignment.Top }) { Column() { Row() { Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { Text('选择模式:') .fontSize(18) .width('25%') Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { Row() { Radio({ value: 'INTERACTIVE_MODE', group: 'isSilentMode' }).checked(true) .height(24) .width(24) .onChange((isChecked: boolean) => { this.isSilentMode = 'INTERACTIVE_MODE' }) Text('动作活体检测') .fontSize(16) } .margin({ right: 15 }) Row() { Radio({ value: 'SILENT_MODE', group: 'isSilentMode' }).checked(false) .height(24) .width(24) .onChange((isChecked: boolean) => { this.isSilentMode = 'SILENT_MODE'; }) Text('静默活体检测') .fontSize(16) } } .width('75%') } } .margin({ bottom: 30 }) Row() { Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { Text('验证完的跳转模式:') .fontSize(18) .width('25%') Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { Row() { Radio({ value: 'replace', group: 'routeMode' }).checked(true) .height(24) .width(24) .onChange((isChecked: boolean) => { this.routeMode = 'replace' }) Text('replace') .fontSize(16) } .margin({ right: 15 }) Row() { Radio({ value: 'back', group: 'routeMode' }).checked(false) .height(24) .width(24) .onChange((isChecked: boolean) => { this.routeMode = 'back'; }) Text('back') .fontSize(16) } } .width('75%') } } .margin({ bottom: 30 }) if (this.isSilentMode == 'INTERACTIVE_MODE') { Row() { Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { Text('动作数量:') .fontSize(18) .width('25%') TextInput({ placeholder: this.actionsNum != 0 ? this.actionsNum.toString() : "动作数量最多4个" }) .type(InputType.Number) .placeholderFont({ size: 18, weight: FontWeight.Normal, family: "HarmonyHeiTi", style: FontStyle.Normal }) .fontSize(18) .fontWeight(FontWeight.Bold) .fontFamily("HarmonyHeiTi") .fontStyle(FontStyle.Normal) .width('65%') .onChange((value: string) => { this.actionsNum = Number(value) as interactiveLiveness.ActionsNumber; }) } } } } .margin({ left: 24, top: 80 }) .zIndex(1) Stack({ alignContent: Alignment.Bottom }) { if (this.resultInfo?.mPixelMap) { Image(this.resultInfo?.mPixelMap) .width(260) .height(260) .align(Alignment.Center) .margin({ bottom: 260 }) Circle() .width(300) .height(300) .fillOpacity(0) .strokeWidth(60) .stroke(Color.White) .margin({ bottom: 250, left: 0 }) } Text(this.resultInfo.mPixelMap ? '检测成功' : this.failResult.code != 1008302000 ? '检测失败' : '') .width('100%') .height(26) .fontSize(20) .fontColor('#000000') .fontFamily('HarmonyHeiTi') .margin({ top: 50 }) .textAlign(TextAlign.Center) .fontWeight('Medium') .margin({ bottom: 240 }) if (this.failResult.code != 1008302000) { Text(this.failResult.message as string) .width('100%') .height(26) .fontSize(16) .fontColor(Color.Gray) .textAlign(TextAlign.Center) .fontFamily('HarmonyHeiTi') .fontWeight('Medium') .margin({ bottom: 200 }) } Button("开始检测", { type: ButtonType.Normal, stateEffect: true }) .width(192) .height(40) .fontSize(16) .backgroundColor(0x317aff) .borderRadius(20) .margin({ bottom: 56 }) .onClick(() => { this.privatestartDetection(); }) } .height('100%') } } onPageShow() { this.resultRelease(); this.getDectionRsultInfo(); } // 路由跳转到人脸活体验证控件 private privaterouterLibrary() { let routerOptions: interactiveLiveness.InteractiveLivenessConfig = { 'isSilentMode': this.isSilentMode as interactiveLiveness.DetectionMode, 'routeMode': this.routeMode as interactiveLiveness.RouteRedirectionMode, 'actionsNum': this.actionsNum } interactiveLiveness.startLivenessDetection(routerOptions).then((DetectState: boolean) => { console.info('LivenessCollectionIndex', `Succeeded in jumping.`); }).catch((err: BusinessError) => { console.error('LivenessCollectionIndex', `Failed to jump. Code:${err.code},message:${err.message}`); }) } // 校验CAMERA权限 private privatestartDetection() { abilityAccessCtrl.createAtManager().requestPermissionsFromUser(this.context, this.array).then((res) => { for (let i = 0; i < res.permissions.length; i++) { if (res.permissions[i] === "ohos.permission.CAMERA" && res.authResults[i] === 0) { this.privaterouterLibrary(); } } }) } // 获取验证结果 private getDectionRsultInfo() { // getInteractiveLivenessResult接口调用完会释放资源 let resultInfo = interactiveLiveness.getInteractiveLivenessResult(); resultInfo.then(data => { this.resultInfo = data; }).catch((err: BusinessError) => { this.failResult = { 'code': err.code, 'message': err.message } }) } // result release private resultRelease() { this.resultInfo = { livenessType: 0 } this.failResult = { 'code': 1008302000, 'message': '' } } }卡片识别:import { CardRecognition, CallbackParam, CardType } from "@kit.VisionKit"; import { hilog } from '@kit.PerformanceAnalysisKit'; /** * 卡证识别页,用于加载uiExtensionAbility * * @since 2024-02-27 */ @Component export struct CardDemoPage { build() { Stack({ alignContent: Alignment.Top }) { CardRecognition({ // 此处选择身份证类型作为示例 supportType: CardType.CARD_ID, callback: ((params: CallbackParam) => { hilog.info(0x0001, TAG, `params code: ${params.code}`) hilog.info(0x0001, TAG, `params cardType: ${params.cardType}`) hilog.info(0x0001, TAG, `params cardInfo front: ${JSON.stringify(params.cardInfo?.front)}`) hilog.info(0x0001, TAG, `params cardInfo back: ${JSON.stringify(params.cardInfo?.back)}`) }) }) } .width('100%') .height('100%') } }
目前api12版本提供了人脸活体识别和卡片识别功能,以下为为示例代码:
人脸识别:
卡片识别: