Чи є 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

1
Я знайшов ідеальний: stackoverflow.com/a/16929647/1318946
Pratik Butani

У випадках, коли це не унікально, використовуйте цю бібліотеку, яка постачається з Identity.getDeviceId (context) .
caw

Відповіді:


47

Перевірте в цю тему ,. Однак ви повинні бути обережними, оскільки це задокументовано як "може змінитися після скидання до заводських налаштувань". Використовуйте на свій страх і ризик, і його можна легко змінити на кореневому телефоні. Крім того, здається, ніби деякі виробники мали проблеми зі своїми телефонами, що мають нитку з повторюваними номерами . Залежно від того, що ви намагаєтесь зробити, я, мабуть, не використовував би це як UID.


19
прикро, що реалізація ANDROID_ID така ... кульгава! Судячи з документації Google, намір був більш тривалим посвідченням особи: 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
Хтось десь

3
Відповідно до цього посилання "Крім того, у популярній слухавці від великого виробника була принаймні одна широко помічена помилка, де кожен примірник має однаковий ANDROID_ID". Краще не використовувати його
Мухаммад Ріяз

2
Це було з 2011 року під час Фройо. Зараз це неактуально.
Обтін Самай

А як щодо резервного копіювання / відновлення пристрою або клонування пристрою? будь-яке уявлення про шанс мати той самий ANDROID_ID? припускаючи, що пристрій не кореневий, звичайно.
FunkSoulBrother

39

З 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 змінюється лише в тому випадку, якщо пристрій скидається до заводських налаштувань або якщо ключ підписання обертається між
    подіями видалення та перевстановлення.
  • Ця зміна потрібна лише для виробників пристроїв, які постачають із сервісами Google Play та рекламним ідентифікатором. Інші виробники пристроїв можуть надати альтернативний ідентифікатор, який можна скинути, або надалі надавати ідентифікатор ANDROID.

Дякую. Я висмикував волосся, намагаючись зрозуміти, чому я не отримую тестових оголошень на телефоні дружини за допомогою (md5'ed) ідентифікатора, про який повідомляє ідентифікатор пристрою, а потім, чому це не збігається зі значенням, повідомленим за допомогою команди налаштувань оболонки adb. .. Я думав, що зійшов з розуму.
Е

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 () також працює. Але ви повинні бути дуже обережними, оскільки це може повернути нуль. (На пристроях без модему 3g / телефон) Рішення, яке я використовую, - повернутися до мак-адреси Wi-Fi (яка, звичайно, також може бути відсутнім, але зазвичай не на цьому ж пристрої)
vdstw,

19
Потребувати READ_PHONE_STATEдозволу жахливо. Використовуйте ANDROID_IDзамість цього.
долмен

так, це може повернути значення null на пристроях без 3g (їх багато на ринку), тоді вам слід використовувати WiFi - його керівництво також може бути нульовим, доки ви не ввімкнете / вимкнете його хоча б один раз після перезавантаження пристрою. І якщо немає wifi ... справжній кошмар, на windows ce був GUID для кожного пристрою, і життя було прекрасним.
marcinj

після тисяч запитів виявляється, що ідентифікатор пристрою, який є IMEI, може бути продубльований на підроблених пристроях, отже, не повноцінним рішенням. Я повертаюся до використання getSimSerialNumber та ANDROID_ID як резервної копії.
Аджибола,

Android 10 (рівень API 29) додає обмеження для ідентифікаторів, які не можна скинути, які включають як IMEI, так і серійний номер. Перш ніж застосовувати TM.getDeviceId()підхід, спочатку ознайомтеся з новими вимогами до дозволів для ідентифікаторів пристроїв на пристроях Android> = 10.
Єзекіїль Себастін

6

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

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

Крім того, пам’ятайте, що навіть якщо виробник написав генератор, щоб зробити його UUID (наприклад), це не гарантує збереження заводських налаштувань.


6
Я думаю, це гарантовано НЕ витримає скидання заводських налаштувань за задумом, це згадується десь у документах. І це правильний спосіб його реалізації.
Вайолет Жираф

То як ми можемо створити 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

Це буде працювати для телефонів, які не мають Google Play (сервісів)?
Макс Вотерман

Це не
ГІД

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 унікальний для кожного пристрою.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.