news 2026/10/26 8:27:32

HarmonyOS:人脸识别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HarmonyOS:人脸识别

一、开发者准备

应用在开发用户身份认证功能时,需要先了解以下流程,并根据实际需求参考对应指导开发。

  • 查询设备支持的用户身份认证能力。
  • 发起身份认证请求,获取身份认证结果。
  • 校验和使用认证结果:请参考通用密钥库二次认证密钥访问控制。
  • (可选)认证过程中取消认证。
  • (可选)切换自定义认证。
1.1 申请权限

在开发具备用户身份认证的应用前,需要先申请权限ohos.permission.ACCESS_BIOMETRIC,应用才能使用生物特征识别能力(如人脸、指纹)进行身份认证。


该权限授权方式为system_grant(系统授权),开发者只需要在module.json5配置文件的requestPermissions标签中声明权限,即可获取系统授权。

二、查询支持的认证能力

不同的设备对于认证能力(人脸、指纹、口令)的支持性各有差异,开发者在发起认证前应当先查询当前设备支持的用户认证能力。

2.1 接口说明

具体参数、返回值、错误码等描述,请参考对应的userAuth.getAvailableStatus。

接口名称功能描述
getAvailableStatus(authType : UserAuthType, authTrustLevel : AuthTrustLevel): void根据指定的认证类型、认证等级,检测当前设备是否支持相应的认证能力。
2.2 开发步骤
  1. 申请权限:ohos.permission.ACCESS_BIOMETRIC。
  2. 指定认证类型(UserAuthType)和认证等级(AuthTrustLevel),调用getAvailableStatus接口查询当前的设备是否支持相应的认证能力。
    认证可信等级的详细介绍请参见认证可信等级划分原则。

以查询设备是否支持认证可信等级≥ATL3的人脸认证功能为例:

obtainingSupported(){try{// 查询认证能力是否支持userAuth.getAvailableStatus(userAuth.UserAuthType.FACE,userAuth.AuthTrustLevel.ATL3);Logger.info('current auth trust level is supported.');returntrue;}catch(error){consterr:BusinessError=error as BusinessError;Logger.error(`current auth trust level is not supported,code is ${err?.code},message is ${err?.message}`);returnfalse;}}

示例2:

发起用户认证,采用认证可信等级≥ATL3的人脸+认证类型相关+复用设备解锁最大有效时长认证,获取认证结果。

initiatingUserAuthentication2(){// 设置认证参数let reuseUnlockResult:userAuth.ReuseUnlockResult={reuseMode:userAuth.ReuseMode.AUTH_TYPE_RELEVANT,reuseDuration:userAuth.MAX_ALLOWABLE_REUSE_DURATION,};try{constrandData=getRandData();if(!randData){return;}constauthParam:userAuth.AuthParam={challenge:randData,authType:[userAuth.UserAuthType.PIN,userAuth.UserAuthType.FACE,userAuth.UserAuthType.FINGERPRINT],authTrustLevel:userAuth.AuthTrustLevel.ATL3,reuseUnlockResult:reuseUnlockResult,};// 配置认证界面constwidgetParam:userAuth.WidgetParam={title:resourceToString($r('app.string.title')),};// 获取认证对象constuserAuthInstance=userAuth.getUserAuthInstance(authParam,widgetParam);Logger.info('get userAuth instance successfully.');// 订阅认证结果userAuthInstance.on('result',{onResult:(result:userAuth.UserAuthResult)=>{try{Logger.info('userAuthInstance callback.');this.result[ResultIndex.EXAMPLE_2]=(`${result.result}`);// 可在认证结束或其他业务需要场景,取消订阅认证结果。userAuthInstance.off('result');}catch(error){consterr:BusinessError=error as BusinessError;Logger.error(`onResult failed,code:${err?.code},Message:${err?.message}`);}}});// 启动认证userAuthInstance.start();Logger.info('auth start successfully.');}catch(error){consterr:BusinessError=error as BusinessError;Logger.error(`auth failed,code is ${err?.code},message is ${err?.message}`);}}

三、实战

效果图

设备录入面容进行人脸识别效果



设备没有录入面容进行人脸识别效果



示例代码
TestUserAuthInstance2.ets

import{userAuth}from'@kit.UserAuthenticationKit';import{promptAction}from'@kit.ArkUI';import{BusinessError}from'@kit.BasicServicesKit';import{cryptoFramework}from'@kit.CryptoArchitectureKit';import{JSON}from'@kit.ArkTS';functiongetRandData():Uint8Array|null{try{constrand=cryptoFramework.createRandom();constlen:number=16;let randData:Uint8Array|null=null;let retryCount=0;while(retryCount<3){randData=rand?.generateRandomSync(len)?.data;if(randData){break;}retryCount++;}returnrandData;}catch(error){consterr:BusinessError=error as BusinessError;console.error(`getRandData error,code is ${err?.code},message is ${err?.message}`);returnnull;}}@Entry @ComponentstructTestUserAuthInstance2{@State message:string='请面容解锁后查看下面的信息';@State lookData:boolean=false;@State result:string[]=newArray(8).fill('wait');/** * 以查询设备是否支持认证可信等级≥ATL3的人脸认证功能为例 * * @returns */obtainingSupported(){try{// 查询认证能力是否支持userAuth.getAvailableStatus(userAuth.UserAuthType.FACE,userAuth.AuthTrustLevel.ATL3);console.info('当前设备 支持 current auth trust level is supported.');returntrue;}catch(error){consterr:BusinessError=error as BusinessError;console.error(`当前设备 不支持 current auth trust level is not supported,code is ${err?.code},message is ${err?.message}`);returnfalse;}}/** * 发起用户认证,采用认证可信等级≥ATL3的人脸+指纹+锁屏口令认证,获取认证结果。 */initiatingUserAuthentication1(){try{constrandData=getRandData();if(!randData){return;}// 设置认证参数constauthParam:userAuth.AuthParam={challenge:randData,// authType: [userAuth.UserAuthType.PIN, userAuth.UserAuthType.FACE, userAuth.UserAuthType.FINGERPRINT],authType:[userAuth.UserAuthType.FACE],authTrustLevel:userAuth.AuthTrustLevel.ATL3,};// 配置认证界面constwidgetParam:userAuth.WidgetParam={title:"面容解锁",};// 获取认证对象constuserAuthInstance=userAuth.getUserAuthInstance(authParam,widgetParam);console.info('获取认证对象 get userAuth instance successfully.');// 订阅认证结果userAuthInstance.on('result',{onResult:(result:userAuth.UserAuthResult)=>{try{console.info('订阅认证结果 userAuthInstance callback.'+JSON.stringify(result));//认证结果。包含认证结果码、认证令牌(成功时)、认证类型和凭据状态等信息。应用应检查result.result字段判断认证是否成功://// - 若result.result为SUCCESS(12500000),表示认证通过,可使用result.token进行后续操作。//// - 若result.result为其他值,表示认证不通过,应根据具体错误码进行处理。if(result.result===12500000){this.lookData=true}else{this.lookData=true}// 可在认证结束或其他业务需要场景,取消订阅认证结果。userAuthInstance.off('result');}catch(error){consterr:BusinessError=error as BusinessError;console.error(`认证失败 onResult failed,code:${err?.code},Message:${err?.message}`);}}});// 启动认证userAuthInstance.start();console.info('启动认证 auth start successfully.');}catch(error){consterr:BusinessError=error as BusinessError;console.error(`启动认证 auth failed,code is ${err?.code},message is ${err?.message}`);}}build(){Column({space:30}){Text(this.message).margin({top:50}).fontSize($r('app.float.text_size_18fp')).onClick(()=>{let obtainingSupported=this.obtainingSupported();if(obtainingSupported){this.initiatingUserAuthentication1()}else{promptAction.openToast({message:"当前设备不支持面容解锁",duration:5000})}})Text("个人信息相关数据").fontSize(20).fontColor(Color.Black).visibility(this.lookData?Visibility.Visible:Visibility.None)}.height('100%').width('100%')}}

entry里module.json5,申请权限

"requestPermissions":[{"name":"ohos.permission.ACCESS_BIOMETRIC","reason":"$string:reason"}]
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/18 19:47:34

问卷样本多少钱一份

做调研绕不开预算问题。问"一份多少钱"的人&#xff0c;往往在得到报价之后更困惑——有人报几元一份&#xff0c;有人报上百元一份&#xff0c;差距能到十倍以上。这篇文章把价格讲清楚&#xff1a;单价由什么决定、不同人群大致落在哪个区间、报价便宜和贵背后差在…

作者头像 李华
网站建设 2026/10/26 8:27:30

押上四倍年销售额做 LabVIEW,后来上了 57 家杂志封面

公司一年卖 250 万美元的货&#xff0c;却拿出 1000 万美元去做一个没人见过的软件。这不是段子&#xff0c;是 NI 真实干过的事。Physics Today 的访谈里&#xff0c;Kodosky 回忆&#xff1a;NI 在 LabVIEW 上的研发投入大约是 1000 万美元——"那时候我们的年销售额&am…

作者头像 李华
网站建设 2026/10/26 8:27:26

claude-mem实战:解决Claude会话失忆的AI记忆管理方案

你有没有遇到过这种情况&#xff1a;和Claude聊了一个下午&#xff0c;把项目背景、技术选型、踩坑结论都聊透了&#xff0c;第二天打开新会话&#xff0c;它一脸茫然地看着你&#xff0c;仿佛昨天什么都没发生过。我一开始以为是自己没把上下文写清楚&#xff0c;后来发现这根…

作者头像 李华
网站建设 2026/10/15 9:42:44

运算符重载该写成成员还是非成员

运算符重载最容易被忽略的一个决策是&#xff1a;这个函数写在类里还是写在类外。看起来只是风格问题&#xff0c;实际上它直接决定了表达式的对称性&#xff1a;同一个 &#xff0c;写成成员时 2.0 v 编译不过&#xff0c;写成非成员就两边都能用。这篇把「谁该写在哪」讲到底…

作者头像 李华
网站建设 2026/10/15 8:38:45

PostgreSQL 使用 psql `\do` 命令查询运算符所有重载版本

文档教程知识库 【免费下载链接】til :memo: Today I Learned 项目地址&#xff1a; https://gitcode.com/gh_mirrors/ti/til 点击查看 免费下载 > 是 PostgreSQL 中最常见的包含&#xff08;containment&#xff09;运算符之一&#xff0c;常用于数组与 JSONB 的包含判断。…

作者头像 李华