Как узнать id устройства android java

Обновлено: 18.05.2024

Есть ли у Android-устройств уникальный идентификатор, и если да, то какой простой способ получить к нему доступ с помощью Java?

Если вы используете ANDROID_ID , обязательно прочитайте этот ответ и эту ошибку . Если вам нужно решение в 2020 году, вы должны прочитать идентификаторы Android в 2020 году Известно, что иногда оно пустое, оно задокументировано как «может измениться после сброса к заводским настройкам». Используйте на свой страх и риск, и это может быть легко изменено на рутированном телефоне. Я думаю, что мы должны быть осторожны с использованием ANDROID_ID в хэше в первом ответе, потому что он может не быть установлен при первом запуске приложения, может быть установлен позже или может даже измениться в теории, следовательно, может измениться уникальный идентификатор

ОБНОВЛЕНИЕ : В последних версиях Android многие проблемы ANDROID_ID были решены, и я считаю, что такой подход больше не нужен. Пожалуйста, взгляните на ответ Энтони .

На основании моих тестов устройств (все телефоны, хотя бы один из которых не активирован):

  1. Все протестированные устройства вернули значение для TelephonyManager.getDeviceId()
  2. Все устройства GSM (все протестированные с SIM-картой) вернули значение для TelephonyManager.getSimSerialNumber()
  3. Все устройства CDMA вернули ноль для getSimSerialNumber() (как и ожидалось)
  4. Все устройства с добавленной учетной записью Google вернули значение для ANDROID_ID
  5. Все устройства CDMA возвращали одно и то же значение (или производное одно и то же значение) для обоих ANDROID_ID и TelephonyManager.getDeviceId() - до тех пор, пока учетная запись Google была добавлена ​​во время установки.
  6. У меня еще не было возможности протестировать устройства GSM без SIM-карты, устройство GSM без добавленной учетной записи Google или какое-либо из устройств в режиме полета.

Так что если вы хотите что-то уникальное для самого устройства, TM.getDeviceId() должно быть достаточно. Очевидно, что некоторые пользователи более параноидальны, чем другие, поэтому может быть полезно хешировать 1 или более этих идентификаторов, чтобы строка по-прежнему оставалась практически уникальной для устройства, но явно не идентифицировала фактическое устройство пользователя. Например, используя в String.hashCode() сочетании с UUID:

может привести к чему-то вроде: 00000000-54b3-e7c7-0000-000046bffd97

Это работает достаточно хорошо для меня.

Как упоминает Ричард ниже, не забывайте, что вам нужно разрешение на чтение TelephonyManager свойств, поэтому добавьте это в свой манифест:

Телефонный идентификатор не будет на планшетных устройствах, да? Поэтому я сказал, что большинство из них не будет работать постоянно :) Я пока не вижу ответа на этот вопрос, который был бы надежным для всех устройств, всех типов устройств и всех аппаратных конфигураций. Вот почему этот вопрос здесь для начала. Совершенно очевидно, что для этого не существует универсального решения. Отдельные производители устройств могут иметь серийные номера устройств, но они не предоставляются нам для использования, и это не является обязательным требованием. Таким образом, мы остаемся с тем, что нам доступно. Пример кода отлично работает. Не забудьте добавить <uses-permission android:name="android.permission.READ_PHONE_STATE" /> в файл манифеста. При хранении в базе данных возвращаемая строка имеет длину 36 символов. @softarn: Я полагаю, что вы имеете в виду блог разработчиков Android, на который уже ссылались emmby, в котором объясняется, что вы пытаетесь сказать, так что, возможно, вам следовало бы просто вместо этого проголосовать за его комментарий. В любом случае, как упоминает Эмбби в своем ответе, проблемы с информацией в блоге все еще существуют. Вопрос требует уникального идентификатора УСТРОЙСТВА (не идентификатора установки), поэтому я не согласен с вашим утверждением. В блоге делается предположение, что вы не обязательно должны отслеживать устройство, тогда как вопрос требует именно этого. Я согласен с блогом в противном случае.

После прочтения каждого поста о переполнении стека о создании уникального идентификатора, блога разработчиков Google и документации по Android, я чувствую, что «псевдоидентификация» - лучший вариант

аппаратные средства

  • Пользователи могут менять свое оборудование, планшет Android или телефон, поэтому уникальные идентификаторы, основанные на оборудовании, не являются хорошими идеями для отслеживания пользователей
  • За ОТСЛЕЖИВАНИЯ ОБОРУДОВАНИЯ это отличная идея

Програмное обеспечение

  • Пользователи могут стереть / изменить свой ПЗУ, если они рутированы
  • Вы можете отслеживать пользователей на разных платформах (iOS, Android, Windows и Web)
  • Лучшее желание отследить индивидуального пользователя с его согласия - просто попросить его войти (сделайте это без проблем, используя OAuth)

- Гарантия уникальности (включая рутированные устройства) для API> = 9/10 (99,5% устройств Android)

- Нет дополнительных разрешений

Спасибо @stansult за публикацию всех наших опций (в этом вопросе о переполнении стека).

Список опций - причины, почему / почему не стоит их использовать:

Электронная почта пользователя - Программное обеспечение

  • Пользователь может изменить адрес электронной почты - очень маловероятно
  • API 5+ <uses-permission android:name="android.permission.GET_ACCOUNTS" /> или
  • API 14+ <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 - Аппаратное обеспечение (может быть нулевым, может изменяться после сброса к заводским настройкам, может быть изменено на корневом устройстве)

  • Так как это может быть 'null', мы можем проверить 'null' и изменить его значение, но это означает, что он больше не будет уникальным.
  • Если у вас есть пользователь с устройством сброса к заводским настройкам, значение может быть изменено или изменено на корневом устройстве, поэтому могут быть дубликаты записей, если вы отслеживаете установки пользователей.

WLAN MAC-адрес - Аппаратное обеспечение (необходимо android.permission.ACCESS_WIFI_STATE )

  • Это может быть второй лучший вариант, но вы все еще собираете и храните уникальный идентификатор, который приходит непосредственно от пользователя. Это очевидно, что вы собираете данные.
  • <uses-permission android:name="android.permission.ACCESS_WIFI_STATE "/>

Bluetooth MAC Address - Hardware (устройства с Bluetooth, нужны android.permission.BLUETOOTH )

  • Большинство приложений на рынке не используют Bluetooth, и поэтому, если ваше приложение не использует 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:

Если все остальное не удается:

Если все остальное терпит неудачу, если пользователь имеет более низкий, чем API 9 (ниже, чем Gingerbread), сбросил свое устройство или «Secure.ANDROID_ID» возвращает «ноль», то просто возвращенный идентификатор будет основан исключительно на информации об их устройстве Android. Это где столкновения могут произойти.

  • Удален «Android.SECURE_ID» из-за сброса настроек, что может привести к изменению значения
  • Отредактировал код для изменения на API
  • Поменял псевдо

Пожалуйста, взгляните на метод ниже:

Из консоли разработчика Google Play:

Начиная с 1 августа 2014 г. в соответствии с политикой программы разработчиков Google Play все новые загрузки и обновления приложений должны использовать рекламный идентификатор вместо любых других постоянных идентификаторов для любых рекламных целей. Учить больше

Реализация :

Источник / Docs:

Важный:

Предполагается, что рекламный идентификатор полностью заменит существующее использование других идентификаторов в рекламных целях (например, использование ANDROID_ID в Settings.Secure), когда службы Google Play доступны. Случаи, когда Сервисы Google Play недоступны, указываются в исключении GooglePlayServicesNotAvailableException, генерируемом getAdvertisingIdInfo ().

Внимание, пользователи могут сбросить:

Я пытался ссылаться на каждую ссылку, с которой я взял информацию. Если вы пропали без вести и должны быть включены, пожалуйста, прокомментируйте!

Идентификатор экземпляра служб Google Player

Но не Build изменится ли класс после обновления ОС? Особенно, если API обновился? Если так, как вы можете гарантировать, что это уникально? (Говоря о методе, который вы написали) Я написал это более 1,5 лет назад. Я не уверен, почему это не уникально для вас. Вы можете попробовать рекламный идентификатор. Если нет, вы можете придумать собственное решение. Сорта . Я был бы очень признателен, если вы ответите на этот вопрос и @ user1587329 Спасибо. Я пытаюсь держать это в курсе для всех. Этот вопрос сложен, когда дело доходит до аппаратного и программного обеспечения и кроссплатформенности.

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

  • ANDROID_ID является предпочтительным идентификатором устройства. ANDROID_ID абсолютно надежен в версиях Android <= 2.1 или> = 2.3. Только 2.2 имеет проблемы, упомянутые в посте.
  • На несколько устройств нескольких производителей влияет ошибка ANDROID_ID в 2.2.
  • Насколько я смог определить, все затронутые устройства имеют одинаковый ANDROID_ID , который 9774d56d682e549c . Который также является идентичным идентификатором устройства, сообщаемым эмулятором, кстати.
  • Google считает, что производители исправили проблему для многих или большинства своих устройств, но я смог убедиться, что по крайней мере на начало апреля 2011 года найти устройства с поврежденным ANDROID_ID по-прежнему довольно легко.

Основываясь на рекомендациях Google, я реализовал класс, который будет генерировать уникальный UUID для каждого устройства, используя ANDROID_ID в качестве начального числа, где это необходимо, используя при необходимости TelephonyManager.getDeviceId (), а в случае неудачи прибегая к случайно сгенерированному уникальному UUID. это сохраняется при перезапуске приложения (но не при переустановке приложения).

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

Опять же, этот код предназначен для идентификатора устройства, а не идентификатора установки приложения. В большинстве случаев идентификатор установки приложения, вероятно, то, что вы ищете. Но если вам нужен идентификатор устройства, то следующий код, вероятно, будет работать для вас.

Мне просто интересно, что было бы лучше, чтобы получить идентификатор устройства. У меня есть 2 варианта, либо я использую приведенный ниже код, который требует разрешения во время выполнения android.permission.READ_PHONE_STATE -

Во-вторых, у меня есть опция UUID, которая не требует разрешения во время выполнения, но должна быть сопоставлена с данными пользователя (такими как электронная почта или телефон) для идентификации.

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

4 ответа

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

При первой загрузке устройства генерируется и сохраняется случайное значение. Это значение доступно через Settings.Secure.ANDROID_ID. Это 64-разрядное число, которое должно оставаться постоянным в течение всего срока службы устройства. ANDROID_ID кажется хорошим выбором для уникального идентификатора устройства, поскольку он доступен для смартфонов и планшетов.

Вопросы : Однако значение может измениться, если на устройстве выполнен сброс к заводским настройкам. Существует также известная ошибка с популярной трубкой от производителя, где каждый экземпляр имеет одинаковый ANDROID_ID. Понятно, что решение не является надежным на 100%.

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

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

ЗАКЛЮЧЕНИЕ:

Определить конкретное устройство на Android не так-то просто. Есть много веских причин, чтобы этого избежать. Лучшее решение, вероятно, состоит в том, чтобы идентифицировать конкретную установку с помощью решения UUID. Однако, если вы хотите абсолютно идентифицировать конкретное устройство физически, вы можете попробовать использовать решение ANDROID_ID. Не на 100% надежно, но лучше, чем другое решение.

Недавно я хотел узнать о получении уникальной идентификации устройства, и тут у меня заболела голова. тогда. . . . . .
Подведем итоги сегодня.

Разница между IMEI, MEID, ESN, IMSI, android_id

Давайте сначала определим несколько концепций, которые способствуют следующему развитию:
1.IMEI

IMEI состоит из 15 цифр, а его состав:
1. Первые 6 цифр (TAC) - это «номер утверждения модели», который обычно представляет модель.
2. Следующие две цифры (FAC) - это «окончательный номер сборки», который обычно обозначает место производства.
3. Следующие 6 цифр (SNR) - это «серийный номер», который обычно представляет собой производственный порядковый номер.
4. Последняя цифра (SP) обычно «0», это контрольный код, который в настоящее время зарезервирован.

Роль строкового кода:
IMEI: TAC + FAC + SNR + SP. IMEI (International Mobile Equipment Identity) - это аббревиатура от International Mobile Equipment Identity. International Mobile Equipment Identity - это «электронный серийный номер», состоящий из 15 цифр. Он соответствует каждому мобильному телефону один за другим, а код является всемирным. только. После сборки каждому мобильному телефону будет присвоен глобально уникальный набор номеров, который будет записан производителем от производства до доставки.
Когда мобильный телефон украден, если вы знаете код IEMI, вы можете заблокировать мобильный телефон через оператора мобильной связи, то есть узнать номер мобильного телефона после кражи, отключить функцию вызова мобильного телефона и узнать номер мобильного телефона. должность. В обычных условиях поставщики не принимают запросы от частных лиц или организаций на обнаружение или блокировку мобильных телефонов. В Китае соответствующие департаменты национальной безопасности будут в определенной степени управлять серийными номерами мобильных телефонов.

MEID идентифицируется 14 шестнадцатеричными цифрами, а 15-я цифра является контрольной цифрой, которая не участвует в эфирной передаче.
RR: диапазон A0-FF, выделенный официальным лицом
XXXXXX: диапазон 000000-FFFFFF, выделенный официальным
ZZZZZZ: диапазон 000000-FFFFFF, серийный номер, присвоенный каждому терминалу производителем.
C / CD: 0-F, проверьте код

Номера IMEI и MEID в мобильных телефонах похожи на идентификационные карты в нашей жизни. Они являются важной основой для идентификации мобильных телефонов. Например, мобильные телефоны с ложными номерами, операторы сети могут в любой момент отключить этот мобильный телефон в сети с помощью технических средств. Это принесет огромные риски пользователям мобильных телефонов. На номера IMEI или MEID, используемые в мобильных телефонах, можно по закону подать заявку через соответствующие агентства, такие как Moore Laboratories.
Кроме того, приложение MEID требует оплаты. Текущая цена составляет 8000 долларов США за каждый MEID в диапазоне 1M и дополнительные 8000 долларов США за каждый дополнительный номер MEID в диапазоне 1M.
Номера MEID назначаются и управляются Ассоциацией телекоммуникационной индустрии (TIA).
Проверка номера MEID, в настоящее время не существует универсального метода, который устанавливается каждым производителем мобильных телефонов. Вы можете проверить номер MEID, проверив инструкцию к телефону.

  • Электронный серийный номер в системе CDMA является уникальным идентификатором для идентификации физического аппаратного устройства. Другими словами, каждый мобильный телефон использует этот уникальный идентификатор для идентификации, как и личная идентификационная карта. ESN в CDMA соответствует IMEI в сети GSM. ESN имеет 32 бита,
  • То есть 32/4 = 8 байтов. С увеличением количества мобильных устройств CDMA ESN становится недостаточно, поэтому вводится MEID с большим количеством цифр. ESN выражается в шестнадцатеричном формате.
  • Международный идентификационный номер мобильного абонента (IMSI: International Mobile Subscriber Identification Number) - это знак, который различает мобильных пользователей. Он хранится на SIM-карте и может использоваться для отличия эффективной информации от мобильных пользователей.
  • Общая длина IMSI не превышает 15 цифр, также используются числа от 0 до 9. Среди них MCC - это код страны мобильного пользователя, который занимает 3 цифры. MCC Китая определяет его как 460; MNC - это номер мобильной сети, состоящий из двух цифр, используемый для идентификации сети мобильной связи, к которой принадлежит мобильный пользователь;
  • MSIN - это идентификационный код мобильного пользователя, используемый для идентификации мобильных пользователей в сети мобильной связи.
  • Уникальный идентификационный код устройства Android

Согласно приведенному выше резюме, соответствующая информация о вашем мобильном телефоне выглядит следующим образом:
meid[99000939335539]
imei1[863254036690765]
imei2[863254036690773]
simSerialNumber [89860117801033225378]
subscriberId [460011691516816]
Это телефоны Huawei:
MEID:A000007F2C4002
IMEI1:866957038217380
IMEI2:866957038364067
PESN:802B5D2A
SN:8BN02179015937
Поскольку мой мобильный телефон поддерживает две SIM-карты, у меня есть два номера imei.

Получите анализ уникальной идентификации Android

1. DEVICE_ID, разные мобильные устройства возвращают IMEI, MEID или ESN код

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

Немобильное устройство: если только устройство с Wi-Fi или музыкальный проигрыватель не имеет аппаратной функции для звонков, такого DEVICE_ID нет.
Разрешение: для получения DEVICE_ID требуется разрешение READ_PHONE_STATE, но если мы его только получаем и не используем другие функции вызова, то это разрешение слишком велико для использования

1.1 Sim Serial Number - уникальный идентификатор SIM-карты мобильного телефона.

код показан ниже:

Примечание. Для устройств CDMA возвращается нулевое значение.

1.2 Некоторые другие значения, которые может получить TelephonyManager

Дополнительные сведения о TelephonyManager см. В этом блоге.Telephonymanager подробно

2. MAC-адрес

MAC-адрес глобально уникален и не может быть сброшен пользователем, а также не изменится после восстановления заводских настроек. Как правило, не рекомендуется использовать MAC-адреса для какой-либо формы идентификации пользователя. Поэтому начиная с Android M,Больше не доступно через сторонние APIMAC-адрес локального устройства (например, WLAN и Bluetooth). [WifiInfo.getMacAddress()] Методы и [BluetoothAdapter.getDefaultAdapter().getAddress()] Метод вернет 02:00:00:00:00:00 。

Есть способы получить MAC-адрес 8.0wifi в Интернете:

Вышеупомянутый метод доступен как для мобильных телефонов Xiaomi Android 8.0, так и для мобильных телефонов Huawei Honor 8.0. Остальные телефоны не тестировал.

заметка:
Чтобы получить MAC-адрес, он должен быть подключен к сети Wi-Fi, иначе соответствующее имя не будет получено.

3.ANDROID_ID

Когда устройство запускается в первый раз, система случайным образом сгенерирует 64-битное число и сохранит его в виде шестнадцатеричной строки. Эта шестнадцатеричная строка - ANDROID_ID. При очистке устройства значение будет Сброс.
можно получить следующим способом:

ANDROID_ID можно использовать как идентификацию устройства, но вам нужно обратить внимание на:
1. Ошибка индивидуальной системы производителя: разные устройства могут генерировать один и тот же ANDROID_ID: 9774d56d682e549c.
2. Ошибка индивидуальной системы производителя: некоторые устройства возвращают null.
3. Различия между устройствами. Для устройств CDMA ANDROID_ID и TelephonyManager.getDeviceId () возвращают одно и то же значение.

4. серийный номер

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

4.1 Некоторые значения, которые можно получить в android.os.Build

Непосредственно по коду:

Ниже приводится соответствующая информация, полученная Huawei Honor 9 и Xiaomi:

Serial_Num: 8BN0217919015937
Manufacturer: HUAWEI
Model: STF-AL00
Brand: HONOR
Device: HWSTF
Ниже представлена ​​соответствующая информация о Mi 6.
Sim_SN: 89860117801033225378
Manufacturer: Xiaomi
Model: MI 6
Brand: Xiaomi
Device: sagit

5. ID установки

Принцип этого метода заключается в генерации идентификатора при первом запуске программы после установки. Этот метод отличается от уникальной идентификации устройства. Различные приложения будут генерировать разные идентификаторы, и одна и та же программа будет отличаться при переустановке. Таким образом, это не уникальный идентификатор устройства, но можно гарантировать, что идентификатор каждого пользователя отличается. Можно сказать, что он используется для идентификации уникального идентификатора каждого приложения (т.е. идентификатора установки), который можно использовать для отслеживания количества установок приложений и т. Д.
Непосредственно загрузите код:

Приведенный выше код также можно реализовать с помощью SharedPreferences:

Фактическое использование идентификаторов

Прежде всего, мы должны сначала выяснить конкретные потребности нашего оборудования для отслеживания. В настоящее время существует не более двух видов спроса:

  • 1. Отслеживайте оборудование на уровне цикла использования пользовательского оборудования.
    означает рассматривать устройство как новое устройство каждый раз, когда пользователь стирает данные с устройства и восстанавливает заводские настройки.
  • 2. Отслеживание оборудования на аппаратном уровне.
    означает, что устройство следует рассматривать как то же устройство после удаления данных или восстановления заводских настроек.

1. Отслеживайте использование оборудования пользователем на уровне

Теоретически значения Android_ID нам достаточно для выполнения этого требования, но именно из-за недостатков в Android_ID мы не можем напрямую идентифицировать устройство. Здесь мы используем несколько значений, чтобы избежать этих недостатков.
Я рекомендую использовать Android_ID и серийный номер Sim для идентификаторов, связанных с жизненным циклом пользовательского оборудования. Кроме того, можно добавить Device_ID, а идентификатор устройства можно вычислить и сгенерировать с помощью UUID или MD5.

  • Реализация UUID:
  • Реализация MD5 (алгоритм MD5 см. Ниже):

2. Отслеживание оборудования на аппаратном уровне.

Для отслеживания устройств на аппаратном уровне рекомендуется использовать идентификаторы оборудования, такие как идентификатор устройства (DeviceId), Mac-адрес, серийный номер устройства (SN) или марка устройства, название модели и т. Д. Эти значения вводятся после того, как пользователь удалит данные или восстановит заводские настройки. Это не изменится. Точно так же, чтобы повысить стабильность и устранить дефекты одного идентификатора, мы используем несколько идентификаторов для объединения, а затем вычисляем нужный нам идентификатор устройства с помощью алгоритма UUID или MD5.

  • Реализация UUID:
  • Реализация MD5 (алгоритм MD5 см. Ниже):

Чтобы дополнить требуемый выше md5:

Важная вещь в реальном бою выше - это мысль.

подводить итоги

Резюме выше, я почти сумасшедший. Эта работа относительно тривиальна, без чувства системы. Свяжите один кусок и соедините вместе. Боже мой! ! !

устройства Android имеют уникальный идентификатор, и если да, то каков простой способ получить к нему доступ с помощью Java?

обновление: по состоянию на последние версии Android, многие из проблем с ANDROID_ID были решены, и я считаю, что этот подход больше не нужен. Пожалуйста, взгляните на Антония.

на основе моих тестов устройств (все телефоны, по крайней мере один из которых не активирован):

  1. все проверенные устройства вернули значение для TelephonyManager.getDeviceId()
  2. все приборы GSM (все испытанные с SIM) возвратили значение для TelephonyManager.getSimSerialNumber()
  3. все устройства CDMA вернули значение null для getSimSerialNumber() (как и ожидалось)
  4. все устройства с добавленной учетной записью Google вернули значение для ANDROID_ID
  5. все устройства CDMA вернули одно и то же значение (или вывод одного и того же значения) для обоих ANDROID_ID и TelephonyManager.getDeviceId() -- пока учетная запись Google была добавлена во время установки.
  6. у меня еще не было возможности протестировать GSM-устройства без SIM-карты, GSM-устройство без учетной записи Google, или любое из устройств в режиме полета.

Итак, если вы хотите что-то уникальное для самого устройства, TM.getDeviceId() должны быть достаточным. Очевидно, что некоторые пользователи более параноидальны, чем другие, поэтому может быть полезно хэшировать 1 или более из этих идентификаторов, так что строка по-прежнему практически уникальна для устройства, но явно не идентифицирует фактическое устройство пользователя. Например, используя String.hashCode() , в сочетании с UUID:

может результат в чем-то вроде: 00000000-54b3-e7c7-0000-000046bffd97

она работает достаточно хорошо для меня.

как Ричард упоминает ниже, не забывайте, что вам нужно разрешение на чтение TelephonyManager свойства, поэтому добавьте это в свой манифест:

оборудование

  • пользователи могут изменить свое оборудование, Android-планшет или телефон, поэтому уникальные идентификаторы на основе оборудования не являются хорошими идеями для отслеживание Пользователи
  • на ОТСЛЕЖИВАНИЕ ОБОРУДОВАНИЯ, это отличная идея

программа

  • пользователи могут стереть / изменить свой ПЗУ, если они укоренены
  • вы можете отслеживать пользователей на разных платформах (iOS, Android, Windows и Web)
  • лучшие хотите ОТСЛЕЖИВАНИЕ ОТДЕЛЬНОГО ПОЛЬЗОВАТЕЛЯ С согласие просто иметь их логин (сделать это бесшовное использование Протокол OAuth)

- гарантия уникальности (включая корневые устройства) для API >= 9/10 (99,5% устройств Android)

- никаких дополнительных разрешений

спасибо @stansult за публикацию все наши варианты (в этом вопросе переполнения стека).

список опций - причины/ почему не использовать они:

Электронная Почта Пользователя-Программное Обеспечение

  • пользователь может изменить электронную почту - маловероятно
  • API 5+ <uses-permission android:name="android.permission.GET_ACCOUNTS" /> или
  • API 14+ <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-оборудование (только для телефонов, должен android.permission.READ_PHONE_STATE )

  • большинство пользователей ненавидят тот факт, что он говорит "телефонные звонки" в разрешении. Некоторые пользователи дают плохие оценки, потому что они считают, что вы просто крадете их личную информацию, когда все, что вы действительно хотите сделать, это отслеживать установки устройств. Очевидно, что вы собираете данные.
  • <uses-permission android:name="android.permission.READ_PHONE_STATE" />

Android ID-оборудование (может быть null, может изменяться при сбросе заводских настроек, может быть изменен на корневом устройстве)

  • поскольку он может быть "null", мы можем проверить "null" и изменить его значение, но это означает, что он больше не будет уникальным.
  • если у вас есть пользователь с устройством сброса настроек, значение может быть изменено или изменено на корневом устройстве, поэтому могут быть дубликаты записи, если вы отслеживаете установки пользователя.

WLAN MAC-адрес-оборудование (needs android.permission.ACCESS_WIFI_STATE )

  • это может быть второй лучший вариант, но вы все еще собираете и храните уникальный идентификатор, который поступает непосредственно от пользователя. Очевидно, что вы собираете данные.
  • <uses-permission android:name="android.permission.ACCESS_WIFI_STATE "/>

Bluetooth MAC-адрес - Оборудование (устройства с Bluetooth, потребности android.permission.BLUETOOTH )

  • большинство приложений на рынке не используют Bluetooth, и поэтому, если ваше приложение не использует Bluetooth, и вы включаете это, пользователь может стать подозрительным.
  • <uses-permission android:name="android.permission.BLUETOOTH "/>

псевдо-уникальный ID-Software (для всех устройств Android)

  • очень возможно, может содержать столкновения-см. Мой метод размещен ниже!
  • это позволяет вам иметь "почти уникальный" идентификатор от пользователя, не принимая ничего личного. Вы можете создать свой собственный анонимный идентификатор из информации об устройстве.

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

С псевдо-уникальным идентификатором вы действительно сталкиваетесь только с тем, что могут быть дубликаты, основанные на том, что есть похожие устройства. Вы можете настроить комбинированный метод, чтобы сделать его более уникальным; однако некоторым разработчикам необходимо отслеживать установки устройств, и это сделает трюк или производительность, основанную на подобное устройство.

API >= 9:

если их Android-устройство API 9 или более, это гарантированно будет уникальным из-за "сборки".Серийное поле.

если все остальное терпит неудачу:

если все остальное не удается, если пользователь имеет ниже, чем API 9 (ниже, чем Gingerbread), сбросил свое устройство или "безопасный".ANDROID_ID "возвращает " null", то просто ID возвращается будет исключительно на основе их Android информации об устройстве. Это где столкновения могут случаться.

  • Удалено ' Android.SECURE_ID ' из-за заводских сбросов может привести к изменению значения
  • отредактировал код для изменения в API
  • изменен псевдо

пожалуйста, взгляните на метод ниже:

из консоли разработчика Google Play:

начиная с 1 августа 2014, политика программы разработчика Google Play требуется все новые загрузки приложений и обновления для использования рекламного идентификатора в замените любые другие постоянные идентификаторы для любых рекламных целей. Учить больше

реализация:

Источник/Документы:

важно:

предполагается, что реклама ID полностью заменить существующий использование других идентификаторов для целей рекламы (например, использование ANDROID_ID в настройках.Secure), когда доступны сервисы Google Play. Случаи где службы Google Play недоступны, указывается GooglePlayServicesNotAvailableException выбрасывается getAdvertisingIdInfo ().

предупреждение, пользователи могут сброс:

я попытался ссылаться на каждую ссылку, из которой я взял информацию. Если вы отсутствуете и должны быть включены, пожалуйста, прокомментируйте!

Google Player Services InstanceID

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

основываясь на рекомендациях Google, я реализовал класс, который будет генерировать уникальный UUID для каждого устройства, используя ANDROID_ID в качестве семени, где это необходимо, возвращаясь к TelephonyManager.getDeviceId () по мере необходимости, и если это не удается, прибегая к случайно сгенерированному уникальному UUID, который сохраняется при перезапуске приложения (но не при повторной установке приложения).

обратите внимание, что для устройств, которые должны иметь резервный идентификатор устройства, уникальный идентификатор будет упорствуют через сброс фабрики. Это что-то знать. Если вам нужно убедиться, что заводская перезагрузка сбросит Ваш уникальный идентификатор, вы можете рассмотреть возможность возврата непосредственно к случайному UUID вместо идентификатора устройства.

опять же, этот код предназначен для идентификатора устройства, а не ID установки приложения. В большинстве случаев идентификатор установки приложения-это, вероятно, то, что вы ищете. Но если вам нужен ID устройства, то следующий код будет работать на вы.

вот код, который 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

есть довольно полезная информация здесь.

он охватывает пять различных типов идентификаторов:

  1. IMEI (только для Android устройств с использованием телефона; потребности android.permission.READ_PHONE_STATE )
  2. псевдо-уникальный ID (для всех устройств Android)
  3. Android ID (может быть null, может изменяться при сбросе заводских настроек, может быть изменен на корневом телефоне)
  4. WLAN MAC-адрес строка (должен android.permission.ACCESS_WIFI_STATE )
  5. BT MAC-адрес строка (устройства с Bluetooth, потребности android.permission.BLUETOOTH )

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

At Google I / O Reto Meier выпустила надежный ответ на то, как подойти к этому, который должен удовлетворить большинство разработчиков, чтобы отслеживать пользователей через установки. Энтони Нолан показывает направление в своем ответе, но я подумал, что напишу полный подход, чтобы другие могли легко увидеть, как это сделать (мне потребовалось некоторое время, чтобы выяснить детали).

этот подход даст вам анонимный, безопасный идентификатор пользователя, который будет постоянным для пользователя в разных устройства (на основе основной учетной записи Google) и между установками. Основной подход заключается в создании случайного идентификатора пользователя и сохранении его в общих настройках приложений. Затем вы используете агент резервного копирования Google для хранения общих настроек, связанных с учетной записью Google в облаке.

Google будет дать вам ключ службы резервного копирования, который необходимо добавить в манифест. Вы также должны сказать приложению использовать BackupAgent следующим образом:

затем вам нужно создать агент резервного копирования и сказать ему использовать вспомогательный агент для sharedpreferences:

для завершения резервного копирования вам необходимо создать экземпляр BackupManager в вашей основной деятельности:

наконец, создайте идентификатор пользователя, если он еще не существует, и сохраните его в SharedPreferences:

этот User_ID теперь будет сохраняться на всех установках, даже если пользователь перемещает устройство.

для получения дополнительной информации об этом подходе см. разговор Рето.

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

следующий код возвращает серийный номер устройства с помощью скрытого API Android. Но этот код не работает на вкладке Samsung Galaxy, потому что " ro.serialno " не установлен на этом устройстве.

Я думаю, что это верный способ построения скелета уникальный идентификатор. проверить его.

псевдо-уникальный ID, который работает на всех устройствах Android Некоторые устройства не имеют телефона (например. Таблетки) или по какой-то причине вы не хотите включать разрешение READ_PHONE_STATE. Вы все еще можете прочитать детали, такие как версия ROM, имя производителя, тип процессора и другие детали оборудования, которые будут хорошо подходить, если вы хотите использовать ID для проверки серийного ключа или других общих целей. Этот ID, вычисленный таким образом, не будет уникальным: можно найти два устройства с одинаковым ID (на основе одного и того же оборудования и образа ROM), но изменения в реальных приложениях незначительны. Для этого можно использовать класс Build:

большинство членов сборки-строки, то, что мы здесь делаем, - это взять их длину и преобразовать ее по модулю в цифру. У нас есть 13 таких цифр, и мы добавляем еще две спереди (35), чтобы иметь тот же идентификатор размера, ЧТО и IMEI (15 десятичные знаки.) Есть и другие возможности здесь хорошо, просто взгляните на эти строки. Возвращает что-то вроде 355715565309247 . Специального разрешения не требуется, что делает такой подход очень удобным.

(дополнительная информация: приведенная выше техника была скопирована из статьи на Карман Магия.)

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

на серийный поле было добавлено к Build класс в API уровня 9 (Android 2.3-Gingerbread). В документации говорится, что он представляет серийный номер оборудования. Таким образом, он должен быть уникальным, если он существует на устройстве.

Я не знаю, действительно ли он поддерживается (=не null) всеми устройствами с уровнем API >= 9.

одна вещь, которую я добавлю - у меня есть одна из этих уникальных ситуаций.

оказывается, что, хотя мой планшет Viewsonic G сообщает DeviceID, который не является нулевым, каждый планшет G сообщает одно и то же число.

делает его интересным, играя "Pocket Empires", который дает вам мгновенный доступ к чьей-то учетной записи на основе" уникального " DeviceID.

мое устройство не имеет сотового радио.

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

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

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

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

Читайте также: