Ошибка идентификации устройства 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 # * # * набрать?

Solutions Collecting From Web of "Ошибка идентификации устройства Android"

IMEI

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

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

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

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

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

Android-устройства без модулей телефонии – например, многие планшеты и телевизионные устройства – не имеют 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; } } 

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

 <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> 

Однако я сомневаюсь, что это документированный идентификатор, и я буду осторожен, потому что это может не сработать, если 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