Как да извлечете уникален идентификационен номер за идентифициране на устройства с Android?

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

Например, когато искате:

  • идентифицира потребител на Android, който да съхранява резултати от игри на сървър
  • проследяване на инсталирането на приложения
  • генерирайте DRM за защита от копиране.

Има няколко решения, но нито едно не е перфектно. В този урок ще разгледаме пет решения и ще представим техните недостатъци:

1. Уникален телефонен номер (IMEI, MEID, ESN, IMSI)

Ако се насочвате само към смартфони, можете да се възползвате от факта, че устройството има телефонни услуги. Така че, можете лесно да извлечете уникален идентификационен номер, идентифициращ устройството.

Този уникален идентификационен номер може да бъде IMEI, MEID, ESN или IMSI. Те могат да бъдат определени както следва:

  • IMEI за идентичност на международното мобилно оборудване: Уникалният номер за идентифициране на GSM, WCDMA мобилни телефони, както и някои сателитни телефони
  • MEID за идентификатор на мобилно оборудване: глобално уникалният номер, идентифициращ физическа част от оборудване за мобилни станции CDMA, MEID е създаден да замени ESN (електронен сериен номер)
  • ESN за електронен сериен номер: уникалният номер за идентифициране на CDMA мобилни телефони
  • IMSI (Международна идентичност на мобилен абонат): уникалната идентификация, свързана с всички потребители на мобилни телефони на GSM и UMTS мрежа

За да извлечете уникалния идентификационен номер, свързан с вашето устройство, можете да използвате следния код:

импортиране на android.telephony.TelephonyManager;
импортиране на android.content.Context;
// ...
TelephonyManager telephonyManager;
telephonyManager = (TelephonyManager) getSystemService (контекст).
                    TELEPHONY_SERVICE);
/ *
* getDeviceId () връща уникалния идентификационен номер на устройството.
* Например IMEI за GSM и MEID или ESN за телефони CDMA.
* /
String deviceId = telephonyManager.getDeviceId ();
/ *
* getSubscriberId () връща уникалния идентификационен номер на абоната,
* Например IMSI за GSM телефон.
* /
String subscriberId = telephonyManager.getSubscriberId ();

Това решение трябва да поиска заявка за android.permission.READ_PHONE_STATE до вашия потребител, което може да бъде трудно да се обоснове следвайки типа на заявлението, което сте направили.

Освен това, това решение е ограничено до смартфони, тъй като таблетите нямат телефонни услуги. Едно предимство е, че стойността оцелява до фабричните нули на устройства.

2. MAC адрес

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

3. Сериен номер

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

4. Защитете Android ID

При първо зареждане на устройството се генерира и съхранява случайна стойност. Тази стойност е достъпна чрез Settings.Secure.ANDROID_ID. Това е 64-битово число, което трябва да остане постоянно за целия живот на устройството. ANDROID_ID изглежда добър избор за уникален идентификатор на устройство, тъй като е достъпен за смартфони и таблети. За да извлечете стойността, можете да използвате следния код:

String androidId = Settings.Secure.getString (getContentResolver (),
                     Settings.Secure.ANDROID_ID);

Стойността обаче може да се промени, ако на устройството се извърши фабрично нулиране. Има и известна грешка с популярна слушалка от производител, където всеки екземпляр има един и същ ANDROID_ID. Ясно е, че решението не е 100% надеждно.

5. Използвайте UUID

Тъй като изискването за повечето приложения е да се идентифицира определена инсталация, а не физическо устройство, добро решение за получаване на уникален идентификатор за потребителя, ако той използва клас UUID. Следното решение е представено от Рето Мейер от Google в презентация на Google I / O:

частен статичен String uniqueID = null;
частен статичен финален низ PREF_UNIQUE_ID = "PREF_UNIQUE_ID";
обществен синхронизиран статичен стринг идентификатор (контекст на контекста) {
   ако (uniqueID == null) {
      SharedPreferences sharedPrefs = context.getSharedPreferences (
         PREF_UNIQUE_ID, Context.MODE_PRIVATE);
      uniqueID = sharedPrefs.getString (PREF_UNIQUE_ID, null);
      ако (uniqueID == null) {
         uniqueID = UUID.randomUUID (). toString ();
         Редактор на редактора = sharedPrefs.edit ();
         editor.putString (PREF_UNIQUE_ID, uniqueID);
         editor.commit ();
      }
   }
    върнете уникален идентификатор;
}

Методът UUID.randomUUID () генерира уникален идентификатор за конкретна инсталация. Трябва само да запазите тази стойност и вашият потребител ще бъде идентифициран при следващото стартиране на вашето приложение. Можете също да опитате да свържете това решение с услугата Android Backup, за да запазите информацията достъпна за потребителя, дори ако той инсталира приложението ви на друго устройство.

заключение

Идентифицирането на конкретно устройство на Android не е лесно. Има много добри причини да се избегне това. Най-доброто решение вероятно е да се идентифицира конкретна инсталация чрез използване на UUID решение. Ако обаче искате да идентифицирате физически определено устройство, можете да опитате да използвате решението ANDROID_ID. Не 100% надеждни, но по-добри от другите решения.