Является ли Secure.ANDROID_ID уникальным для каждого устройства?

81

Я использую этот вызов:

Secure.getString(getApplicationContext().getContentResolver(), Secure.ANDROID_ID);

Чтобы получить UID для устройства. Я думаю, что получаю один и тот же идентификатор с нескольких устройств. Возможно ли это?

Идентификатор, о котором идет речь: 9774d56d682e549c, и, по-видимому, существует проблема с несколькими устройствами, возвращающими этот идентификатор http://code.google.com/p/android/issues/list?cursor=10603&updated=10603&ts=1295993403

FoamyGuy
источник
Я уверен, что после поиска нужного идентификатора и просмотра ветки об этом. Сначала я подумал, что, возможно, устройство возвращает null, и я поместил его где-то по умолчанию. Но это не так. Я точно знаю, что получаю одно и то же значение на нескольких устройствах.
FoamyGuy
1
Я нашел идеальный
вариант
В случаях, когда он не уникален, используйте эту библиотеку, которая поставляется с Identity.getDeviceId (context) .
caw

Ответы:

47

Проверьте в эту тему ,. Однако вы должны быть осторожны, поскольку это описано как «может измениться после сброса настроек». Используйте на свой страх и риск, и его можно легко изменить на рутированном телефоне. Кроме того , представляется, что некоторые производители имели проблемы с их телефонами дублированного номера ниткой . В зависимости от того, что вы пытаетесь сделать, я, вероятно, не буду использовать это как UID.

ниндзясенс
источник
19
жаль, что реализация ANDROID_ID такая ... хромая! Судя по документации Google, намерение заключалось в более длительном ID: A 64-bit number (as a hex string) that is randomly generated on the device's first boot and should remain constant for the lifetime of the device
Someone Somewhere
3
Согласно этой ссылке, «Кроме того, была обнаружена по крайней мере одна широко наблюдаемая ошибка в популярном телефоне от крупного производителя, где каждый экземпляр имеет один и тот же ANDROID_ID». Лучше не использовать
Мухаммад Рияз
2
Это было с 2011 года во времена Froyo. Сейчас это неактуально.
Обтин Самай,
Как насчет резервного копирования / восстановления устройства или клонирования устройства? есть идеи о возможности иметь такой же ANDROID_ID? при условии, что устройство не рутировано, конечно.
FunkSoulBrother
39

В Android O поведение ANDROID_ID изменится. ANDROID_ID будет отличаться для каждого приложения для каждого пользователя на телефоне.

Взято с: https://android-developers.googleblog.com/2017/04/changes-to-device-identifiers-in.html.

Android ID

В O Android ID (Settings.Secure.ANDROID_ID или SSAID) имеет разные значения для каждого приложения и каждого пользователя на устройстве. Разработчики, которым требуется идентификатор на уровне устройства, должны вместо этого использовать сбрасываемый идентификатор, например идентификатор рекламы, что дает пользователям больше контроля. Рекламный идентификатор также предоставляет пользователю настройку для ограничения отслеживания рекламы.

Дополнительно в Android O:

  • Значение ANDROID_ID не изменится при удалении / переустановке пакета, если имя пакета и ключ подписи совпадают. Приложения могут полагаться на это значение для поддержания состояния при повторной установке.
  • Если приложение было установлено на устройстве под управлением более ранней версии Android, идентификатор Android останется прежним при обновлении устройства до Android O, если приложение не будет удалено и переустановлено.
  • Значение Android ID изменяется только в том случае, если устройство сброшено к заводским настройкам или ключ подписи меняется между удалением и
    событиями повторной установки.
  • Это изменение требуется только для производителей устройств, поставляющих с сервисами Google Play и Advertising ID. Другие производители устройств могут предоставить альтернативный сбрасываемый идентификатор или продолжить предоставление идентификатора ANDROID.
userM1433372
источник
Благодарю. Я вытаскивал волосы, пытаясь понять, почему я не получаю тестовую рекламу в телефоне жены с использованием идентификатора (md5'ed), указанного в идентификаторе устройства, а затем почему это не соответствует значению, указанному в команде настроек оболочки adb. .. Я думал, что схожу с ума.
ecv
15

Так что, если вы хотите что-то уникальное для самого устройства, этого TM.getDeviceId() должно быть достаточно.

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

TelephonyManager tm = 
        (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
String androidId = Secure.getString(this.getContentResolver(), Secure.ANDROID_ID);
Log.d("ID", "Android ID: " + androidId);
Log.d("ID", "Device ID : " + tm.getDeviceId());

Обязательно примите разрешения TelephonyManagerс помощью

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
Винсент Веттукал
источник
3
Да, использование getDeviceId () тоже работает. Но вы должны быть очень осторожны, поскольку он может вернуть null. (На устройствах без 3G / телефонного модема) Решение, которое я использую, - это вернуться к mac-адресу Wi-Fi (который, конечно, также может отсутствовать, но обычно не на том же устройстве)
vdstw
19
Требовать READ_PHONE_STATEразрешения ужасно. ANDROID_IDВместо этого используйте .
dolmen
да, он может возвращать null на устройствах без 3G (их много на рынке), тогда вам следует использовать WiFi - его guid также может быть нулевым, пока вы не включите / выключите его хотя бы один раз после перезагрузки устройства. А если нет Wi-Fi ... настоящий кошмар, на windows ce был GUID для каждого устройства и жизнь была прекрасна.
Marcinj
После тысяч запросов выясняется, что идентификатор устройства, то есть IMEI, может быть продублирован на поддельных устройствах, что не является полным доказательством. Я возвращаюсь к использованию getSimSerialNumber и ANDROID_ID в качестве запасного варианта.
Аджибола
Android 10 (уровень API 29) добавляет ограничения для не сбрасываемых идентификаторов, которые включают как IMEI, так и серийный номер. Прежде чем реализовать этот TM.getDeviceId()подход, сначала ознакомьтесь с новыми требованиями к разрешениям для идентификаторов устройств на устройствах Android> = 10.
Иезекииль Себастин
6

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

Кажется, что это не предусмотрено требованиями соответствия Android, и поэтому производители, похоже, реализуют его так, как они хотят, включая некоторые, использующие его больше как идентификатор модели и т. Д.

Кроме того, имейте в виду, что даже если производитель написал генератор, чтобы сделать его UUID (например), не гарантируется, что он выдержит сброс до заводских настроек.

Squonk
источник
6
Я думаю, что он гарантированно НЕ выдержит сброс настроек к заводским настройкам, это упоминается где-то в документации. И это правильный способ его реализации.
Violet Giraffe
Итак, как мы можем создать GUID?
Игорь Ганапольский
6

Существует несколько решений, но ни одно из них не является идеальным. пойдем один за другим.

1. Unique Telephony Number (IMEI, MEID, ESN, IMSI)

  • Это решение должно запрашивать у пользователя android.permission.READ_PHONE_STATE, что может быть трудно оправдать в соответствии с типом созданного вами приложения.

  • Кроме того, это решение ограничено смартфонами, потому что на планшетах нет услуг телефонии. Одним из преимуществ является то, что значение сохраняется до заводских сбросов на устройствах.

2. MAC Address

  • Вы также можете попытаться получить MAC-адрес от устройства с оборудованием Wi-Fi или Bluetooth. Но это решение не рекомендуется, потому что не все устройства имеют подключение к Wi-Fi. Даже если у пользователя есть соединение Wi-Fi, оно должно быть включено для получения данных. В противном случае вызов не сообщает MAC-адрес.

3. Serial Number

  • Устройства без услуг телефонии, такие как планшеты, должны сообщать об уникальном идентификаторе устройства, который доступен через android.os.Build.SERIAL, начиная с Android 2.3 Gingerbread. Некоторые телефоны с услугами телефонии также могут определять серийный номер. Поскольку не все устройства Android имеют серийный номер, это решение ненадежно.

4. Secure Android ID

  • При первой загрузке устройства генерируется и сохраняется случайное значение. Это значение доступно через Settings.Secure.ANDROID_ID. Это 64-битное число, которое должно оставаться постоянным на протяжении всего срока службы устройства. ANDROID_ID кажется хорошим выбором для уникального идентификатора устройства, поскольку он доступен для смартфонов и планшетов.

    String androidId = Settings.Secure.getString(getContentResolver(),Settings.Secure.ANDROID_ID);
    
  • Однако значение может измениться, если на устройстве будет выполнен сброс настроек до заводских. Также существует известная ошибка в популярном телефоне от производителя, где у каждого экземпляра одинаковый ANDROID_ID. Ясно, что решение не на 100% надежно.

5. Use UUID

  • Поскольку для большинства приложений требуется идентифицировать конкретную установку, а не физическое устройство, хорошее решение для получения уникального идентификатора для пользователя, если использовать класс UUID. Следующее решение было представлено Рето Мейером из Google в презентации Google I / O:

    private static String uniqueID = null;
    private static final String PREF_UNIQUE_ID = "PREF_UNIQUE_ID";
    public synchronized static String id(Context context) {
       if (uniqueID == null) {
           SharedPreferences sharedPrefs = context.getSharedPreferences(
                   PREF_UNIQUE_ID, Context.MODE_PRIVATE);
           uniqueID = sharedPrefs.getString(PREF_UNIQUE_ID, null);
           if (uniqueID == null) {
               uniqueID = UUID.randomUUID().toString();
               Editor editor = sharedPrefs.edit();
               editor.putString(PREF_UNIQUE_ID, uniqueID);
               editor.commit();
           }
       }    return uniqueID;
    }
    

Определить конкретное устройство на Android - непростая задача. Есть много веских причин избегать этого. Лучшее решение - это, вероятно, идентифицировать конкретную установку с помощью решения UUID. кредит: блог

Радхи
источник
1

Просто укажите здесь альтернативное решение, идентификатор рекламы:

https://support.google.com/googleplay/android-developer/answer/6048248?hl=en

Скопировано по ссылке выше:

Рекламный идентификатор - это уникальный сбрасываемый пользователем идентификатор рекламы, предоставляемый сервисами Google Play. Это дает пользователям лучший контроль и предоставляет разработчикам простую стандартную систему для продолжения монетизации своих приложений. Он позволяет пользователям сбросить свой идентификатор или отказаться от персонализированной рекламы (ранее известной как реклама на основе интересов) в приложениях Google Play.

Ограничения:

  1. Только устройства с поддержкой Google Play.
  2. Политика конфиденциальности: https://support.google.com/googleplay/android-developer/answer/113469?hl=en&rd=1#privacy
полукруг21
источник
Будет ли это работать для телефонов, на которых нет Google Play (сервисов)?
Макс Уотерман,
Это не GUID
Игорь Ганапольский
0
//Fields
String myID;
int myversion = 0;


myversion = Integer.valueOf(android.os.Build.VERSION.SDK);
if (myversion < 23) {
        TelephonyManager mngr = (TelephonyManager) 
getSystemService(Context.TELEPHONY_SERVICE);
        myID= mngr.getDeviceId();
    }
    else
    {
        myID = 
Settings.Secure.getString(getApplicationContext().getContentResolver(), 
Settings.Secure.ANDROID_ID);
    }

Да, Secure.ANDROID_ID уникален для каждого устройства.

бораберка
источник