Я начинающий разработчик, пытающийся создать приложение для 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);
Любая помощь высоко ценится.