从android 11 setUserAuthenticationValidityDurationSeconds不赞成在KeyGenParameterSpec中的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);
这个吗?
你不需要迁移实际的密钥,当你准备好支持Android 11时,你可以切换到这样的东西,(不要忘记为新的api设置compileSdkVersion 30
)
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级别,则需要将上面的代码包装在更多的构建检查中。