【入门到精通】鸿蒙next应用开发:人脸识别验证实现案例

 往期鸿蒙5.0全套实战文章必看:(文中附带鸿蒙5.0全栈学习资料)


介绍

本示例介绍使用VisionKit(视觉服务)实现活体检测,使用CryptoArchitectureKit(加解密算法框架服务)实现加解密。该案例多用于实名认证、身份证上传等场景。

效果图预览

使用说明

  1. 首页签中登录按钮,拉起半模态弹窗。
  2. 半模态弹窗中点击同意协议认证按钮,开始人脸检测,检测完回到首页弹窗提示检测结果

实现思路

  1. 使用interactiveLiveness.startLivenessDetection方法,拉起活体检测页面。
public static privateStartDetection(routerOptions: interactiveLiveness.InteractiveLivenessConfig,
  permissionArr: Array<Permissions>) {
  let context = getContext();
  // 向用户申请权限,此处为相机权限
  abilityAccessCtrl.createAtManager().requestPermissionsFromUser(context, permissionArr).then((res) => {
    for (let i = 0; i < res.permissions.length; i++) {
      if (res.permissions[i] === 'ohos.permission.CAMERA' && res.authResults[i] === 0) {
        // 拉起活体检测
        interactiveLiveness.startLivenessDetection(routerOptions).then((DetectState: boolean) => {
        })
      }
    }
  })
}
  1. 使用interactiveLiveness.getInteractiveLivenessResult方法,获取活体检测结果。
public static getDetectionResultInfo() {
  // getInteractiveLivenessResult接口调用完会释放资源
  let resultInfo = interactiveLiveness.getInteractiveLivenessResult();
  const promise: Promise<interactiveLiveness.InteractiveLivenessResult> = new Promise((resolve, reject) => {
    resultInfo.then(async (data) => {
      if (data.mPixelMap !== undefined) {
        promptAction.showToast({
          message: $r('app.string.start_decrypt_success_text'),
          duration: promptActionDuration
        });
        resolve(data);
      } else {
        promptAction.showToast({
          message: $r('app.string.start_decrypt_error_text'),
          duration: promptActionDuration
        });
      }
    }).catch((err: BusinessError) => {
      if (err.code !== 1008302000) {
        promptAction.showToast({
          message: err.message + ',请重试',
          duration: promptActionDuration
        });
      }
      reject(err);
    })
  })
  return promise;
}
  1. 使用util工具类对图片base64和pixelmap互相转换。
export function arrayBufferToBase64(buffer: ArrayBuffer) {
  const base64Helper = new util.Base64Helper();
  let data = base64Helper.encodeSync(new Uint8Array(buffer.slice(0, buffer.byteLength)));
  let textDecoder = util.TextDecoder.create('utf-8', { ignoreBOM: true });
  return textDecoder.decodeToString(data, { stream: false });
}

4.通过cipher对象实现对图片和文字的加解密操作。

export async function encryptMessagePromise(plainText: string,
  cryptoMode: cryptoFramework.CryptoMode) {
  let base = new util.Base64Helper();
  // 通过指定算法名称,获取相应的Cipher实例。Cipher:提供加解密的算法操作功能。
  let cipher = cryptoFramework.createCipher('AES128|ECB|PKCS7');
  // 通过指定算法名称的字符串,获取相应的对称密钥生成器实例
  let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128');
  let keyMaterialBlob = genKeyMaterialBlob();
  // 异步根据指定数据生成对称密钥,通过注册回调函数获取结果。
  let promiseSymKey = await symKeyGenerator.convertKey(keyMaterialBlob)
  // 初始化加解密的cipher对象
  await cipher.init(cryptoMode, promiseSymKey, null);
  // 加密或者解密的数据
  let text: cryptoFramework.DataBlob =
    cryptoMode === cryptoFramework.CryptoMode.ENCRYPT_MODE ? { data: stringToUint8Array(plainText) } :
      { data: base.decodeSync(plainText) }
  const promise = new Promise<Uint8Array>(async (resolve, reject) => {
    // 获取加密数据
    await cipher.doFinal(text).then((res) => {
      resolve(res.data);
    }).catch((err: BusinessError) => {
      reject(err);
    })
  })
  return promise;
}

高性能知识点

不涉及

工程结构&模块类型

livedetectionandencryptiond                   // har类型(默认使用har类型,如果使用hsp类型请说明原因)
|---components
|   |---Encode.ets                            // 加解密&数据转换方法
|   |---StartFacialFecognition.ets            // 活体检测方法类
|---LiveDetectionAndEncryptionPage.ets        // 活体检测&加解密页面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值