当前位置: 首页 > 知识库问答 >
问题:

使用设备凭据时Android生物识别技术无法导航

缪远航
2023-03-14

我正在使用生物识别库锁定应用程序。一切正常,当我用指纹解锁时,会调用AuthenticationSucceeded()get,设备会从锁屏中导航。然而,如果使用模式解锁,则会调用onAuthenticationSucceeded()get,但导航没有初始化,我被留在锁屏片段上。

编辑:这只影响具有任何设备凭据的API29

编辑2:我也得到了

FragmentNavigator:忽略popBackStack()调用:FragmentManager已经保存了它的状态

FragmentNavigator:忽略navigate()调用:FragmentManager已保存其状态

private lateinit var biometricPrompt: BiometricPrompt

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    biometricPrompt = createBiometricPrompt()
    return inflater.inflate(R.layout.lock_screen_fragment, container, false)
}

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)

    val isAppLockEnabled: Boolean = PreferenceManager.getDefaultSharedPreferences(context)
        .getBoolean("lock_app_preference", false)

    // If app locks is not set go to home fragment else display app lock screen
    if (!isAppLockEnabled) {
        findNavController().navigate(R.id.action_lock_screen_fragment_dest_to_home_fragment_dest)
    } else {

   

        // Prompt appears when user clicks "Unlock".
        unlock_button.setOnClickListener {
            val promptInfo = createPromptInfo()
            biometricPrompt.authenticate(promptInfo)
        }
   }

}

private fun createBiometricPrompt(): BiometricPrompt {
    val executor = ContextCompat.getMainExecutor(context)

    val callback = object : BiometricPrompt.AuthenticationCallback() {
        override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
            super.onAuthenticationError(errorCode, errString)
            Log.d("AuthenticationError()", "$errorCode :: $errString")
        }

        override fun onAuthenticationFailed() {
            super.onAuthenticationFailed()
            Log.d("AuthenticationFailed()", "Authentication failed for an unknown reason")
        }

        override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
            super.onAuthenticationSucceeded(result)
            lock_icon.setImageResource(R.drawable.ic_unlock)
            lock_screen_text_view.text = getString(R.string.app_unlocked)
        //This doesn't work when using pattern unlock   findNavController().navigate(R.id.action_lock_screen_fragment_dest_to_home_fragment_dest)
        }
    }

    return BiometricPrompt(this, executor, callback)
}

private fun createPromptInfo(): BiometricPrompt.PromptInfo {
    return BiometricPrompt.PromptInfo.Builder()
        .setTitle("Unlock App")
        .setConfirmationRequired(false)
        .setDeviceCredentialAllowed(true)
        .build()
}

}

共有1个答案

王兴腾
2023-03-14

好的,所以我解决了这个问题。将导航从onAuthenticationResume()移动到片段onResume()。设备凭据窗口暂停我的应用程序,之后不知何故无法调用导航。

解决方案代码:

private var isAppUnlocked : Boolean = false    


override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
            super.onAuthenticationSucceeded(result)
            isAppUnlocked = true
            unlockApp()
            Log.d("AuthenticationSuccess", "Authentication succeeded")
        }    

override fun onResume() {
    super.onResume()
    if(isAppUnlocked){
        unlockApp()
    }
}    

private fun unlockApp(){
    lock_icon.setImageResource(R.drawable.ic_unlock)
    lock_screen_text_view.text = getString(R.string.app_unlocked)
    findNavController().navigate(R.id.action_lock_screen_fragment_dest_to_home_fragment_dest)
}    
 类似资料:
  • 我试图连接网络应用程序中的生物识别设备。我在windows应用程序中工作正常,但在web中它会抛出错误。 Windows窗体。反恐精英: 表单设计器: 同样,我尝试在web应用程序中连接,但它显示错误:Webform1: 它抛出错误作为 无法实例化ActiveX控件“87733ee1-d095-442b-a200-6de90c5c8318”,因为当前线程不在单线程单元中。 动态链接库: 谁能帮我纠

  • 我最近购买了uface 800 ZKTeco生物识别设备,并创建了从该设备中提取考勤日志的应用程序。一切正常,但每当我们通过关闭/打开电源重新启动机器时,我无法连接到机器。我试图从命令提示符ping分配给设备的IP,但无法ping,它说“请求超时”。我阅读了SDK提供的文档,但没有得到任何解决方案。国王帮我解决这个问题。

  • 问题就在这里。我想在我的设备(三星Galaxy Ace 2)上运行我的Android Studio应用程序。但对我没什么用。告诉我我错过了什么: 2)安装了ADB驱动程序(在设备管理器中可以看到Android Composite ADB接口) 3)ADB设备列表仍然清晰,即使我重置服务器(ADB kill-server,ADB start-server,ADB devices-设备列表清晰) 4)

  • codenameone是否支持 androidx.biometric。生物提示 android.hardware.biometrics.Biometroprompt 我试图在codeoneproject中使用这些类,但我从构建服务器得到了以下错误:错误:包android.hardware.biometrics不存在错误:包androidx.biometric不存在 您是否计划支持生物识别提示?

  • ADB无法识别我的Redmi Notes设备。我正在使用Windows8 另外,当我在CMD中使用下面的命令时,它显示的是adb设备 我遵循下面链接中的程序, 使用硬件设备