ошибка идентификации устройства Android

Если я набираю * # * # 8 2 5 5 # * # * , я получаю идентификатор устройства Android, который начинается с android- 35c2acdd...

источник источник

Если я использую Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID) результат начинается с a96b4b27...

Если я использую ((TelephonyManager) Context.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId() результат начинается с 3538330...

В чем разница между этими идентификаторами? Как я могу получить результат

* # * # 8 2 5 5 # * # * набрать?

IMEI

IMEI – это « MAC » для модуля телефонии – уникальный идентификатор, который использует телефон, когда он подключается через GSM / GPRS / HSPDA / и т. Д. Сеть GSM использует его для маршрутизации вызовов и данных с телефона по сети GSM вплоть до шлюза в Интернет (который является сетью IP).

Модуль телефонии представляет собой чип или печатную плату, которая обрабатывает телефонную сеть, GSM или CMDA, и часто имеет слот для сменной SIM-карты. В некоторых телефонах имеется несколько телефонных модhive (активные телефоны с двумя или несколькими SIM-картами). Каждый модуль телефонии имеет собственный IMEI.

Производители дают каждому телефону (строгому модулю телефонии) уникальный IMEI во время производства. Однако, как правило, номер может быть переписан, если у вас есть правильное программное обеспечение. Это часто делается после того, как телефон был украден, чтобы дать телефону новую идентификацию и бипасс, украденную систему блокировки телефона.

IMEI можно программно получить с помощью API TelephonyManager.getDeviceId () .

Телефоны CDMA имеют ESN или MEID, которые различаются по длине и форматам , даже если они извлекаются с использованием того же API.

Android-устройства без модhive телефонии – например, многие highcharts и телевизионные устройства – не имеют IMEI . Как заметил Шланги , некоторые устройства, у которых нет модуля телефонии, подделывают IMEI, поэтому присутствие IMEI (всегда) не гарантирует, что устройство имеет модуль телефонии.

ANDROID_ID

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

ANDROID_ID может (и делает) изменить, например:

Он в основном используется разработчиками (например, идентификация и подключение к устройствам с использованием adb )

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

Также обратите внимание, что в Froyo произошла ошибка, когда многие устройства предоставили себе тот же ANDROID_ID. Это ошибка

Другие идентификаторы

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

  • MAC-адрес модуля WiFi: WifiManager.getConnectionInfo () -> WifiInfo.getMacAddress () . Это часто может быть изменено в программном обеспечении, но, как правило, оно является постоянным в течение срока службы устройства. Также он может быть прочитан только в том случае, если включен WiFi-модуль.
  • MAC-адрес модуля BlueTooth: BluetoothAdaptor.getAddress () . Подобно WiFi MAC, это часто может быть изменено в программном обеспечении и может быть выключено, когда вам это нужно
  • Номер телефона абонента. Это может измениться, если пользователь запрашивает новый номер у telco или пользователь переключает SIM-карты. Он получен из TelephonyManager.getLine1Number () . Это доступно только для телефонов Android с установленной SIM-картой и платной услугой с помощью телекоммуникационной компании.
  • SIM-карта содержит свой идентификационный номер ( IMSI ). Это получается из API TelephonyManager.getSubscriberId () . Очевидно, что SIM-карта может отсутствовать в любое конкретное время, и она изменяется при изменении SIM-карты, и пользователи могут обновлять или заменять свою SIM-карту, сохраняя один и тот же номер, поэтому вы не можете сказать, что это взаимно однозначно конкретный телефон или пользователь.
  • К IMSI относится MSISDN . Это работает как идентификация подписки (ваш контракт на определенный номер телефона с вашим мобильным провайдером) и, следовательно, дает устройству свой номер телефона. MSISDN может быть связан с несколькими SIM-картами и, следовательно, с несколькими телефонами. Он поставляется со всеми предостережениями для чтения SIM-карты выше. Это можно получить с помощью TelephonyManager.getSimSerialNumber () . Спасибо Шланги за исправления и дополнения
  • Gingerbread, а позже имеет android.os.Build.SERIAL, который многие производители установили (но не все) Bugger).

Другие примечания

Вам нужны специальные разрешения для доступа к каждому API, поэтому, если вы попробуете их все, разрешения вашего приложения в магазине Google Play выглядят достаточно разрешительными.

Я думаю, эта ссылка объясняет все другие доступные варианты https://android-developers.googleblog.com/2011/03/identifying-app-installations.html

Найдено в Интернете:

 private static final Uri URI = Uri.parse("content://com.google.android.gsf.gservices"); private static final String ID_KEY = "android_id"; String getAndroidId(Context ctx) { String[] params = { ID_KEY }; Cursor c = ctx.getContentResolver() .query(URI, null, null, params, null); if (!c.moveToFirst() || c.getColumnCount() < 2) return null; try { return Long.toHexString(Long.parseLong(c.getString(1))); } catch (NumberFormatException e) { return null; } } 

Добавить разрешение:

  

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

Источник: http://blog.codepainters.com/2012/01/17/how-to-obtain-gtalk-android-id/

Также стоит взглянуть на: http://www.toxicbakery.com/android-development/getting-google-auth-sub-tokens-in-your-android-applications/

Есть некоторый подход, чтобы получить уникальный идентификатор на телефоне Android.

  1. Android ID Это 64-разрядная шестнадцатеричная строка, которая генерируется при первой загрузке устройства. Как правило, он не будет изменен, если не будет сброшен заводской настройкой.

    Secure.getString (getContentResolver (), Secure.ANDROID_ID);

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

  String m_szAndroidID = Secure.getString(getContentResolver(), Secure.ANDROID_ID); Returns: 9774d56d682e549c . No special permissions required. 

2. Строка MAC-адреса WLAN – это еще один уникальный идентификатор, который можно использовать как идентификатор устройства. Прежде чем вы прочитаете, вам нужно убедиться, что ваш проект имеет разрешение android.permission.ACCESS_WIFI_STATE или MAC-адрес WLAN, будет отображаться как null.

  WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE); String m_szWLANMAC = wm.getConnectionInfo().getMacAddress(); Returns: 00:11:22:33:44:55 (not a real address since this is a custom ROM , as you can see the MAC address can easily be faked). WLAN doesn't have to be on, to read this value. 

3. Строка MAC MAC-адреса, доступная на устройствах Android с Bluetooth, может быть прочитана, если ваш проект имеет разрешение android.permission.BLUETOOTH.

  BluetoothAdapter m_BluetoothAdapter = null; // Local Bluetooth adapter m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); String m_szBTMAC = m_BluetoothAdapter.getAddress(); 

Возврат: 43: 25: 78: 50: 93: 38. BT не должен быть включен, чтобы прочитать его. 4. IMEI только для устройств Android с использованием телефона:

  TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE); String szImei = TelephonyMgr.getDeviceId(); // Requires READ_PHONE_STATE 

Для этого требуется добавить разрешение в AndroidManifest.xml, и пользователи будут уведомлены об установке вашего программного обеспечения: android.permission.READ_PHONE_STATE. IMEI уникален для вашего телефона, и он выглядит так: 359881030314356 (если у вас нет предустановленного устройства с недопустимым IMEI, например 0000000000000). Для получения дополнительной информации обратитесь к этой ссылке.

IMEI

Органами стандартизации требуется обязательное требование, что мобильные устройства для сетей общего пользования могут быть однозначно идентифицированы номером IMEI

Ответственность за установку IMEI лежит на изготовителе. На практике разработчики иногда видят IMEI как 000000 … или 123456 … Иногда телефоны с идентичным IMEI идут на производство, что, конечно же, является ошибкой, которая должна быть исправлена ​​…

ANDROID_ID

64-разрядное число (как шестнадцатеричная строка), которое произвольно генерируется при первой загрузке устройства и должно оставаться постоянным на протяжении всего срока службы устройства. (Значение может измениться, если на устройстве выполняется заводская перезагрузка).

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

РЕДАКТИРОВАТЬ:

Это то, что я получаю (вместо IMEI) и Android-устройства, которое не является телефоном:

 $ adb shell dumpsys iphonesubinfo Phone Subscriber Info: Phone Type = GSM Device ID = null 

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

Тем не менее, я думаю, что вы все еще «не можете увидеть результат # # 8255 # # набора» (извините, если я ошибался, когда-либо понимая это)

Я предполагаю, что причиной этого является одно из последних исправлений ошибок в отношении USSD-кода, сделанного в Android. (вы можете узнать больше об этом и проверить, находится ли ваше устройство в списке. его по всему Интернету)

Наконец, если вы просто хотите получить идентификатор Android сразу, я предлагаю вам использовать это приложение,

https://play.google.com/store/apps/details?id=com.redphx.deviceid&hl=en

  • Могут ли новые версии JRE запускать Java-программы, скомпилированные со старыми версиями JDK?
  • Как отобразить два столбца ListView в Android?
  • Android Row становится Unclickable с кнопкой
  • Использование статических переменных в Android
  • Volley - отправка запроса POST с использованием JSONArrayRequest
  • java.io.StreamCorruptedException: недопустимый заголовок streamа: 54657374
  • Есть ли способ автоматически генерировать геттеры и сеттеры в Eclipse?
  • Чтение массива Json в андроиде
  • findviewbyid возвращает null в диалоговом окне
  • Android накладывает вид на все?
  • Что-то вроде «содержит любые» для набора Java?
  • Interesting Posts

    Слушатель событий на Java без приложения фокуса? (Глобальное обнаружение нажатия клавиш)

    Пример замедленного расширения в пакетном файле

    Каков способ командной строки отправки файлов в корзину?

    Различия между Исключением и ошибкой

    Невозможно вызвать class App_Code из кода

    * * * В traceroute

    JSF convertDateTime с часовым поясом в datatable

    Авторизация Android Facebook – невозможно войти в систему, когда установлено официальное приложение Facebook

    Нестатическая переменная не может ссылаться на статический контекст

    Преобразование текстовой строки Excel во время

    Преобразование из GLSurfaceView в TextureView (через GLTextureView)

    Преобразование видео с 1080p в 720p с минимальной потерей качества при использовании ffmpeg

    Возrotation перекрывающихся регулярных выражений

    Могут ли переопределенные методы различаться по типу возврата?

    android: configChanges = “ориентация” не работает с fragmentами

    Давайте будем гением компьютера.