- Как найти серийный номер Android-устройства?
- ОТВЕТЫ
- Ответ 1
- Ответ 2
- Ответ 3
- Ответ 4
- Ответ 5
- Ответ 6
- Ответ 7
- Ответ 8
- Ответ 9
- Ответ 10
- Ответ 11
- Ответ 12
- Ответ 13
- Ответ 14
- Как найти серийный номер Android-устройства?
- ОТВЕТЫ
- Ответ 1
- Ответ 2
- Ответ 3
- Ответ 4
- Ответ 5
- Ответ 6
- Ответ 7
- Ответ 8
- Ответ 9
- Ответ 10
- Ответ 11
- Ответ 12
- Ответ 13
- Ответ 14
Как найти серийный номер Android-устройства?
Мне нужно использовать уникальный идентификатор для Android-приложения, и я думал, что серийный номер устройства будет хорошим кандидатом. Как получить серийный номер устройства Android в моем приложении?
ОТВЕТЫ
Ответ 1
getSystemService — это метод класса Activity. getDeviceID() вернет MDN или MEID устройства в зависимости от того, какая радиоприемник использует телефон (GSM или CDMA).
Каждое устройство ДОЛЖНО вернуть уникальное значение здесь (при условии, что это телефон). Это должно работать на любом устройстве Android с SIM-слотом или CDMA-радио. Вы сами по себе с микрофоном с питанием от Android, -)
Ответ 2
Как упоминает Дейв Вебб, в Android Developer Blog есть статья, которая охватывает это.
Я поговорил с кем-то в Google, чтобы получить некоторые дополнительные разъяснения по нескольким пунктам. Вот что я обнаружил, что НЕ упоминается в вышеупомянутом сообщении в блоге:
- ANDROID_ID является предпочтительным решением. ANDROID_ID отлично надежен в версиях Android = 2.3. Только 2.2 имеет проблемы, упомянутые в сообщении.
- Несколько устройств нескольких производителей подвержены ошибке ANDROID_ID в версии 2.2.
- Насколько мне удалось определить, все уязвимые устройства те же ANDROID_ID, что 9774d56d682e549c. Это также тот же идентификатор устройства, о котором сообщает эмулятор, кстати.
- Google полагает, что OEM-производители исправили проблему для многих или большинства своих устройств, но я смог проверить, что по состоянию на начало апреля 2011 года, по крайней мере, до сих пор довольно легко найти устройства с разбитым ANDROID_ID.
Основываясь на рекомендациях Google, я внедрил класс, который будет генерировать уникальный UUID для каждого устройства, используя ANDROID_ID в качестве семени, где это необходимо, при необходимости возвращаться к TelephonyManager.getDeviceId(), и если это не удастся, прибегая к случайному сгенерированный уникальный UUID, который сохраняется через перезагрузки приложений (но не для повторной установки приложения).
Ответ 3
Этот код возвращает порядковый номер устройства с помощью скрытого API Android.
Ответ 4
Хотя, не гарантируется, что идентификатор Android будет уникальным идентификатором.
Ответ 5
Он рекомендует использовать TelephonyManager.getDeviceId() , поскольку он не работает на устройствах Android, которые не являются телефонами, такими как планшеты, для этого требуется разрешение READ_PHONE_STATE , и оно не работает надежно на всех телефонах.
Вместо этого вы можете использовать одно из следующих действий:
- Адрес Mac
- Серийный номер
- ANDROID_ID
В статье обсуждаются плюсы и минусы каждого, и это стоит прочитать, чтобы вы могли работать, что было бы лучше для вашего использования.
Ответ 6
Для простого номера, уникального для устройства и константы для его времени жизни (запрет factory reset или взлом), используйте Settings.Secure.ANDROID_ID.
Чтобы использовать серийный номер устройства (тот, который показан в разделе «Системные настройки/О программе/Статус» ), если он доступен, и вернуться к идентификатору Android:
Ответ 7
IMEI хорош, но работает только на устройствах Android с телефоном. Вы также должны рассмотреть возможность поддержки планшета или других устройств Android, у которых нет телефона.
У вас есть несколько альтернатив, например: Build class members, BT MAC, WLAN MAC или даже лучше — комбинация из всех этих.
Я объяснил эти подробности в статье в своем блоге: http://www.pocketmagic.net/?p=1662
Ответ 8
Так как нет ответа, здесь упоминается идеальный, отказоустойчивый идентификатор, который является ПОСТОЯННЫМ через обновления системы и существует во всех устройствах (в основном из-за того, что не существует индивидуального решения от Google), Я решил опубликовать метод, который является следующим лучшим, путем объединения двух доступных идентификаторов и проверки выбора между ними во время выполнения.
Перед кодом, 3 факта:
TelephonyManager.getDeviceId() (akaIMEI) не будет работать хорошо или вообще не для устройств, отличных от GSM, 3G, LTE и т.д., но всегда будет возвращать уникальный идентификатор, если имеется соответствующее оборудование, даже если SIM-карта не вставлена или даже когда нет SIM-слота (некоторые OEM сделали это).
Так как Gingerbread (Android 2.3) android.os.Build.SERIAL должен существовать на любом устройстве, которое не предоставляет IMEI, т.е. не имеет вышеупомянутого оборудования в соответствии с политикой Android.
В силу факта (2.), хотя бы один из этих двух уникальных идентификаторов будет ВСЕГДА присутствовать, а SERIAL может присутствовать одновременно что IMEI есть.
Решение
С приведенными выше фактами всегда можно получить уникальный идентификатор, проверяя, есть ли оборудование, связанное с IMEI, и возвращаться к SERIAL, когда это не так, поскольку нельзя проверить, действительно ли существующий SERIAL действителен. Следующий статический класс представляет 2 метода проверки такого присутствия и использования либо IMEI, либо SERIAL:
Я бы посоветовал использовать getCleartextID_HARDCHECK . Если отражение не вставляется в вашу среду, используйте вместо этого метод getCleartextID_SIMCHECK , но учтите, что он должен быть адаптирован к вашим конкретным потребностям в присутствии SIM-карты.
PS. Обратите внимание, что OEM смог выполнить проверку SERIAL в соответствии с политикой Google (несколько устройств с одним и тем же SERIAL), а Google, как указано, существует как минимум один известный случай в большом OEM (не раскрывается, и я не знаю, какой бренд он либо, я думаю, Samsung).
Отказ от ответственности. Это отвечает на исходный вопрос о получении уникального идентификатора устройства, но ОП представил неоднозначность, заявив, что ему нужен уникальный идентификатор для APP. Даже если для таких сценариев Android_ID будет лучше, он НЕ РАБОТАЕТ, скажем, Titanium Backup приложения через 2 разных установки ROM (может даже быть одним и тем же ПЗУ). Мое решение поддерживает постоянство, которое не зависит от флеш-памяти или factory reset, и будет терпеть неудачу только в том случае, если IMEI или SERIAL происходит с помощью хакеров/аппаратных мод.
Ответ 9
Есть проблемы со всеми вышеперечисленными подходами. В Google i/o Reto Meier выложили надежный ответ на вопрос о том, как подойти к этому, что должно удовлетворить большинство разработчиков, чтобы отслеживать пользователей через установки.
Этот подход даст вам анонимный безопасный идентификатор пользователя, который будет постоянным для пользователя на разных устройствах (включая планшеты на основе основной учетной записи Google) и через установки на том же устройстве. Основной подход — генерировать случайный идентификатор пользователя и сохранять его в общих настройках приложений. Затем вы используете агент Google для резервного копирования для хранения общих настроек, связанных с учетной записью Google в облаке.
Давайте рассмотрим полный подход. Сначала нам нужно создать резервную копию для наших SharedPreferences с помощью службы резервного копирования Android. Начните с регистрации своего приложения по этой ссылке: http://developer.android.com/google/backup/signup.html
Google предоставит вам ключ службы резервного копирования, который необходимо добавить в манифест. Вам также необходимо сообщить приложению, чтобы использовать BackupAgent следующим образом:
Затем вам нужно создать резервный агент и сообщить ему использовать вспомогательный агент для sharedpreferences:
Чтобы завершить резервное копирование, вам нужно создать экземпляр BackupManager в своей основной деятельности:
Наконец, создайте идентификатор пользователя, если он еще не существует, и сохраните его в SharedPreferences:
Этот User_ID теперь будет постоянным во всех установках, даже если пользователь переключает устройства.
И для полной информации о том, как реализовать резервный агент, см. сайт разработчика здесь: http://developer.android.com/guide/topics/data/backup.html Я особенно рекомендую раздел внизу тестирования, так как резервное копирование не происходит мгновенно, поэтому для проверки необходимо принудительно выполнить резервное копирование.
Ответ 10
Другой способ — использовать /sys/class/android _usb/android0/iSerial в приложении без каких-либо разрешений.
Чтобы сделать это в java, просто используйте FileInputStream, чтобы открыть файл iSerial и прочитать символы. Просто убедитесь, что вы завернули его в обработчик исключений, потому что не все устройства имеют этот файл.
Известно, что, по крайней мере, следующие устройства имеют доступ к этому файлу:
- Galaxy Nexus
- Nexus S
- Motorola Xoom 3g
- Toshiba AT300
- HTC One V
- Mini MK802
- Samsung Galaxy S II
Вы также можете увидеть мой блог здесь: http://insitusec.blogspot.com/2013/01/leaking-android-hardware-serial-number.html, где я обсуждаю, какие другие файлы доступны для информации.
Ответ 11
Уникальный идентификатор устройства Android OS Device в качестве строки.
но я настоятельно рекомендую этот метод, предложенный Google::
Ответ 12
Как говорит @haserman:
Но это необходимо, включая разрешение в файле манифеста:
Ответ 13
Я знаю, что этот вопрос старый, но это можно сделать в одной строке кода
String deviceID = Build.SERIAL;
Ответ 14
Я нашел класс примера, отправленный @emmby выше, чтобы стать отличной отправной точкой. Но у него есть несколько недостатков, как упоминалось другими плакатами. Главное заключается в том, что он не требует UUID для XML файла без необходимости и после этого всегда извлекает его из этого файла. Это открывает класс для простого взлома: любой, у кого есть встроенный телефон, может редактировать XML файл, чтобы дать себе новый UUID.
Я обновил код, чтобы он сохранялся только в XML, если это абсолютно необходимо (т.е. при использовании произвольно сгенерированного UUID), и рефакторизует логику в ответ на @Brill Pappin:
Источник
Как найти серийный номер Android-устройства?
Мне нужно использовать уникальный идентификатор для Android-приложения, и я думал, что серийный номер устройства будет хорошим кандидатом. Как получить серийный номер устройства Android в моем приложении?
ОТВЕТЫ
Ответ 1
getSystemService — это метод класса Activity. getDeviceID() вернет MDN или MEID устройства в зависимости от того, какая радиоприемник использует телефон (GSM или CDMA).
Каждое устройство ДОЛЖНО вернуть уникальное значение здесь (при условии, что это телефон). Это должно работать на любом устройстве Android с SIM-слотом или CDMA-радио. Вы сами по себе с микрофоном с питанием от Android, -)
Ответ 2
Как упоминает Дейв Вебб, в Android Developer Blog есть статья, которая охватывает это.
Я поговорил с кем-то в Google, чтобы получить некоторые дополнительные разъяснения по нескольким пунктам. Вот что я обнаружил, что НЕ упоминается в вышеупомянутом сообщении в блоге:
- ANDROID_ID является предпочтительным решением. ANDROID_ID отлично надежен в версиях Android = 2.3. Только 2.2 имеет проблемы, упомянутые в сообщении.
- Несколько устройств нескольких производителей подвержены ошибке ANDROID_ID в версии 2.2.
- Насколько мне удалось определить, все уязвимые устройства те же ANDROID_ID, что 9774d56d682e549c. Это также тот же идентификатор устройства, о котором сообщает эмулятор, кстати.
- Google полагает, что OEM-производители исправили проблему для многих или большинства своих устройств, но я смог проверить, что по состоянию на начало апреля 2011 года, по крайней мере, до сих пор довольно легко найти устройства с разбитым ANDROID_ID.
Основываясь на рекомендациях Google, я внедрил класс, который будет генерировать уникальный UUID для каждого устройства, используя ANDROID_ID в качестве семени, где это необходимо, при необходимости возвращаться к TelephonyManager.getDeviceId(), и если это не удастся, прибегая к случайному сгенерированный уникальный UUID, который сохраняется через перезагрузки приложений (но не для повторной установки приложения).
Ответ 3
Этот код возвращает порядковый номер устройства с помощью скрытого API Android.
Ответ 4
Хотя, не гарантируется, что идентификатор Android будет уникальным идентификатором.
Ответ 5
Он рекомендует использовать TelephonyManager.getDeviceId() , поскольку он не работает на устройствах Android, которые не являются телефонами, такими как планшеты, для этого требуется разрешение READ_PHONE_STATE , и оно не работает надежно на всех телефонах.
Вместо этого вы можете использовать одно из следующих действий:
- Адрес Mac
- Серийный номер
- ANDROID_ID
В статье обсуждаются плюсы и минусы каждого, и это стоит прочитать, чтобы вы могли работать, что было бы лучше для вашего использования.
Ответ 6
Для простого номера, уникального для устройства и константы для его времени жизни (запрет factory reset или взлом), используйте Settings.Secure.ANDROID_ID.
Чтобы использовать серийный номер устройства (тот, который показан в разделе «Системные настройки/О программе/Статус» ), если он доступен, и вернуться к идентификатору Android:
Ответ 7
IMEI хорош, но работает только на устройствах Android с телефоном. Вы также должны рассмотреть возможность поддержки планшета или других устройств Android, у которых нет телефона.
У вас есть несколько альтернатив, например: Build class members, BT MAC, WLAN MAC или даже лучше — комбинация из всех этих.
Я объяснил эти подробности в статье в своем блоге: http://www.pocketmagic.net/?p=1662
Ответ 8
Так как нет ответа, здесь упоминается идеальный, отказоустойчивый идентификатор, который является ПОСТОЯННЫМ через обновления системы и существует во всех устройствах (в основном из-за того, что не существует индивидуального решения от Google), Я решил опубликовать метод, который является следующим лучшим, путем объединения двух доступных идентификаторов и проверки выбора между ними во время выполнения.
Перед кодом, 3 факта:
TelephonyManager.getDeviceId() (akaIMEI) не будет работать хорошо или вообще не для устройств, отличных от GSM, 3G, LTE и т.д., но всегда будет возвращать уникальный идентификатор, если имеется соответствующее оборудование, даже если SIM-карта не вставлена или даже когда нет SIM-слота (некоторые OEM сделали это).
Так как Gingerbread (Android 2.3) android.os.Build.SERIAL должен существовать на любом устройстве, которое не предоставляет IMEI, т.е. не имеет вышеупомянутого оборудования в соответствии с политикой Android.
В силу факта (2.), хотя бы один из этих двух уникальных идентификаторов будет ВСЕГДА присутствовать, а SERIAL может присутствовать одновременно что IMEI есть.
Решение
С приведенными выше фактами всегда можно получить уникальный идентификатор, проверяя, есть ли оборудование, связанное с IMEI, и возвращаться к SERIAL, когда это не так, поскольку нельзя проверить, действительно ли существующий SERIAL действителен. Следующий статический класс представляет 2 метода проверки такого присутствия и использования либо IMEI, либо SERIAL:
Я бы посоветовал использовать getCleartextID_HARDCHECK . Если отражение не вставляется в вашу среду, используйте вместо этого метод getCleartextID_SIMCHECK , но учтите, что он должен быть адаптирован к вашим конкретным потребностям в присутствии SIM-карты.
PS. Обратите внимание, что OEM смог выполнить проверку SERIAL в соответствии с политикой Google (несколько устройств с одним и тем же SERIAL), а Google, как указано, существует как минимум один известный случай в большом OEM (не раскрывается, и я не знаю, какой бренд он либо, я думаю, Samsung).
Отказ от ответственности. Это отвечает на исходный вопрос о получении уникального идентификатора устройства, но ОП представил неоднозначность, заявив, что ему нужен уникальный идентификатор для APP. Даже если для таких сценариев Android_ID будет лучше, он НЕ РАБОТАЕТ, скажем, Titanium Backup приложения через 2 разных установки ROM (может даже быть одним и тем же ПЗУ). Мое решение поддерживает постоянство, которое не зависит от флеш-памяти или factory reset, и будет терпеть неудачу только в том случае, если IMEI или SERIAL происходит с помощью хакеров/аппаратных мод.
Ответ 9
Есть проблемы со всеми вышеперечисленными подходами. В Google i/o Reto Meier выложили надежный ответ на вопрос о том, как подойти к этому, что должно удовлетворить большинство разработчиков, чтобы отслеживать пользователей через установки.
Этот подход даст вам анонимный безопасный идентификатор пользователя, который будет постоянным для пользователя на разных устройствах (включая планшеты на основе основной учетной записи Google) и через установки на том же устройстве. Основной подход — генерировать случайный идентификатор пользователя и сохранять его в общих настройках приложений. Затем вы используете агент Google для резервного копирования для хранения общих настроек, связанных с учетной записью Google в облаке.
Давайте рассмотрим полный подход. Сначала нам нужно создать резервную копию для наших SharedPreferences с помощью службы резервного копирования Android. Начните с регистрации своего приложения по этой ссылке: http://developer.android.com/google/backup/signup.html
Google предоставит вам ключ службы резервного копирования, который необходимо добавить в манифест. Вам также необходимо сообщить приложению, чтобы использовать BackupAgent следующим образом:
Затем вам нужно создать резервный агент и сообщить ему использовать вспомогательный агент для sharedpreferences:
Чтобы завершить резервное копирование, вам нужно создать экземпляр BackupManager в своей основной деятельности:
Наконец, создайте идентификатор пользователя, если он еще не существует, и сохраните его в SharedPreferences:
Этот User_ID теперь будет постоянным во всех установках, даже если пользователь переключает устройства.
И для полной информации о том, как реализовать резервный агент, см. сайт разработчика здесь: http://developer.android.com/guide/topics/data/backup.html Я особенно рекомендую раздел внизу тестирования, так как резервное копирование не происходит мгновенно, поэтому для проверки необходимо принудительно выполнить резервное копирование.
Ответ 10
Другой способ — использовать /sys/class/android _usb/android0/iSerial в приложении без каких-либо разрешений.
Чтобы сделать это в java, просто используйте FileInputStream, чтобы открыть файл iSerial и прочитать символы. Просто убедитесь, что вы завернули его в обработчик исключений, потому что не все устройства имеют этот файл.
Известно, что, по крайней мере, следующие устройства имеют доступ к этому файлу:
- Galaxy Nexus
- Nexus S
- Motorola Xoom 3g
- Toshiba AT300
- HTC One V
- Mini MK802
- Samsung Galaxy S II
Вы также можете увидеть мой блог здесь: http://insitusec.blogspot.com/2013/01/leaking-android-hardware-serial-number.html, где я обсуждаю, какие другие файлы доступны для информации.
Ответ 11
Уникальный идентификатор устройства Android OS Device в качестве строки.
но я настоятельно рекомендую этот метод, предложенный Google::
Ответ 12
Как говорит @haserman:
Но это необходимо, включая разрешение в файле манифеста:
Ответ 13
Я знаю, что этот вопрос старый, но это можно сделать в одной строке кода
String deviceID = Build.SERIAL;
Ответ 14
Я нашел класс примера, отправленный @emmby выше, чтобы стать отличной отправной точкой. Но у него есть несколько недостатков, как упоминалось другими плакатами. Главное заключается в том, что он не требует UUID для XML файла без необходимости и после этого всегда извлекает его из этого файла. Это открывает класс для простого взлома: любой, у кого есть встроенный телефон, может редактировать XML файл, чтобы дать себе новый UUID.
Я обновил код, чтобы он сохранялся только в XML, если это абсолютно необходимо (т.е. при использовании произвольно сгенерированного UUID), и рефакторизует логику в ответ на @Brill Pappin:
Источник