0

从 android 11 开始,不推荐使用 setUserAuthenticationValidityDurationSeconds 以支持 KeyGenParameterSpec.Builder 中的 setUserAuthenticationParameters,但接缝对以前的版本有任何支持。

那么,最好的解决方案是什么?

KeyGenParameterSpec.Builder builder = new KeyGenParameterSpec.Builder(...)
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R)
    builder.setUserAuthenticationParameters(timeout, KeyProperties.AUTH_DEVICE_CREDENTIAL | KeyProperties.AUTH_BIOMETRIC_STRONG);
else
    //noinspection deprecation
    builder.setUserAuthenticationValidityDurationSeconds(timeout);

这个?

4

1 回答 1

3

您不需要迁移实际的密钥,当您准备好支持 Android 11 时,您可以切换到类似的东西,(不要忘记compileSdkVersion 30为新的 API 设置)

val timeout = 30 //seconds
val builder = KeyGenParameterSpec.Builder(...)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    builder.setUserAuthenticationParameters(timeout, 
       KeyProperties.AUTH_DEVICE_CREDENTIAL 
         or KeyProperties.AUTH_BIOMETRIC_STRONG
    )
} else {
    builder.setUserAuthenticationValidityDurationSeconds(timeout)
}

您可以这样做,因为内部setUserAuthenticationValidityDurationSeconds正在做同样的事情。唯一的例外是如果您setUserAuthenticationValidityDurationSeconds使用-1超时调用。在这种情况下,与新 API 等效的是builder.setUserAuthenticationParameters(0, KeyProperties.AUTH_BIOMETRIC_STRONG).

您可以在此处查看这两种情况的源代码。

PS:上面的代码是 minAPI 24,如果您处于较低的 API 级别,则需要将上面的代码包装在更多的构建检查中。

于 2021-02-05T17:03:06.607 回答