Как я могу определить идентификатор хранилища аутентифицированного пальца через отражение в Android - PullRequest
0 голосов
/ 27 сентября 2019

Я начинающий разработчик, пытающийся создать приложение для Android, которое будет использоваться разными пользователями на одном устройстве.Я намерен использовать аутентификацию по отпечаткам пальцев, чтобы быстро идентифицировать разных пользователей.

Поэтому я зарегистрировал отпечатки пальцев разных пользователей на устройстве.Так как я могу получить список идентификаторов хранения отпечатков пальцев каждого отпечатка пальца через отражение (хотя это не рекомендуется и не поддерживается).Ниже приведен рабочий код для получения всех идентификаторов отпечатков пальцев на устройстве:

  public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {

 try {
            Method method = FingerprintManager.class.getDeclaredMethod("getEnrolledFingerprints");
            Object obj = method.invoke(mFingerprintManager);
            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 (null == item) {
                        continue;
                    }

                    Log.d(TAG, "fingerId: " + getFingerId.invoke(item));
                }
            }
        } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException | ClassNotFoundException e) {
            e.printStackTrace();
        }


    }

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


 public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {


        try {
            Field field = result.getClass().getDeclaredField("mFingerprint");
            field.setAccessible(true);
            Object fingerPrint = field.get(result);

            if (fingerPrint == null){
                Log.d(TAG, "name: fingerPrint is null");
        }
            Class<?> clzz = Class.forName("android.hardware.fingerprint.Fingerprint");
            Method getName = clzz.getDeclaredMethod("getName");
            Method getFingerId = clzz.getDeclaredMethod("getFingerId");
            Method getGroupId = clzz.getDeclaredMethod("getGroupId");
            Method getDeviceId = clzz.getDeclaredMethod("getDeviceId");

            CharSequence name = (CharSequence) getName.invoke(fingerPrint);
            int fingerId = (int) getFingerId.invoke(fingerPrint);
            int groupId = (int) getGroupId.invoke(fingerPrint);
            long deviceId = (long) getDeviceId.invoke(fingerPrint);

            Log.d(TAG, "name: " + name);
            Log.d(TAG, "fingerId: " + fingerId);
            Log.d(TAG, "groupId: " + groupId);
            Log.d(TAG, "deviceId: " + deviceId);
        } catch (NoSuchFieldException | IllegalAccessException | ClassNotFoundException | NoSuchMethodException | InvocationTargetException e) {
            e.printStackTrace();
        }

}

Я получаю эту ошибку:

 java.lang.NullPointerException: null receiver
        at java.lang.reflect.Method.invoke(Native Method)
        at com.example.android.fingerprintdialog.FingerprintUiHelper.onAuthenticationSucceeded(FingerprintUiHelper.java:130)

В этой строке кода:

CharSequence name = (CharSequence) getName.invoke(fingerPrint);

Любая помощь высоко ценится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...