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

#### 问题现象

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

#### 背景知识

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

#### 问题定位

1.  根据用户提供的日志，查找UserAuthInstance关键字。
    
    ```
    CQ2401/应用包名/USER_AUTH_NAPI[GetUserAuthInstanceV10/user_auth_entry.cpp:555]: start  
    CQ2401/应用包名/USER_AUTH_NAPI[InitUserAuthInstanceV10Constructor/user_auth_entry.cpp:337]: start  
    CQ2401/应用包名/USER_AUTH_NAPI[CheckNapiType/user_auth_napi_helper.cpp:253]: check valuetype fail  
    CQ2401/应用包名/USER_AUTH_NAPI[CheckNapiType/user_auth_napi_helper.cpp:253]: check valuetype fail  
    CQ2401/应用包名/USER_AUTH_NAPI[InitChallenge/user_auth_instance_v10.cpp:148]: challenge size:6  
    CQ2401/应用包名/USER_AUTH_NAPI[InitAuthType/user_auth_instance_v10.cpp:180]: get authType:4  
    CQ2401/应用包名/USER_AUTH_NAPI[InitAuthType/user_auth_instance_v10.cpp:194]: authType size：1
    CQ2401/应用包名/USER_AUTH_NAPI[CheckNapiType/user_auth_api_helper.cpp:253]: check valuetype fail  
    CQ2401/应用包名/USER_AUTH_NAPI[CheckTrustlevel/user_auth_instance_v10.cpp:218]: authTrustLevel:40000  
    CQ2401/应用包名/USER_AUTH_NAPI[CheckNapiType/user_auth_api_helper.cpp:253]: check valuetype fail  
    CQ2401/应用包名/USER_AUTH_NAPI[ProcessWindowMode/user_auth_instance_v10.cpp:467]: widgetParam title:请验证已有指纹, navBtnText:, winMode:3  
    CQ2401/应用包名/USER_AUTH_NAPI[ProcessContext/user_auth_instance_v10.cpp:411]: process uiContext  
    CQ2401/应用包名/USER_AUTH_NAPI[Init/user_auth_instance_v10.cpp:530]: Init SUCCESS 
    CQ2401/应用包名/USER_AUTH_NAPI:[GetUserAuthInstanceV10/user_auth_entry.cpp:582]: GetUserAuthInstanceV10 SUCCESS
    CQ2401/应用包名/USER_AUTH_NAPI[Start/user_auth_instance_v10.cpp:301]: start
    ```
    
2.  分析日志，得到如下报错。
    
    ```
    CQ2401/应用包名/USER_AUTH_NAPI[CheckNapiType/user_auth_api_helper.cpp:253]: check valuetype fail  
    CQ2401/应用包名/USER_AUTH_NAPI[ProcessWindowMode/user_auth_instance_v10.cpp:467]: widgetParam title:请验证已有指纹, navBtnText:, winMode:3  
    C014A0/composer_host/HDM[hdmcore]: ReportVsycEvent(Dev0vsyncThread) -72224385793723552_failed
    ```
    

#### 分析结论

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

#### 修改建议

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

指纹识别具体实现：

1.  指纹识别依赖系统的指纹设置，先在手机系统中设置指纹。
2.  在module.json5文件中增加权限ohos.permission.ACCESS\_BIOMETRIC。
    
    ```
    {
      "name": "ohos.permission.ACCESS_BIOMETRIC"
    },
    ```
    
3.  实现认证逻辑。核心代码如下：
    
    ```
    import userAuth from '@ohos.userIAM.userAuth';
    
    @Entry
    @Component
    struct Index {
      private challenge: Uint8Array = new Uint8Array([49, 49, 49, 49, 49, 49]);
      private authType: userAuth.UserAuthType = userAuth.UserAuthType.FINGERPRINT;
      private authTrustLevel: userAuth.AuthTrustLevel = userAuth.AuthTrustLevel.ATL1;
      private authInstance: userAuth.UserAuthInstance | undefined = undefined;
    
      createInstance() {
        this.authInstance = undefined;
        const authParam: userAuth.AuthParam = {
          challenge: this.challenge,
          authType: [this.authType],
          authTrustLevel: this.authTrustLevel,
        };
        const widgetParam: userAuth.WidgetParam = {
          title: '请输入密码',
        };
        // AuthInstance对象，用于执行用户认证
        this.authInstance = userAuth.getUserAuthInstance(authParam, widgetParam);
        this.authInstance.on('result', {
          onResult(result) {
            console.info(`userAuth 验证成功: ${JSON.stringify(result)}`);
          }
        });
        // 开始认证
        this.authInstance.start();
      }
    
      build() {
        Row() {
          Column() {
            Button('指纹识别')
              .width(100)
              .onClick(() => {
                this.createInstance();
              });
          }
          .width('100%');
        }
        .height('100%');
      }
    }
    ```