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

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

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

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

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

6 ответов

Решение

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

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

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

Идентификатор Android

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

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

  • Значение ANDROID_ID не изменится при удалении / переустановке пакета, если имя пакета и ключ подписи совпадают. Приложения могут полагаться на это значение для поддержания состояния при переустановках.
  • Если приложение было установлено на устройстве под управлением более ранней версии Android, идентификатор Android остается неизменным при обновлении устройства до Android O, если только приложение не удалено и не установлено заново.
  • Значение Android ID изменяется только в том случае, если устройство сбрасывается до заводских настроек или ключ подписи вращается между удалением и
    переустановить события.
  • Это изменение требуется только для производителей устройств, которые предоставляют услуги Google Play и ID рекламы. Другие производители устройств могут предоставить альтернативный сбрасываемый идентификатор или продолжать предоставлять идентификатор ANDROID.

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

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. кредит: блог

Так что если вы хотите что-то уникальное для самого устройства, 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" />

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

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

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

Просто перечислите альтернативное решение здесь, ID рекламы:

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
//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 уникален для каждого устройства.

Другие вопросы по тегам