Как проверить, был ли добавлен новый палец?

У меня есть приложение с аутентификацией по отпечатку пальца. Он работал нормально, пока не был выпущен Android 8. Итак, проблема в том, что когда я регистрирую новые отпечатки пальцев, KeyPermanentlyInvalidatedException не появляется. Так что это происходит только на Android 8, более низкие API с этим справляются, и я могу проверить, был ли добавлен новый отпечаток этим исключением. Как я могу проверить новый отпечаток пальца в Android 8? Образец приложения Google — FingerprintDialog — также имеет ту же проблему. Он не видит изменений в регистрации нового отпечатка пальца. Открытая проблема Google: https://issuetracker.google.com/issues/65578763


person Vlad Melnikov    schedule 12.09.2017    source источник
comment
У вас есть идеи по поводу этого?   -  person Bahu    schedule 27.07.2018


Ответы (1)


у меня хорошие новости. я наконец взломал его.

Я могу получить все идентификаторы пальцев в целых числах.

private void getFingerprintInfo(Context context) 
{
    try {
        FingerprintManager fingerprintManager = (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE);
        Method method = FingerprintManager.class.getDeclaredMethod("getEnrolledFingerprints");
        Object obj = method.invoke(fingerprintManager);

        if (obj != null) {
            Class<?> clazz = Class.forName("android.hardware.fingerprint.Fingerprint");
            Method getFingerId = clazz.getDeclaredMethod("getFingerId");

            for (int i = 0; i < ((List) obj).size(); i++)
            {
                Object item = ((List) obj).get(i);
                if(item != null)
                {
                    System.out.println("fkie4. fingerId: " + getFingerId.invoke(item));
                }
            }
        }
    } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException | ClassNotFoundException e) {
        e.printStackTrace();
    }
}

см. здесь: https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/hardware/fingerprint/Fingerprint.java

существует общедоступный метод getFingerId(), но мы не можем его вызвать, потому что он имеет "@UnsupportedAppUsage".

поэтому вам нужно использовать отражение для вызова метода. после того, как вы получите список идентификаторов отпечатков пальцев, вы можете зашифровать их и сохранить в sharedPreference.

Идентификатор пальца — это идентификатор отпечатков пальцев, сохраненных в настройках.

После того, как вы получите все идентификаторы пальцев, вы можете определить, добавил ли пользователь отпечаток пальца или удалил его.

Не нужно рассчитывать на KeyPermanentlyInvalidatedException. Не закидывается в Android 8.0

Удачи!!!...

не верьте, что гугл сделал такую ​​плохую работу

person Frankie Mak    schedule 19.11.2018
comment
В устройствах Samsung идентификатор: 1 2 3 4, поэтому вы не можете правильно определить изменение - person Morteza Rastgoo; 03.09.2019