Perfect unique_id для устройства, кроме IMEI, Android_ID, WLAN Mac и Bluetooth-адреса

Цель:

Я ищу способ найти unique_id для Android-устройства.

История:

Я буду использовать идентификатор Id в логинном запросе и, поскольку мое приложение приложение для службы на основе лицензии, Id не должно меняться при обычных обстоятельствах.

Существующие подходы:

В iOS есть несколько уникальных решений для iOS, таких как CFUUID или идентификаторForVendor в сочетании с Keychain, рекламным идентификатором и т.д., которые могут выполнить это задание до ожидания.

Но в Android все варианты, которые, как мне кажется, имеют дыру в нем.

IMEI:

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

Недостатки

Это зависит от SIM-карты, поэтому

  • Если нет сим-карты, мы обречены

  • Если есть двойной sim, то мы dommed

Android_ID:

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

Недостатки

  • Если версия ОС обновлена, она может измениться
  • Если устройство укоренено, оно изменяется.
  • Нет гарантии, что device_id уникален, есть некоторые сообщения, которые некоторые производители имеют дубликат device_id

MAC-адрес WLAN

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

Недостатки

  • Если нет wifi-оборудования, мы обречены
  • В некоторых новых устройствах Если wifi выключен, мы обречены.

Адрес Bluetooth:

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

Недостатки:

  • Если нет оборудования Bluetooth, мы обречены.
  • В будущем в некоторых новых устройствах мы не сможем прочитать его, если он выключен.

Возможные решения:

Есть два подхода, которые, как я думаю, для решения этой проблемы

  • Мы генерируем случайный идентификатор с помощью метки времени хеширования с уникальными идентификаторами, которые я упомянул, и сохраняем их в следующий раз во время проверки входа в систему, если хранимое значение ключа равно null, если оно так хорошо генерирует и сохраняет его иначе используйте значение ключа.

    Если есть что-то, что эквивалентно keychain iOS, тогда было хорошо с этим подходом.

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

Любая помощь приветствуется!

Ответ 1

Я решил использовать Android_ID, поскольку он не зависит от какого-либо оборудования.

Build.SERIAL также зависит от доступности телефонии, которая находится в устройствах Wi-Fi только для этого Build.SERIAL не будет работать.

Я объяснил, как другие подходы зависят от доступности оборудования в самом вопросе.

Ответ 2

На Android нет такого идентификатора. Вы можете создать свой собственный, например, случайный UUID и подключить его к учетной записи пользователя. Это то, что делают Kindle, Audible и другие приложения, чтобы идентифицировать устройства не навязчивым образом.

Обратите внимание на Google Analytics Mobile, если вы хотите "отслеживать своих пользователей", http://www.google.com/analytics/mobile/

Если вы хотите приблизиться к отслеживанию устройства, вы можете комбинировать идентификаторы выше вместе в хэш-функции. Bluetooth + wifi + android serial, и если какой-либо из них является нулевым, вы помещаете 0 в хэш, например. если нет wifi mac addr. Как вы указываете, вам не гарантируется, что идентификатор не изменится. Если пользователь не запускает пользовательский ПЗУ, я бы ожидал, что этот вычисленный ID останется постоянным.

Ответ 3

Я думаю, вы могли бы использовать серийный номер устройства (серийный номер аппаратного обеспечения, а не идентификатор Android). Вы могли видеть это в настройках устройства. В вашем коде вы можете получить его с помощью Build.SERIAL.