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

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

sourceисточник

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

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

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

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

Ответ 1

IMEI

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

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

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

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

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

Android-устройства без модулей телефонии - например, многие планшеты и телевизионные устройства - не имеют IMEI. Как отмечалось в Schlangi, некоторые устройства, у которых нет модуля телефонии, подделывают 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). Это получается из TelephonyManager.getSubscriberId() API. Очевидно, что SIM-карта может отсутствовать в любое конкретное время, и она изменяется при изменении SIM-карты, и пользователи могут обновлять или заменять свою SIM-карту, сохраняя один и тот же номер, поэтому вы не можете сказать, что это взаимно однозначно конкретный телефон или пользователь.
  • В связи с IMSI есть MSISDN, Это работает как идентификация подписки (ваш контракт на определенный номер телефона с вашим мобильным провайдером) и, следовательно, дает устройству свой номер телефона. MSISDN может быть связан с несколькими SIM-картами и, следовательно, с несколькими телефонами. Он поставляется со всеми предостережениями для чтения SIM-карты выше. Это можно получить с помощью TelephonyManager.getSimSerialNumber(). Спасибо Schlangi за исправления и дополнения
  • Gingerbread, а позже android.os.Build.SERIAL, который многие производители установили (но не все) Bugger).

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

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

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

Ответ 2

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

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/

Ответ 3

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

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

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

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

   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). Для получения дополнительной информации обратитесь к этой ссылке.

Ответ 4

IMEI

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

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

ANDROID_ID

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

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

EDIT:

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

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

Ответ 5

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

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

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

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

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