Мы внедрили новый android.hardware.biometrics.BiometricPrompt, заменив существующий android.hardware.fingerprint.Новый API-интерфейс биометрии работает должным образом до тех пор, пока мы не получим «Предпочитаемую биометрию» как «Отпечаток пальца».
Когда мы установим «Предпочитаемую биометрию» как «Распознавание лица» и попытаемся использовать распознавание лица в качестве механизма аутентификациидля нашего приложения мы получаем «java.security.SignatureException: android.security.KeyStoreException: ключевой пользователь не аутентифицирован» в onAuthenticationSucceeded (результат BiometricPrompt.AuthenticationResult).
Эта проблема, кажется, воспроизводима на устройствах Samsung с Android P. Она отлично работает на устройствах Pixel с Android P (я полагаю, что в настоящее время устройство Pixel не обеспечивает поддержку распознавания лиц для сторонних приложений).
private BiometricPrompt.AuthenticationCallback getAuthenticationCallback() {
@Override
public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) {
Log.i(TAG, "onAuthenticationSucceeded");
super.onAuthenticationSucceeded(result);
Signature signature = result.getCryptoObject().getSignature();
try {
//Exception is thrown when we try to update the Signature with our message.
signature.update(mToBeSignedMessage.getBytes());
String signatureString = Base64.encodeToString(signature.sign(), Base64.URL_SAFE);
Log.i(TAG, "Message: " + mToBeSignedMessage);
Log.i(TAG, "Signature (Base64 EncodeD): " + signatureString);
Toast.makeText(getApplicationContext(), mToBeSignedMessage + ":" + signatureString, Toast.LENGTH_SHORT).show();
} catch (SignatureException e) {
Log.d(TAG, e.getLocalizedMessage());
//java.security.SignatureException: android.security.KeyStoreException: Key user not authenticated"
}
}
}
Почему я получаю «KeyStoreException: Ключевой пользователь не аутентифицирован», при попытке обновить значение подписи ТОЛЬКО когда «Предпочитаемая биометрическая» как «Распознавание лиц».