Ответ 1
Взгляните на статью Идентификация приложений. Вы не можете полагаться на ANDROID_ID
.
Лучшим решением является создание пользовательского идентификатора с помощью:
String id = UUID.randomUUID().toString();
Итак, я думал, что я умный и использую различные хэши и перестановки безопасного идентификатора Android для идентификации моих пользователей....
Но оказывается, что 9774d56d682e549c - это волшебный идентификатор, возвращаемый
Secure.getString(getContentResolver(), Secure.ANDROID_ID);
для большого количества устройств... Кажется, каждый эмулятор, который я построил, имеет тот же идентификатор, и многие другие телефоны других людей (много мотодистов!) и вспыхивающие моды ОС, как правило, возвращают эту же повторяющуюся ценность. Не-MotoDroid/Non-Flashed телефоны, похоже, все дают мне уникальную строку обратно. Но это один из моих БД около 60 раз!
Я собираюсь оптимизировать свое приложение, чтобы проверить эту строку перед регистрацией, но что было бы рекомендуемым способом обращения к ней, чтобы получить другое уникальное значение?
Моя текущая мысль состоит в том, чтобы проверить это, создать EXTREMELY LARGE случайное значение, хешировать его, а затем сохранить, чем в SharedPreferences
, а затем либо использовать ANDROID_ID или тот, который хранится в sharedprefs (если пользовательский телефон дает значение). У кого-нибудь есть лучшие идеи, или это кажется достаточно прочным, чтобы смягчить эту сумасшедшую ошибку?
Взгляните на статью Идентификация приложений. Вы не можете полагаться на ANDROID_ID
.
Лучшим решением является создание пользовательского идентификатора с помощью:
String id = UUID.randomUUID().toString();
Это явление, а также этот поток Stackoverflow обсуждались на summercon 2012 Oberheide и Miller, которые недавно расчленили Google Bouncer: http://jon.oberheide.org/files/summercon12-bouncer.pdf
Возможно, вы можете извлечь более полезную информацию для своего проекта.
Если вы хотите создать тот же формат, что и реальный ANDROID_ID
s, вы можете использовать тот же метод, который использует здесь:
private static String generateAndroidId() {
String generated = null;
try {
final SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
random.setSeed( (System.nanoTime() + new SecureRandom().nextLong()).getBytes() );
generated = Long.toHexString(random.nextLong());
} catch (NoSuchAlgorithmException e) {
Log.e(TAG, "Unexpected exception", e);
}
return generated;
}
Выходы: 9e7859438099538e
Хотя это не так, такие вещи, как SDK Google AdMob, используют разрешение android.permission.READ_PHONE_STATE
для чтения номера телефона устройства и т.д.
Вот некоторая полезная, связанная информация в следующем сообщении в блоге: http://strazzere.com/blog/?p=116