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.