管理中心
我的

应用指纹登录开关已经打开,但仍显示未打开

问题现象

APP内开启指纹登录功能,验证指纹和登录密码之后返回到设置界面,设置界面显示为关闭状态,但功能实际已启用。

背景知识

  • userAuth.getUserAuthInstance:获取UserAuthInstance对象,用于执行用户身份认证,并支持使用统一用户身份认证控件。
  • UserAuthInstance:用于执行用户身份认证,并支持使用统一用户身份认证控件。

问题定位

  1. 根据用户提供的日志,查找UserAuthInstance关键字。
    收起
    自动换行
    深色代码主题
    复制
    1. CQ2401/应用包名/USER_AUTH_NAPI[GetUserAuthInstanceV10/user_auth_entry.cpp:555]: start
    2. CQ2401/应用包名/USER_AUTH_NAPI[InitUserAuthInstanceV10Constructor/user_auth_entry.cpp:337]: start
    3. CQ2401/应用包名/USER_AUTH_NAPI[CheckNapiType/user_auth_napi_helper.cpp:253]: check valuetype fail
    4. CQ2401/应用包名/USER_AUTH_NAPI[CheckNapiType/user_auth_napi_helper.cpp:253]: check valuetype fail
    5. CQ2401/应用包名/USER_AUTH_NAPI[InitChallenge/user_auth_instance_v10.cpp:148]: challenge size:6
    6. CQ2401/应用包名/USER_AUTH_NAPI[InitAuthType/user_auth_instance_v10.cpp:180]: get authType:4
    7. CQ2401/应用包名/USER_AUTH_NAPI[InitAuthType/user_auth_instance_v10.cpp:194]: authType size:1
    8. CQ2401/应用包名/USER_AUTH_NAPI[CheckNapiType/user_auth_api_helper.cpp:253]: check valuetype fail
    9. CQ2401/应用包名/USER_AUTH_NAPI[CheckTrustlevel/user_auth_instance_v10.cpp:218]: authTrustLevel:40000
    10. CQ2401/应用包名/USER_AUTH_NAPI[CheckNapiType/user_auth_api_helper.cpp:253]: check valuetype fail
    11. CQ2401/应用包名/USER_AUTH_NAPI[ProcessWindowMode/user_auth_instance_v10.cpp:467]: widgetParam title:请验证已有指纹, navBtnText:, winMode:3
    12. CQ2401/应用包名/USER_AUTH_NAPI[ProcessContext/user_auth_instance_v10.cpp:411]: process uiContext
    13. CQ2401/应用包名/USER_AUTH_NAPI[Init/user_auth_instance_v10.cpp:530]: Init SUCCESS
    14. CQ2401/应用包名/USER_AUTH_NAPI:[GetUserAuthInstanceV10/user_auth_entry.cpp:582]: GetUserAuthInstanceV10 SUCCESS
    15. CQ2401/应用包名/USER_AUTH_NAPI[Start/user_auth_instance_v10.cpp:301]: start
  2. 分析日志,得到如下报错。
    收起
    自动换行
    深色代码主题
    复制
    1. CQ2401/应用包名/USER_AUTH_NAPI[CheckNapiType/user_auth_api_helper.cpp:253]: check valuetype fail
    2. CQ2401/应用包名/USER_AUTH_NAPI[ProcessWindowMode/user_auth_instance_v10.cpp:467]: widgetParam title:请验证已有指纹, navBtnText:, winMode:3
    3. C014A0/composer_host/HDM[hdmcore]: ReportVsycEvent(Dev0vsyncThread) -72224385793723552_failed

分析结论

  1. 日志中提到CheckNapiType失败,是因为应用在调用UserAuthInstance的方法时,传入的参数类型不符合预期,这是应用与底层系统之间的状态同步问题导致的。例如,应用在获取UserAuthInstance后,没有正确地处理认证结果,导致状态更新不及时或状态不正确,从而使得指纹登录开关的显示状态与实际状态不一致。
  2. 日志中提到ReportVsyncEvent失败,可能与硬件或驱动有关。硬件或驱动问题会导致指纹传感器无法正确工作,从而使得指纹登录功能的开关状态显示不正确。经过验证,其他应用指纹功能能正常实现,说明不是指纹传感器的问题。

修改建议

按照指纹识别具体实现内容,检测并修复应用同步系统指纹功能状态的相关逻辑。

指纹识别具体实现:

  1. 指纹识别依赖系统的指纹设置,先在手机系统中设置指纹。
  2. 在module.json5文件中增加权限ohos.permission.ACCESS_BIOMETRIC。
    收起
    自动换行
    深色代码主题
    复制
    1. {
    2. "name": "ohos.permission.ACCESS_BIOMETRIC"
    3. },
  3. 实现认证逻辑。核心代码如下:
    收起
    自动换行
    深色代码主题
    复制
    1. import userAuth from '@ohos.userIAM.userAuth';
    2. @Entry
    3. @Component
    4. struct Index {
    5. private challenge: Uint8Array = new Uint8Array([49, 49, 49, 49, 49, 49]);
    6. private authType: userAuth.UserAuthType = userAuth.UserAuthType.FINGERPRINT;
    7. private authTrustLevel: userAuth.AuthTrustLevel = userAuth.AuthTrustLevel.ATL1;
    8. private authInstance: userAuth.UserAuthInstance | undefined = undefined;
    9. createInstance() {
    10. this.authInstance = undefined;
    11. const authParam: userAuth.AuthParam = {
    12. challenge: this.challenge,
    13. authType: [this.authType],
    14. authTrustLevel: this.authTrustLevel,
    15. };
    16. const widgetParam: userAuth.WidgetParam = {
    17. title: '请输入密码',
    18. };
    19. // AuthInstance对象,用于执行用户认证
    20. this.authInstance = userAuth.getUserAuthInstance(authParam, widgetParam);
    21. this.authInstance.on('result', {
    22. onResult(result) {
    23. console.info(`userAuth 验证成功: ${JSON.stringify(result)}`);
    24. }
    25. });
    26. // 开始认证
    27. this.authInstance.start();
    28. }
    29. build() {
    30. Row() {
    31. Column() {
    32. Button('指纹识别')
    33. .width(100)
    34. .onClick(() => {
    35. this.createInstance();
    36. });
    37. }
    38. .width('100%');
    39. }
    40. .height('100%');
    41. }
    42. }