Получите IMEI или Mac ip со ссылкой [duplicate]

280
задан Jabberwocky 19 May 2015 в 06:21
поделиться

14 ответов

Вы хотите вызвать android.telephony.TelephonyManager.getDeviceId() .

Это вернет любую строку, однозначно идентифицирующую устройство (IMEI в GSM, MEID для CDMA).

] Для этого вам понадобятся следующие разрешения в вашем AndroidManifest.xml:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

.

Сказав это, будьте осторожны об этом.

Обновление: Как уже упоминалось в комментариях ниже, это не так, как пользователи могут задаться вопросом, почему ваше приложение обращается к стеклу телефонии, может быть сложно перенести данные. безопасный способ аутентификации пользователей, а также проблемы конфиденциальности. Это не рекомендуется. Вместо этого посмотрите API входа в Google+ , если вы хотите внедрить систему входа без трения.

Android Backup API также доступен, если вы просто хотите легкий способ сохранить набор строк, когда пользователь сбрасывает свой телефон (или покупает новое устройство).

339
ответ дан Solidak 15 August 2018 в 14:10
поделиться
  • 1
    Что будет лучшим решением, которое позволит им перенести данные в будущем? Адрес электронной почты Google? Если да, то как я могу вытащить это из системы? – Tom 30 December 2009 в 12:17
  • 2
    Самый надежный способ сделать это - просто создать учетную запись при первом запуске приложения. Есть способы получить адрес электронной почты пользователя (см. Документы в AccountManager), но проверка того, что злонамеренный пользователь не подделал эту информацию, требует немного знаний о том, как работают API данных Google - больше, чем я могу поместить в этот маленький комментарий коробка. ;) – Trevor Johns 30 December 2009 в 23:48
  • 3
    Тревор, возможно ли, чтобы вы предоставили мне полный код? – user 17 June 2013 в 08:05
  • 4
    Ади: код для получения идентификатора устройства? Существует не более одного метода + разрешения, упомянутого выше. Тем не менее, вы должны заглянуть в API входа в Google+, это рекомендуемый подход для аутентификации пользователей в наши дни: developer.android.com/google/play-services/auth.html – Trevor Johns 18 June 2013 в 03:05
  • 5
    Он работает под управлением Android 6? И вы ориентируетесь на SDK 23? Затем вам нужно запросить READ_PHONE_STATE во время выполнения, прежде чем запрашивать IMEI – Flo We 6 June 2016 в 08:08

Вы можете использовать эту функцию TelephonyManager TELEPHONY_SERVICE для получения уникального идентификатора устройства, требуется разрешение: READ_PHONE_STATE

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

Пример: телефоны TELEPHONY_SERVICE и MEID или ESN для CDMA.

/** * Gets the device unique id called IMEI. Sometimes, this returns 00000000000000000 for the * rooted devices. **/ public static String getDeviceImei(Context ctx) { TelephonyManager telephonyManager = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE); return telephonyManager.getDeviceId(); }

MEID или ESN для CDMA , если идентификатор устройства недоступен.

3
ответ дан A-Droid Tech 15 August 2018 в 14:10
поделиться
  • 1
    и почему устройство Id null? из-за внедренного устройства. – Vishal Sojitra 28 March 2018 в 11:09

Для Android 6.0+ игра изменилась, поэтому я предлагаю вам использовать это:

Лучший способ пойти во время выполнения, иначе вы получите ошибки разрешения.

/** * A loading screen after AppIntroActivity. */ public class LoadingActivity extends BaseActivity { private static final int MY_PERMISSIONS_REQUEST_READ_PHONE_STATE = 0; private TextView loading_tv2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_loading); //trigger 'loadIMEI' loadIMEI(); /** Fading Transition Effect */ overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); } /** * Called when the 'loadIMEI' function is triggered. */ public void loadIMEI() { // Check if the READ_PHONE_STATE permission is already available. if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { // READ_PHONE_STATE permission has not been granted. requestReadPhoneStatePermission(); } else { // READ_PHONE_STATE permission is already been granted. doPermissionGrantedStuffs(); } } /** * Requests the READ_PHONE_STATE permission. * If the permission has been denied previously, a dialog will prompt the user to grant the * permission, otherwise it is requested directly. */ private void requestReadPhoneStatePermission() { if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_PHONE_STATE)) { // Provide an additional rationale to the user if the permission was not granted // and the user would benefit from additional context for the use of the permission. // For example if the user has previously denied the permission. new AlertDialog.Builder(LoadingActivity.this) .setTitle("Permission Request") .setMessage(getString(R.string.permission_read_phone_state_rationale)) .setCancelable(false) .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { //re-request ActivityCompat.requestPermissions(LoadingActivity.this, new String[]{Manifest.permission.READ_PHONE_STATE}, MY_PERMISSIONS_REQUEST_READ_PHONE_STATE); } }) .setIcon(R.drawable.onlinlinew_warning_sign) .show(); } else { // READ_PHONE_STATE permission has not been granted yet. Request it directly. ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, MY_PERMISSIONS_REQUEST_READ_PHONE_STATE); } } /** * Callback received when a permissions request has been completed. */ @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == MY_PERMISSIONS_REQUEST_READ_PHONE_STATE) { // Received permission result for READ_PHONE_STATE permission.est."); // Check if the only required permission has been granted if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // READ_PHONE_STATE permission has been granted, proceed with displaying IMEI Number //alertAlert(getString(R.string.permision_available_read_phone_state)); doPermissionGrantedStuffs(); } else { alertAlert(getString(R.string.permissions_not_granted_read_phone_state)); } } } private void alertAlert(String msg) { new AlertDialog.Builder(LoadingActivity.this) .setTitle("Permission Request") .setMessage(msg) .setCancelable(false) .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // do somthing here } }) .setIcon(R.drawable.onlinlinew_warning_sign) .show(); } public void doPermissionGrantedStuffs() { //Have an object of TelephonyManager TelephonyManager tm =(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); //Get IMEI Number of Phone //////////////// for this example i only need the IMEI String IMEINumber=tm.getDeviceId(); /************************************************ * ********************************************** * This is just an icing on the cake * the following are other children of TELEPHONY_SERVICE * //Get Subscriber ID String subscriberID=tm.getDeviceId(); //Get SIM Serial Number String SIMSerialNumber=tm.getSimSerialNumber(); //Get Network Country ISO Code String networkCountryISO=tm.getNetworkCountryIso(); //Get SIM Country ISO Code String SIMCountryISO=tm.getSimCountryIso(); //Get the device software version String softwareVersion=tm.getDeviceSoftwareVersion() //Get the Voice mail number String voiceMailNumber=tm.getVoiceMailNumber(); //Get the Phone Type CDMA/GSM/NONE int phoneType=tm.getPhoneType(); switch (phoneType) { case (TelephonyManager.PHONE_TYPE_CDMA): // your code break; case (TelephonyManager.PHONE_TYPE_GSM) // your code break; case (TelephonyManager.PHONE_TYPE_NONE): // your code break; } //Find whether the Phone is in Roaming, returns true if in roaming boolean isRoaming=tm.isNetworkRoaming(); if(isRoaming) phoneDetails+="\nIs In Roaming : "+"YES"; else phoneDetails+="\nIs In Roaming : "+"NO"; //Get the SIM state int SIMState=tm.getSimState(); switch(SIMState) { case TelephonyManager.SIM_STATE_ABSENT : // your code break; case TelephonyManager.SIM_STATE_NETWORK_LOCKED : // your code break; case TelephonyManager.SIM_STATE_PIN_REQUIRED : // your code break; case TelephonyManager.SIM_STATE_PUK_REQUIRED : // your code break; case TelephonyManager.SIM_STATE_READY : // your code break; case TelephonyManager.SIM_STATE_UNKNOWN : // your code break; } */ // Now read the desired content to a textview. loading_tv2 = (TextView) findViewById(R.id.loading_tv2); loading_tv2.setText(IMEINumber); } }

Надеюсь, это поможет вам или кому-то.

15
ответ дан Adepoju-Conde Adesegun Chris. 15 August 2018 в 14:10
поделиться

От: http://mytechead.wordpress.com/2011/08/28/how-to-get-imei-number-of-android-device/:

Следующий код помогает в получение номера IMEI устройств Android:

TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); String device_id = tm.getDeviceId();

Разрешения, требуемые в Android Manifest:

android.permission.READ_PHONE_STATE

ПРИМЕЧАНИЕ. В случае планшетов или устройств, которые не могут действовать как мобильный телефон IMEI будет null.

31
ответ дан Dani 15 August 2018 в 14:10
поделиться
  • 1
    +1 для заметки планшета – kgiannakakis 8 November 2013 в 23:15
  • 2
    это фактический код, который я нахожу для получения IMEI – Anand Savjani 10 September 2015 в 12:29
  • 3
    К сожалению, с продвижением Marshmallow вам теперь придется запрашивать это разрешение во время выполнения. Это разрешение не является идеальным, поскольку оно нарушает работу пользователя и может вызвать подозрение у некоторых пользователей. – Igor Ganapolsky 9 September 2016 в 21:42

Или вы можете использовать параметр ANDROID_ID из Android.Provider.Settings.System (как описано здесь strazerre.com).

Это имеет то преимущество, что оно не требует специальных разрешений, но может измениться, если

Для ссылки здесь приведен код из блога:

import android.provider.Settings; import android.provider.Settings.System; String androidID = System.getString(this.getContentResolver(),Secure.ANDROID_ID);

Замечание по реализации: if идентификатор имеет решающее значение для архитектуры системы, вам нужно знать, что на практике некоторые из самых низких телефонов Android и amp; были найдены таблички с повторным использованием того же ANDROID_ID (9774d56d682e549c - это значение, отображаемое в наших журналах)

32
ответ дан Deivison Sporteman 15 August 2018 в 14:10
поделиться
  • 1
    Эта константа устарела. Вместо этого вам нужно использовать android.provider.Settings.Secure.ANDROID_ID; – mcorley 18 May 2011 в 22:33
  • 2
    @mcorley, когда я использую android.provider.Settings.Secure.ANDROID_ID для планшета nexus 7 и nexus 4, он возвращает то же значение 'android_id' – vuhung3990 15 September 2014 в 09:07
  • 3
    @meowmeo сделал то же самое для меня, пока не использовал код, который теперь является частью ответа (ish). String androidID = android.provider.Settings.System.getString(this.getContentResolver(), Secure.ANDROID_ID); – Matthias 28 April 2016 в 18:48
  • 4
    Но не будет ли это сбрасываться на новый ANDROID_ID после сброса настроек? Что делать, если мне нужен постоянный ANDROID_ID, который может пережить сбрасывание. – Igor Ganapolsky 9 September 2016 в 21:40

Новое обновление:

Для Android версии 6 и выше, MAC-адрес WLAN устарел, следуйте за ответом Тревора Джонса

Новое обновление:

Для уникальной идентификации устройств вы можете использовать Secure.ANDROID_ID.

Новое обновление:

Новое обновление :

IMEI зависит от слота Simcard устройства, поэтому невозможно получить IMEI для устройств, которые не используют Simcard. В Dual sim устройствах мы получаем 2 разных IMEI для одного и того же устройства, так как у него есть 2 слота для simcard.

Вы можете использовать строку MAC-адреса WLAN (не рекомендуется для Marshmallow и Marshmallow +, поскольку MAC-адрес WLAN устарел на Marshmallow вперед, поэтому вы получите фиктивное значение)

We может получить уникальный идентификатор для телефонов android, используя MAC-адрес WLAN. MAC-адрес уникален для всех устройств и работает для всех типов устройств.

Вы можете использовать строку MAC-адреса WLAN (не рекомендуется для Marshmallow и Marshmallow +, поскольку MAC-адрес WLAN устарел на

IMEI зависит от слота Simcard устройства, поэтому невозможно получить IMEI для устройств, которые не используйте Simcard. В Dual sim-устройствах мы получаем 2 разных IMEI для одного и того же устройства, так как у него есть 2 слота для simcard. Он остается уникальным, если приложение переустановлено

Недостатки использования MAC-адреса WLAN в качестве идентификатора устройства :

Он остается уникальным, если приложение переустановлено

Оно остается уникальным, если приложение переустановлено

Если устройство не у вас есть wifi-оборудование, тогда вы получите нулевой MAC-адрес, но обычно видно, что большинство устройств Android имеют wifi-аппаратное обеспечение, и на рынке почти нет устройств без оборудования Wi-Fi.

15
ответ дан Jamil 15 August 2018 в 14:10
поделиться
  • 1
    «IMEI зависит от Simcard» ... Это неверно. Вы, кажется, путаете IMEI с номером IMSI – Merlevede 26 July 2016 в 14:46
  • 2
    Международный идентификатор оборудования мобильной станции или IMEI для краткости - это номер, который идентифицирует мобильные телефоны, которые работают в сети GSM. Я лично пробовал это, и это дает мне нуль программно, если на GSM-телефоне нет беспроводной несущей. [D0] smartmobilephonesolutions.com/content/&hellip – Jamil 27 July 2016 в 06:50
  • 3
    Вы правы, я не читал внимательно. IMEI связан с приемопередатчиком SIM-карты, а не с SIM-картой. Виноват! – Merlevede 27 July 2016 в 21:57
  • 4
    MAC-адрес WLAN устарел от Marshmallow вперед. Таким образом, вы получите фиктивное значение! – Igor Ganapolsky 9 September 2016 в 21:45
  • 5
    android 6 не возвращает правильный MAC-адрес WIFI с вашим кодом. Обратите внимание. – zszen 27 June 2017 в 15:19

Как и в API 26, getDeviceId () обесценивается, поэтому вы можете использовать следующий код для поддержки API 26 и более ранних версий

TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); String imei=""; if (android.os.Build.VERSION.SDK_INT >= 26) { imei=telephonyManager.getImei(); } else { imei=telephonyManager.getDeviceId(); }

Не забудьте добавить запрос на разрешение для «READ_PHONE_STATE», чтобы использовать выше код.

9
ответ дан Muhammad Hamza Shahid 15 August 2018 в 14:10
поделиться

Я использую следующий код, чтобы получить IMEI или использовать Secure.ANDROID_ID в качестве альтернативы, когда устройство не имеет возможности телефона:

/** * Returns the unique identifier for the device * * @return unique identifier for the device */ public String getDeviceIMEI() { String deviceUniqueIdentifier = null; TelephonyManager tm = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE); if (null != tm) { deviceUniqueIdentifier = tm.getDeviceId(); } if (null == deviceUniqueIdentifier || 0 == deviceUniqueIdentifier.length()) { deviceUniqueIdentifier = Settings.Secure.getString(this.getContentResolver(), Settings.Secure.ANDROID_ID); } return deviceUniqueIdentifier; }
47
ответ дан shridutt kothari 15 August 2018 в 14:10
поделиться
  • 1
    TextUtils.isEmpty () - & gt; if (идентификатор == null || идентификатор .length () == 0) – Mikhaili 11 June 2013 в 15:27
  • 2
    Привет, Пинхасси. Был ли у вас случай, когда идентификатор устройства, возвращенный диспетчером телефонии, был пустым или пустым, но значение, считанное с Secure.ANDROID_ID, было непустым? спасибо – Budda 20 June 2013 в 23:36
  • 3
    Насколько я помню, это было для планшетов без SIM-карты (но я не уверен на 100%). – Asaf Pinhassi 21 June 2013 в 22:50
  • 4
    Secure.ANDROID_ID изменяется, если устройство отформатировано или rom установлен на заводе – shridutt kothari 14 April 2014 в 12:26
  • 5
    Мой Nexus7 (1stGen) возвращает null для устройства телефонии. И каждый знает, как получить IMEI с планшета? – Sakiboy 4 February 2016 в 22:35

В дополнение к ответу Тревора Джонса вы можете использовать его следующим образом:

TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); telephonyManager.getDeviceId();

И вы должны добавить в свой файл Manifest.xml следующее разрешение:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

В эмуляторе вы, вероятно, получите значение «00000 ...». getDeviceId () возвращает NULL, если идентификатор устройства недоступен.

263
ответ дан Taner 15 August 2018 в 14:10
поделиться
  • 1
    Есть ли способ заставить эмулятор вернуть номер IMEI? – MikeSchem 13 March 2017 в 22:03

Метод getDeviceId () TelephonyManager возвращает уникальный идентификатор устройства, например IMEI для GSM и MEID или ESN для телефонов CDMA. Возвращает null, если идентификатор устройства недоступен.

Код Java

package com.AndroidTelephonyManager; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.telephony.TelephonyManager; import android.widget.TextView; public class AndroidTelephonyManager extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView textDeviceID = (TextView)findViewById(R.id.deviceid); //retrieve a reference to an instance of TelephonyManager TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); textDeviceID.setText(getDeviceID(telephonyManager)); } String getDeviceID(TelephonyManager phonyManager){ String id = phonyManager.getDeviceId(); if (id == null){ id = "not available"; } int phoneType = phonyManager.getPhoneType(); switch(phoneType){ case TelephonyManager.PHONE_TYPE_NONE: return "NONE: " + id; case TelephonyManager.PHONE_TYPE_GSM: return "GSM: IMEI=" + id; case TelephonyManager.PHONE_TYPE_CDMA: return "CDMA: MEID/ESN=" + id; /* * for API Level 11 or above * case TelephonyManager.PHONE_TYPE_SIP: * return "SIP"; */ default: return "UNKNOWN: ID=" + id; } } }

Код Java

<linearlayout android:layout_height="fill_parent" android:layout_width="fill_parent" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android"> <textview android:layout_height="wrap_content" android:layout_width="fill_parent" android:text="@string/hello"> <textview android:id="@+id/deviceid" android:layout_height="wrap_content" android:layout_width="fill_parent"> </textview></textview></linearlayout>

Требуется разрешение READ_PHONE_STATE в файле манифеста.

9
ответ дан user 15 August 2018 в 14:10
поделиться
  • 1
    Спасибо за полный код. Это, безусловно, более полезно. – user 24 June 2013 в 17:50

для уровня API 11 или выше:

case TelephonyManager.PHONE_TYPE_SIP: return "SIP"; TelephonyManager tm= (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); textDeviceID.setText(getDeviceID(tm));
2
ответ дан V.Y. 15 August 2018 в 14:10
поделиться

Метод getDeviceId () устарел. Там новый метод для этого getImei (int)

. Проверьте здесь

1
ответ дан Waran- 15 August 2018 в 14:10
поделиться

, чтобы получить IMEI (международный идентификатор мобильного оборудования)

public String getIMEI(Activity activity) { TelephonyManager telephonyManager = (TelephonyManager) activity .getSystemService(Context.TELEPHONY_SERVICE); return telephonyManager.getDeviceId(); }

, чтобы получить IMEI

public String getDeviceUniqueID(Activity activity){ String device_unique_id = Secure.getString(activity.getContentResolver(), Secure.ANDROID_ID); return device_unique_id; }
20
ответ дан Zin Win Htet 15 August 2018 в 14:10
поделиться
  • 1
    Отображение альтернативы device_unique_id действительно полезно – JoeGalind 21 June 2016 в 23:40
2
ответ дан V.Y. 5 September 2018 в 13:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: