Уникальный идентификатор Android-устройства

Мне нужен уникальный идентификатор устройства Android. Я пробовал его со следующим кодом

String ts = Context.TELEPHONY_SERVICE; TelephonyManager telephonyManager = (TelephonyManager) this.getSystemService(ts); 

Однако я знаю, что это работает только для телефонов.

Что делать, если мое приложение работает на ноутбуке, нетбуке или другом устройстве? Как получить уникальный идентификатор в этом случае?

Посмотрите на константу ANDROID_ID в файле android.provider.Secure.Settings чтобы узнать, помогает ли это.

Я добавляю несколько полезных ссылок из официальных документов;

  • Рекомендации по уникальным идентификаторам
  • Изменения в идентификаторах устройств в Android O

На телефоне Android есть три типа идентификаторов.

  1. IMEI
  2. IMSI

     String ts = Context.TELEPHONY_SERVICE; TelephonyManager mTelephonyMgr = (TelephonyManager) getSystemService(ts); String imsi = mTelephonyMgr.getSubscriberId(); String imei = mTelephonyMgr.getDeviceId(); 
  3. Android ID Это 64-разрядная шестнадцатеричная строка, которая генерируется при первой загрузке устройства. Как правило, он не будет изменен, если не будет сброшена заводская установка.

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

Это не будет работать для всех устройств.

Некоторые из устройств Android имеют проблемы. Некоторые устройства возвращают значение null, когда мы пытаемся получить идентификатор устройства. Единственный способ решить эту проблему – создать псевдо-идентификатор, который должен быть создан самим пользователем. Эта функция создаст уникальный идентификатор устройства для вас . Вы можете вносить изменения в эту функцию по мере необходимости. Я слишком много боролся за решение этой проблемы.

 public String getDeviceID() { /*String Return_DeviceID = USERNAME_and_PASSWORD.getString(DeviceID_key,"Guest"); return Return_DeviceID;*/ TelephonyManager TelephonyMgr = (TelephonyManager) getApplicationContext().getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE); String m_szImei = TelephonyMgr.getDeviceId(); // Requires // READ_PHONE_STATE // 2 compute DEVICE ID String m_szDevIDShort = "35" + // we make this look like a valid IMEI Build.BOARD.length() % 10 + Build.BRAND.length() % 10 + Build.CPU_ABI.length() % 10 + Build.DEVICE.length() % 10 + Build.DISPLAY.length() % 10 + Build.HOST.length() % 10 + Build.ID.length() % 10 + Build.MANUFACTURER.length() % 10 + Build.MODEL.length() % 10 + Build.PRODUCT.length() % 10 + Build.TAGS.length() % 10 + Build.TYPE.length() % 10 + Build.USER.length() % 10; // 13 digits // 3 android ID - unreliable String m_szAndroidID = Secure.getString(getContentResolver(),Secure.ANDROID_ID); // 4 wifi manager, read MAC address - requires // android.permission.ACCESS_WIFI_STATE or comes as null WifiManager wm = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE); String m_szWLANMAC = wm.getConnectionInfo().getMacAddress(); // 5 Bluetooth MAC address android.permission.BLUETOOTH required BluetoothAdapter m_BluetoothAdapter = null; // Local Bluetooth adapter m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); String m_szBTMAC = m_BluetoothAdapter.getAddress(); System.out.println("m_szBTMAC "+m_szBTMAC); // 6 SUM THE IDs String m_szLongID = m_szImei + m_szDevIDShort + m_szAndroidID+ m_szWLANMAC + m_szBTMAC; System.out.println("m_szLongID "+m_szLongID); MessageDigest m = null; try { m = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } m.update(m_szLongID.getBytes(), 0, m_szLongID.length()); byte p_md5Data[] = m.digest(); String m_szUniqueID = new String(); for (int i = 0; i < p_md5Data.length; i++) { int b = (0xFF & p_md5Data[i]); // if it is a single digit, make sure it have 0 in front (proper // padding) if (b <= 0xF) m_szUniqueID += "0"; // add number to string m_szUniqueID += Integer.toHexString(b); } m_szUniqueID = m_szUniqueID.toUpperCase(); Log.i("-------------DeviceID------------", m_szUniqueID); Log.d("DeviceIdCheck", "DeviceId that generated MPreferenceActivity:"+m_szUniqueID); return m_szUniqueID; } 

Извините, что ударил старый поток, но эта проблема дает мне головную боль, я нашел хорошую статью для кого-то читать, и это очень помогает мне.

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

Это также полезно в тех случаях, когда разработчик Android хочет отправить Push-сообщения только нескольким конкретным устройствам. Поэтому здесь необходимо иметь UDID для каждого устройства.

В Android существует много альтернатив UDID устройства. Ниже перечислены некоторые из способов получения UDID в приложении android с его преимуществами и недостатками и любыми необходимыми разрешениями для получения идентификатора устройства.

  • IMEI: (Международная идентификация мобильного оборудования)
  • Идентификатор Android
  • Строка MAC-адреса WLAN
  • Строка адреса Bluetooth

1) IMEI: (Международная идентификация мобильного оборудования)

Номер IMEI является очень хорошим и основным источником для получения идентификатора устройства. Он уникален для каждого устройства и зависит от устройства. Таким образом, он также уникален для каждого устройства и является постоянным до срока службы устройства.

Фрагмент кода для получения IMEI устройства приведен ниже,

 TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE); String m_deviceId = TelephonyMgr.getDeviceId(); 

Для этого вашему приложению потребуется разрешение «android.permission.READ_PHONE_STATE», указанное в файле манифеста.

Преимущества использования IMEI в качестве идентификатора устройства:

IMEI уникален для каждого устройства. Он остается уникальным для устройства, даже если приложение переустановлено или устройство укоренено или сброшено с завода.

Недостатки использования IMEI в качестве идентификатора устройства:

IMEI зависит от слота Simcard устройства, поэтому невозможно получить IMEI для устройств, которые не используют SIM-карту. В устройствах Dual sim мы получаем 2 разных IMEI для одного и того же устройства, так как у него есть 2 слота для simcard.

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

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

Код для получения Android_ID показан ниже,

 String m_androidId = Secure.getString(getContentResolver(), Secure.ANDROID_ID); 

Преимущества использования Android_ID в качестве ID устройства:

Это уникальный идентификатор для всех типов устройств (смартфонов и планшетов). Нет необходимости в каких-либо разрешениях.

Он останется уникальным во всех устройствах и работает на телефонах без слота Simcard.

Недостатки использования Android_ID в качестве идентификатора устройства:

Если версия ОС Android обновляется пользователем, тогда это может измениться. Идентификатор изменяется, если устройство подключено, или на устройстве выполняется сброс настроек. Также существует известная проблема с китайским производителем Android-устройства, что некоторые устройства имеют тот же Android_ID.

3) Строка MAC-адреса WLAN

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

Фрагмент кода для получения MAC-адреса WLAN для устройства приведен ниже,

 WifiManager m_wm = (WifiManager)getSystemService(Context.WIFI_SERVICE); String m_wlanMacAdd = m_wm.getConnectionInfo().getMacAddress(); 

Вашему приложению потребуется разрешение «android.permission.ACCESS_WIFI_STATE», указанное в файле манифеста.

Преимущества использования MAC-адреса WLAN в качестве идентификатора устройства:

Это уникальный идентификатор для всех типов устройств (смартфонов и планшетов). Он остается уникальным, если приложение переустановлено.

Недостатки использования MAC-адреса WLAN в качестве идентификатора устройства:

Если устройство не имеет wifi-оборудования, тогда вы получаете нулевой MAC-адрес, но обычно видно, что большинство устройств Android имеют аппаратное обеспечение wifi, и на рынке почти нет устройств с отсутствием оборудования Wi-Fi.

4) Строка адреса Bluetooth

Мы также можем получить уникальный идентификатор телефонов android с помощью устройства Bluetooth. Адрес устройства Bluetooth уникален для каждого устройства, имеющего Bluetooth-оборудование.

Фрагмент кода для получения адреса устройства Bluetooth приведен ниже,

 BluetoothAdapter m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); String m_bluetoothAdd = m_BluetoothAdapter.getAddress(); 

Чтобы получить вышеуказанный код, вашему приложению требуется разрешение «android.permission.BLUETOOTH», указанное в файле манифеста.

Преимущества использования адреса устройства Bluetooth в качестве идентификатора устройства: он является уникальным идентификатором для всех типов устройств (смартфонов и планшетов). Как правило, на всех устройствах имеется одно Bluetooth-оборудование, и оно не изменяется.

Недостатки использования адреса устройства Bluetooth в качестве идентификатора устройства: если устройство не имеет оборудования Bluetooth, вы получаете нуль.

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

Если есть какие-либо другие методы получения UDID, и это покрывает недостатки вышеописанных методов, то я бы хотел изучить их в своем приложении для Android. Pl. Поделитесь ими в поле комментариев, а также в случае каких-либо предложений или запросов.

Вот статья

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

http://android-developers.blogspot.com/2011/03/identifying-app-installations.html

Кажется, наилучшим способом является создание одного из вас при установке и последующее его чтение при повторном запуске приложения.

Я лично считаю это приемлемым, но не идеальным. Ни один идентификатор, предоставляемый Android, не работает во всех случаях, поскольку большинство из них зависит от состояния радиосвязи телефона (включение / выключение Wi-Fi, включение / выключение соты, включение / выключение Bluetooth). Другие, такие как Settings.Secure.ANDROID_ID, должны быть реализованы изготовителем и не гарантированы быть уникальными.

Ниже приведен пример записи данных в файл INSTALLATION, который будет храниться вместе с любыми другими данными, которые приложение сохраняет локально.

 public class Installation { private static String sID = null; private static final String INSTALLATION = "INSTALLATION"; public synchronized static String id(Context context) { if (sID == null) { File installation = new File(context.getFilesDir(), INSTALLATION); try { if (!installation.exists()) writeInstallationFile(installation); sID = readInstallationFile(installation); } catch (Exception e) { throw new RuntimeException(e); } } return sID; } private static String readInstallationFile(File installation) throws IOException { RandomAccessFile f = new RandomAccessFile(installation, "r"); byte[] bytes = new byte[(int) f.length()]; f.readFully(bytes); f.close(); return new String(bytes); } private static void writeInstallationFile(File installation) throws IOException { FileOutputStream out = new FileOutputStream(installation); String id = UUID.randomUUID().toString(); out.write(id.getBytes()); out.close(); } } 

Используйте MAC-адрес :

Адрес управления доступом к среде передачи (MAC-адрес) – это уникальный идентификатор, назначенный сетевым интерфейсам

У любого устройства, подключенного к сети, гарантированно есть MAC-адрес, и вы можете найти его на Android, выбрав «Настройки»> «О телефоне»> «Состояние».

Вы должны получить Bluetooth-адрес Bluetooth с помощью API Bluetooth .

На данный момент я не могу писать комментарии, поэтому пишу здесь.

Вы можете получить MAC-адрес, если в системе включено сетевое устройство (Bluetooth и т. Д.) (Включено). Но устройство может иметь bluetooth или wi-fi и т. Д. Или ничего

Вы можете написать свой собственный уникальный генератор Id (например, с 20 номерами или символами)

Settings.Secure # ANDROID_ID возвращает идентификатор Android в виде уникальной 64-разрядной шестнадцатеричной строки.

 import android.provider.Settings.Secure; private String android_id = Secure.getString(getContext().getContentResolver(), Secure.ANDROID_ID); 
 final TelephonyManager tm = (TelephonyManager) getBaseContext().getSystemService(Context.TELEPHONY_SERVICE); final String tmDevice, tmSerial, tmPhone, androidId; tmDevice = "" + tm.getDeviceId(); tmSerial = "" + tm.getSimSerialNumber(); androidId = "" + android.provider.Settings.Secure.getString(getContentResolver(), android.provider.Settings.Secure.ANDROID_ID); UUID deviceUuid = new UUID(androidId.hashCode(), ((<span id="IL_AD3" class="IL_AD">long</span>)tmDevice.hashCode() << 32) | tmSerial.hashCode()); String deviceId = deviceUuid.toString(); 
 TextView textAndroidId = (TextView)findViewById(R.id.androidid); String AndroidId = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID); textAndroidId.setText("My ID is: " + AndroidId); 

Вы можете попробовать следующее:

 String deviceId = Secure.getString(this.getContentResolver(), Secure.ANDROID_ID); 
Intereting Posts
Использование библиотеки образцов для биллинга в приложении в Android: интерфейс, созданный IInAppBillingService.aidl Java-Android-время процесса в выражении IF (код реального времени) Проблемы при импорте имиджа Передача пользовательских объектов между действиями? Затухать / исчезать в TextView на основе прокрутки Android, как изменить размер (масштаб) иконки вектора xml программно API Facebook4j: поиск Автоматическое зеркалирование для макета RTL не работает в версиях Android ниже 6.0 Диалоговое окно предупреждения внутри asynctask в android Как изменить библиотеку поддержки дизайна Android? Почему область щелчков Android имеет более широкий радиус, чем touchstart? Как я могу сделать это последовательным? Повторить предыдущий запрос, когда первый сбой 401 Несанкционированный Автоматизация выбора номера в android с использованием эспрессо Запретить ViewPager уничтожать заставку Как добавить кнопку в класс «extends View»?