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-карты, поэтому

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

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

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, мы обречены.
  • В будущем в некоторых новых устройствах мы не сможем его прочитать, если это произойдет.

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

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

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

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

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

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

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

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

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

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

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

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

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

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