Есть ли у Android-устройств уникальный идентификатор, и если да, то какой простой способ получить к нему доступ с помощью Java?
android
uniqueidentifier
Тайлер
источник
источник
ANDROID_ID
, обязательно прочитайте этот ответ и эту ошибку .Ответы:
Settings.Secure#ANDROID_ID
возвращает идентификатор Android как уникальную для каждого пользователя 64-битную шестнадцатеричную строку.источник
ОБНОВЛЕНИЕ : В последних версиях Android многие проблемы
ANDROID_ID
были решены, и я считаю, что такой подход больше не нужен. Пожалуйста, взгляните на ответ Энтони .Полное раскрытие: мое приложение изначально использовало описанный ниже подход, но больше не использует этот подход, и теперь мы используем подход, изложенный в записи блога Android Developer Blog, на которую ссылается ответ emmby (а именно, создание и сохранение a
UUID#randomUUID()
).Есть много ответов на этот вопрос, большинство из которых будет работать только «некоторое время», и, к сожалению, этого недостаточно.
На основании моих тестов устройств (все телефоны, хотя бы один из которых не активирован):
TelephonyManager.getDeviceId()
TelephonyManager.getSimSerialNumber()
getSimSerialNumber()
(как и ожидалось)ANDROID_ID
ANDROID_ID
иTelephonyManager.getDeviceId()
- до тех пор, пока учетная запись Google была добавлена во время установки.Так что если вы хотите что-то уникальное для самого устройства,
TM.getDeviceId()
должно быть достаточно. Очевидно, что некоторые пользователи более параноидальны, чем другие, поэтому может быть полезно хешировать 1 или более этих идентификаторов, чтобы строка по-прежнему оставалась практически уникальной для устройства, но явно не идентифицировала фактическое устройство пользователя. Например, используя вString.hashCode()
сочетании с UUID:может привести к чему-то вроде:
00000000-54b3-e7c7-0000-000046bffd97
Это работает достаточно хорошо для меня.
Как упоминает Ричард ниже, не забывайте, что вам нужно разрешение на чтение
TelephonyManager
свойств, поэтому добавьте это в свой манифест:импортные библиотеки
источник
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
в файл манифеста. При хранении в базе данных возвращаемая строка имеет длину 36 символов.Последнее обновление: 02.06.15
После прочтения каждого поста о переполнении стека о создании уникального идентификатора, блога разработчиков Google и документации по Android, я чувствую, что «псевдоидентификация» - лучший вариант
Основная проблема: оборудование против программного обеспечения
аппаратные средства
Програмное обеспечение
Общий срыв с Android
- Гарантия уникальности (включая рутированные устройства) для API> = 9/10 (99,5% устройств Android)
- Нет дополнительных разрешений
Код Псуэдо:
Спасибо @stansult за публикацию всех наших опций (в этом вопросе о переполнении стека).
Список опций - причины, почему / почему не стоит их использовать:
Электронная почта пользователя - Программное обеспечение
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
или<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
( Как получить основной адрес электронной почты устройства Android )Номер телефона пользователя - Программное обеспечение
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
IMEI - Hardware (только телефоны, нужны
android.permission.READ_PHONE_STATE
)<uses-permission android:name="android.permission.READ_PHONE_STATE" />
Идентификатор Android - Аппаратное обеспечение (может быть нулевым, может изменяться после сброса к заводским настройкам, может быть изменено на корневом устройстве)
WLAN MAC-адрес - Аппаратное обеспечение (необходимо
android.permission.ACCESS_WIFI_STATE
)<uses-permission android:name="android.permission.ACCESS_WIFI_STATE "/>
Bluetooth MAC Address - Hardware (устройства с Bluetooth, нужны
android.permission.BLUETOOTH
)<uses-permission android:name="android.permission.BLUETOOTH "/>
Pseudo-Unique ID - Программное обеспечение (для всех устройств Android)
Я знаю, что не существует «идеального» способа получения уникального идентификатора без использования разрешений; Однако иногда нам действительно нужно отслеживать установку устройства. Когда дело доходит до создания уникального идентификатора, мы можем создать «псевдо уникальный идентификатор», основанный исключительно на информации, которую нам предоставляет API Android без использования дополнительных разрешений. Таким образом, мы можем проявить уважение к пользователю и попытаться предложить хороший пользовательский опыт.
С псевдо-уникальным идентификатором вы действительно сталкиваетесь только с тем фактом, что могут быть дубликаты, основанные на том факте, что существуют подобные устройства. Вы можете настроить комбинированный метод, чтобы сделать его более уникальным; однако, некоторые разработчики должны отслеживать установку устройств, и это будет способствовать достижению цели или производительности на основе аналогичных устройств.
API> = 9:
Если их Android-устройство имеет API 9 или более поздней версии, оно гарантированно будет уникальным из-за поля «Build.SERIAL».
ПОМНИТЕ , технически вы пропускаете только около 0,5% пользователей с API <9 . Таким образом, вы можете сосредоточиться на остальном: это 99,5% пользователей!
API <9:
Если Android-устройство пользователя ниже API 9; надеюсь, что они не сделали сброс к заводским настройкам, и их «Secure.ANDROID_ID» будет сохранен или не будет «нулевым». (см. http://developer.android.com/about/dashboards/index.html )
Если все остальное не удается:
Если все остальное терпит неудачу, если пользователь имеет более низкий, чем API 9 (ниже, чем Gingerbread), сбросил свое устройство или «Secure.ANDROID_ID» возвращает «ноль», то просто возвращенный идентификатор будет основан исключительно на информации об их устройстве Android. Это где столкновения могут произойти.
Изменения:
Пожалуйста, взгляните на метод ниже:
Новое (для приложений с рекламой и сервисами Google Play):
Из консоли разработчика Google Play:
Реализация :
Разрешение:
Код:
Источник / Docs:
http://developer.android.com/google/play-services/id.html http://developer.android.com/reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.html
Важный:
Внимание, пользователи могут сбросить:
http://en.kioskea.net/faq/34732-android-reset-your-advertising-id
Я пытался ссылаться на каждую ссылку, с которой я взял информацию. Если вы пропали без вести и должны быть включены, пожалуйста, прокомментируйте!
Идентификатор экземпляра служб Google Player
https://developers.google.com/instance-id/
источник
Build
изменится ли класс после обновления ОС? Особенно, если API обновился? Если так, как вы можете гарантировать, что это уникально? (Говоря о методе, который вы написали)Как упоминает Дейв Уэбб, в блоге разработчиков Android есть статья , в . Их предпочтительным решением является отслеживание установок приложений, а не устройств, и это будет хорошо работать в большинстве случаев использования. В блоге будет показан необходимый код для этой работы, и я рекомендую вам проверить его.
Тем не менее, в блоге обсуждаются решения, если вам нужен идентификатор устройства, а не идентификатор установки приложения. Я поговорил с кем-то из Google, чтобы получить дополнительные разъяснения по нескольким пунктам на тот случай, если вам нужно это сделать. Вот что я обнаружил об идентификаторах устройств, которые НЕ упоминаются в вышеупомянутом сообщении в блоге:
Основываясь на рекомендациях Google, я реализовал класс, который будет генерировать уникальный UUID для каждого устройства, используя ANDROID_ID в качестве начального числа, где это необходимо, используя при необходимости TelephonyManager.getDeviceId (), а в случае неудачи прибегая к случайно сгенерированному уникальному UUID. это сохраняется при перезапуске приложения (но не при переустановке приложения).
Обратите внимание, что для устройств, которые вынуждены использовать идентификатор устройства, используется уникальный идентификатор будет сохраняться при сбросе до заводских настроек. Это то, что нужно знать. Если вам необходимо убедиться, что сброс настроек к заводским установкам приведет к сбросу вашего уникального идентификатора, вы можете рассмотреть возможность возврата непосредственно к случайному UUID вместо идентификатора устройства.
Опять же, этот код предназначен для идентификатора устройства, а не идентификатора установки приложения. В большинстве случаев идентификатор установки приложения, вероятно, то, что вы ищете. Но если вам нужен идентификатор устройства, то следующий код, вероятно, будет работать для вас.
источник
Вот код, который Reto Meier использовал в презентации Google I / O в этом году, чтобы получить уникальный идентификатор для пользователя:
Если вы соедините это со стратегией резервного копирования для отправки предпочтений в облако (также описано в выступлении Рето , у вас должен быть идентификатор, который привязывается к пользователю и остается после того, как устройство было стерто или даже заменено. Я планирую использовать это в аналитике, идущей вперед (другими словами, я еще этого не сделал :).
источник
Также вы можете рассмотреть MAC-адрес адаптера Wi-Fi. Получено так:
Требуется разрешение
android.permission.ACCESS_WIFI_STATE
в манифесте.Сообщается о доступности, даже если Wi-Fi не подключен. Если Джо из приведенного выше ответа попробует это на своих многочисленных устройствах, это было бы неплохо.
На некоторых устройствах он недоступен при выключенном Wi-Fi.
ПРИМЕЧАНИЕ. В Android 6.x возвращается поддельный mac-адрес:
02:00:00:00:00:00
источник
android.permission.ACCESS_WIFI_STATE
02:00:00:00:00:00
Там довольно полезная информация здесь .
Он охватывает пять различных типов удостоверений личности:
android.permission.READ_PHONE_STATE
)android.permission.ACCESS_WIFI_STATE
)android.permission.BLUETOOTH
)источник
В официальном блоге разработчиков Android теперь есть полная статья, посвященная этой теме, « Определение установок приложений» .
источник
В Google I / O Рето Мейер (Rto Meier) выпустил исчерпывающий ответ о том, как подойти к этому, что должно удовлетворить потребности большинства разработчиков для отслеживания пользователей в различных установках. Энтони Нолан показывает направление в своем ответе, но я решил написать полный подход, чтобы другие могли легко увидеть, как это сделать (мне потребовалось некоторое время, чтобы выяснить детали).
Этот подход даст вам анонимный, безопасный идентификатор пользователя, который будет постоянным для пользователя на разных устройствах (в зависимости от основной учетной записи Google) и во время установки. Основной подход заключается в создании случайного идентификатора пользователя и сохранении его в общих настройках приложений. Затем вы используете агент резервного копирования Google для хранения общих настроек, связанных с учетной записью Google, в облаке.
Давайте пройдем через полный подход. Во-первых, нам нужно создать резервную копию наших SharedPreferences с помощью службы резервного копирования Android. Начните с регистрации вашего приложения через
http://developer.android.com/google/backup/signup.html
.Google предоставит вам ключ службы резервного копирования, который необходимо добавить в манифест. Вы также должны указать приложению использовать BackupAgent следующим образом:
Затем вам нужно создать агент резервного копирования и указать ему использовать вспомогательный агент для общих настроек:
Для завершения резервного копирования вам необходимо создать экземпляр BackupManager в вашей основной деятельности:
Наконец, создайте идентификатор пользователя, если он еще не существует, и сохраните его в SharedPreferences:
Этот User_ID теперь будет постоянным во всех установках, даже если пользователь перемещает устройство.
Для получения дополнительной информации об этом подходе см. Доклад Рето .
А для полной информации о том, как реализовать агент резервного копирования, см. Резервное копирование данных . Я особенно рекомендую раздел внизу, посвященный тестированию, поскольку резервное копирование не происходит мгновенно, поэтому для тестирования необходимо принудительно создать резервную копию.
источник
Я думаю, что это верный способ построить каркас для уникального идентификатора ... проверить это.
Псевдо-уникальный идентификатор, который работает на всех устройствах Android. На некоторых устройствах нет телефона (например, планшета) или по какой-то причине вы не хотите включать разрешение READ_PHONE_STATE. Вы по-прежнему можете читать такие сведения, как версия ПЗУ, имя производителя, тип ЦП и другие сведения об оборудовании, которые хорошо подойдут, если вы хотите использовать идентификатор для проверки серийного ключа или других общих целей. Вычисленный таким образом идентификатор не будет уникальным: можно найти два устройства с одинаковым идентификатором (на основе одного и того же оборудования и образа ПЗУ), но изменения в реальных приложениях незначительны. Для этого вы можете использовать класс Build:
Большинство членов Build являются строками, мы здесь берем их длину и преобразуем их по модулю в цифру. У нас есть 13 таких цифр, и мы добавляем еще две впереди (35), чтобы иметь тот же идентификатор размера, что и IMEI (15 цифр). Есть и другие возможности, просто взгляните на эти строки. Возвращает что-то вроде
355715565309247
. Специального разрешения не требуется, что делает этот подход очень удобным.(Дополнительная информация: техника, приведенная выше, была скопирована из статьи о Pocket Magic .)
источник
Следующий код возвращает серийный номер устройства с помощью скрытого API Android. Но этот код не работает на Samsung Galaxy Tab, потому что "ro.serialno" не установлен на этом устройстве.
источник
ro.serialno
используется для созданияSettings.Secure.ANDROID_ID
. Таким образом, они в основном разные представления одного и того же значения.ANDROID_ID
является производным от него.android.os.Build.SERIAL
android.os.Build.SERIAL
устарела в Android O, см. android-developers.googleblog.com/2017/04/…Это простой вопрос, без простого ответа.
Более того, все существующие здесь ответы являются либо устаревшими, либо ненадежными.
Так что, если вы ищете решение в 2020 году .
Вот несколько вещей, которые следует иметь в виду:
Все аппаратные идентификаторы (SSAID, IMEI, MAC и т. Д.) Ненадежны для устройств, не принадлежащих Google (все, кроме пикселей и связующих), которые составляют более 50% активных устройств во всем мире. Поэтому в официальных рекомендациях по идентификаторам Android четко говорится:
Это делает большинство ответов выше недействительными. Кроме того, из-за различных обновлений безопасности для Android некоторые из них требуют более новых и более строгих разрешений во время выполнения, которые могут быть просто отклонены пользователем.
В качестве примера,
CVE-2018-9489
который влияет на все технологии, основанные на WIFI, упомянутые выше.Это делает эти идентификаторы не только ненадежными, но и недоступными во многих случаях.
Итак, проще говоря: не используйте эти методы .
Многие другие ответы здесь предлагают использовать
AdvertisingIdClient
, что также несовместимо, так как его дизайн должен использоваться только для профилирования рекламы. Это также указано в официальной ссылкеЭто не только ненадежно для идентификации устройства, но вы также должны соблюдать конфиденциальность пользователя в отношении политики отслеживания рекламы , в которой четко указано, что пользователь может сбросить или заблокировать ее в любой момент.
Так что не используйте его тоже .
Поскольку вы не можете иметь желаемый статический глобально уникальный и надежный идентификатор устройства. Официальный справочник Android предлагает:
Он уникален для установки приложения на устройстве, поэтому, когда пользователь удаляет приложение - оно стирается, поэтому оно не на 100% надежно, но это следующая лучшая вещь.
Чтобы использовать,
FirebaseInstanceId
добавьте последнюю версию Firebase -сообщений в ваш GradleИ используйте код ниже в фоновом потоке:
Если вам нужно сохранить идентификацию устройства на вашем удаленном сервере, не храните его как есть (простой текст), но хеш с солью .
Сегодня это не только лучшая практика, вы должны делать это по закону в соответствии с GDPR - идентификаторами и аналогичными правилами.
источник
Используя приведенный ниже код, вы можете получить уникальный идентификатор устройства Android OS в виде строки.
источник
Серийное поле было добавлено к
Build
классу уровня API 9 (Android 2.3 - Пряник). Документация говорит, что это представляет серийный номер оборудования. При этом он должен быть уникальным, если он существует на устройстве.Я не знаю, поддерживается ли он (= не ноль) всеми устройствами с уровнем API> = 9.
источник
Я добавлю одну вещь - у меня одна из тех уникальных ситуаций.
С помощью:
Оказывается, что хотя мой Viewsonic G Tablet сообщает об DeviceID, который не является нулевым, каждый G Tablet сообщает одно и то же число.
Это делает интересной игру в «Pocket Empires», которая дает вам мгновенный доступ к чьей-либо учетной записи на основе «уникального» DeviceID.
У моего устройства нет сотового радио.
источник
9774d56d682e549c
?Подробные инструкции о том, как получить уникальный идентификатор для каждого устройства Android, с которого установлено приложение, см. В официальном блоге разработчиков Android, в котором описывается определение установок приложений .
Кажется, лучший способ для вас - создать его самостоятельно после установки, а затем прочитать его при перезапуске приложения.
Я лично считаю это приемлемым, но не идеальным. Ни один идентификатор, предоставляемый Android, не работает во всех случаях, поскольку большинство из них зависят от состояния радиосвязи телефона (вкл / выкл Wi-Fi, вкл / выкл сотовой связи, вкл / выкл Bluetooth). Другие, подобные,
Settings.Secure.ANDROID_ID
должны быть реализованы производителем и не должны быть уникальными.Ниже приведен пример записи данных в установочный файл, который будет храниться вместе с любыми другими данными, которые приложение сохраняет локально.
источник
Добавьте код ниже в файл класса:
Добавьте в AndroidManifest.xml:
источник
Уникальный идентификатор устройства Android OS как String с использованием
TelephonyManager
иANDROID_ID
, получается:Но я настоятельно рекомендую метод, предложенный Google, см. Определение установок приложений .
источник
Существует много разных подходов к
ANDROID_ID
решению этих проблем (null
иногда это происходит, когда устройства определенной модели всегда возвращают один и тот же идентификатор) с плюсами и минусами:Я сам предпочитаю использовать существующую реализацию OpenUDID (см. Https://github.com/ylechelle/OpenUDID ) для Android (см. Https://github.com/vieux/OpenUDID ). Он легко интегрируется и использует
ANDROID_ID
запасные варианты с этими проблемами, упомянутыми выше.источник
Как насчет IMEI . Это уникально для Android или других мобильных устройств.
источник
Вот как я генерирую уникальный идентификатор:
источник
Мои два цента - NB это для уникального идентификатора устройства (err) - не установочный, как обсуждалось в блоге разработчиков Android .
Следует отметить, что решение, предоставляемое @emmby, использует идентификатор каждого приложения, поскольку SharedPreferences не синхронизируются между процессами (см. Здесь и здесь ). Так что я вообще этого избежал.
Вместо этого я инкапсулировал различные стратегии получения идентификатора (устройства) в перечислении - изменение порядка перечисления констант влияет на приоритет различных способов получения идентификатора. Возвращается первый ненулевой идентификатор или генерируется исключение (в соответствии с хорошими практиками Java, не предусматривающими нулевого значения). Так, например, сначала у меня есть TELEPHONY, но хорошим вариантом по умолчанию будет бета-версия ANDROID_ID :
источник
Здесь более 30 ответов, и некоторые из них одинаковы, а некоторые уникальны. Этот ответ основан на нескольких из этих ответов. Одним из них является ответ @Lenn Dolling.
Он объединяет 3 идентификатора и создает 32-значную шестнадцатеричную строку. Это сработало очень хорошо для меня.
3 идентификаторов:
Псевдо-ID - Он генерируется на основе спецификации физического устройства
ANDROID_ID -
Settings.Secure.ANDROID_ID
адреса Bluetooth - Bluetooth - адаптер адрес
Он вернет что-то вроде этого: 551F27C060712A72730B0A0F734064B1
Примечание. Вы всегда можете добавить дополнительные идентификаторы в
longId
строку. Например, Серийный №. адрес адаптера Wi-Fi. IMEI. Таким образом, вы делаете его более уникальным для каждого устройства.источник
longId
и сохранение его в файле сделает его самым уникальным идентификатором:String uuid = UUID.randomUUID().toString();
longId
. Измените эту строку следующим образом:String longId = pseudoId + androidId + btId + UUID.randomUUID().toString();
Это гарантирует, что сгенерированный идентификатор будет уникальным.Другой способ - использовать
/sys/class/android_usb/android0/iSerial
приложение без каких-либо разрешений.Чтобы сделать это в Java, достаточно использовать FileInputStream, чтобы открыть файл iSerial и прочитать символы. Просто убедитесь, что вы поместили его в обработчик исключений, потому что не у всех устройств есть этот файл.
По крайней мере, следующие устройства имеют этот файл для чтения:
Вы также можете увидеть мой пост в блоге « Утечка серийного номера оборудования Android» в непривилегированных приложениях, где я обсуждаю, какие другие файлы доступны для информации.
источник
TelephonyManger.getDeviceId () Возвращает уникальный идентификатор устройства, например, IMEI для GSM и MEID или ESN для телефонов CDMA.
Но я рекомендую использовать:
Settings.Secure.ANDROID_ID, который возвращает идентификатор Android в виде уникальной 64-разрядной шестнадцатеричной строки.
Иногда TelephonyManger.getDeviceId () возвращает null, поэтому для обеспечения уникального идентификатора вы будете использовать этот метод:
источник
Для аппаратного распознавания определенного устройства Android вы можете проверить MAC-адреса.
Вы можете сделать это так:
в AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
теперь в вашем коде:
В каждом устройстве Android есть, по крайней мере, интерфейс "wlan0", который является чипом WI-FI. Этот код работает, даже когда WI-FI не включен.
PS Это множество других интерфейсов, которые вы получите из списка, содержащего MACS, но это может измениться между телефонами.
источник
Я использую следующий код, чтобы получить
IMEI
или использовать Secure.ANDROID_ID
в качестве альтернативы, когда устройство не имеет возможностей телефона:источник
Более конкретно
Settings.Secure.ANDROID_ID
. Это 64-разрядная величина, которая генерируется и сохраняется при первой загрузке устройства. Сбрасывается при стирании устройства.ANDROID_ID
кажется хорошим выбором для уникального идентификатора устройства. Есть недостатки: во-первых, это не на 100% надежно в выпусках Android до 2.2.(“Froyo”).
Кроме того, в популярном телефоне от одного крупного производителя была обнаружена, по крайней мере, одна широко распространенная ошибка, где каждый экземпляр имеет одинаковый ANDROID_ID.источник
Чтобы понять доступные уникальные идентификаторы в устройствах Android. Используйте это официальное руководство.
Лучшие практики для уникальных идентификаторов:
IMEI, адреса Mac, идентификатор экземпляра, GUID, SSAID, идентификатор рекламы, API сети безопасности для проверки устройств.
https://developer.android.com/training/articles/user-data-ids
источник
Идентификатор Google Instance
Выпущено в I / O 2015; на Android требуются игровые сервисы 7.5.
https://developers.google.com/instance-id/
https://developers.google.com/instance-id/guides/android-implementation
Похоже, что Google намеревается использовать этот идентификатор для идентификации установок через Android, Chrome и iOS.
Он идентифицирует установку, а не устройство, но опять же, ANDROID_ID (который является принятым ответом) теперь больше не идентифицирует устройства. Во время выполнения ARC для каждой установки создается новый ANDROID_ID ( подробности здесь ), как и этот новый идентификатор экземпляра. Кроме того, я думаю, что большинство из нас на самом деле ищут определение установок (не устройств).
Преимущества экземпляра ID
Мне кажется, что Google намеревается использовать его для этой цели (идентифицируя ваши установки), он кроссплатформенный и может использоваться для ряда других целей (см. Ссылки выше).
Если вы используете GCM, то в конечном итоге вам понадобится использовать этот идентификатор экземпляра, потому что он нужен вам для получения токена GCM (который заменяет старый регистрационный идентификатор GCM).
Недостатки / проблемы
В текущей реализации (GPS 7.5) идентификатор экземпляра извлекается с сервера, когда ваше приложение запрашивает его. Это означает, что вышеуказанный вызов является блокирующим вызовом - в моем ненаучном тестировании это занимает 1-3 секунды, если устройство подключено к сети, и 0,5-1,0 секунды, если устройство находится в автономном режиме (предположительно, это то, сколько времени он ожидает, прежде чем сдаться и сгенерировать случайный идентификатор). Это было протестировано в Северной Америке на Nexus 5 с Android 5.1.1 и GPS 7.5.
Если вы используете идентификатор для целей, для которых они предназначены - например, аутентификация приложения, идентификация приложения, GCM - я думаю, что это 1-3 секунды, что может быть неприятно (в зависимости от вашего приложения, конечно).
источник