Путаница идентификатор устройства 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 # * # * набрать номер?
5 ответов
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. Как прокомментировал Schlangi, некоторые устройства, у которых нет модуля телефонии, Schlangi IMEI, поэтому наличие IMEI (не всегда) гарантирует, что устройство имеет модуль телефонии.
ANDROID_ID
ANDROID_ID - это еще один уникальный номер телефона - он автоматически генерируется ОС при первой загрузке (выполнение этого способа облегчает производителям удаление шага с производственной линии).
ANDROID_ID может (и может) измениться, например:
- Сброс к заводским настройкам (в том числе при перепрошивке ОС)
- В программном обеспечении: например, https://play.google.com/store/apps/details?id=com.vcastroi.changeid
Он в основном используется разработчиками (например, для идентификации и подключения к устройствам с использованиемadb
)
ANDROID_ID может использоваться для идентификации устройства Android с учетом приведенных выше предостережений, реально означающих, что оно однозначно идентифицирует устройство в течение значительных частей срока службы устройства, но на него нельзя полагаться.
Также обратите внимание, что в Froyo была ошибка, когда многие устройства давали себеодинаковый ANDROID_ID. Это ошибка
Другие идентификаторы
Существует ряд других вещей, которые можно использовать для идентификации устройства:
- MAC-адрес модуля WiFi: WifiManager.getConnectionInfo ()-> WifiInfo.getMacAddress (). Это часто можно изменить в программном обеспечении, но обычно оно постоянно в течение срока службы устройства. Также его можно прочитать, только если включен модуль WiFi.
- MAC-адрес модуля BlueTooth: BluetoothAdaptor.getAddress (). Как и WiFi MAC, это часто можно изменить в программном обеспечении и отключить при необходимости
- Телефонный номер абонента. Это может измениться, если пользователь запрашивает новый номер у оператора или если пользователь переключает SIM-карты. Это получено из TelephonyManager.getLine1Number (). Это доступно только для телефонных устройств Android с установленной текущей SIM-картой и платной услугой с оператором.
- SIM-карта содержит собственный идентификационный номер ( IMSI). Это получается из API TelephonyManager.getSubscriberId (). Очевидно, что 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
Найдено в сети:
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.
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 будет иметь нулевое значение.
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-адреса BT, доступная на устройствах 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