Як програмно отримати IMEI / ESN пристрою в Android?


343

Щоб однозначно ідентифікувати кожен пристрій, я б хотів використовувати IMEI (або номер ESN для пристроїв CDMA). Як отримати доступ до цього програмно?


Щоб отримати IMEI для обох SIM-карт в подвійних SIM-телефонах, використовуйте відбиття Java. Дивіться ось демонстрацію
Vaibhav Jani

5
@PiedPiper: IMEI не залежить від SIM-карти. Ви думаєте про IMSI.
Філіп

@Phillip Спасибі товариш. Я оновив свою відповідь :)
Vaibhav Jani

1
Кожен .. чи є якісь зміни в android 6? ми все ще можемо отримати доступ до IMEI деякими способами?
therepraprashant

1
Потрібно подати запит на дозвіл READ_PHONE_STATE під час виконання, тоді ви все ще можете отримати IMEI
Flo We

Відповіді:


387

Ви хочете зателефонувати android.telephony.TelephonyManager.getDeviceId().

Це поверне будь-який рядок, що однозначно ідентифікує пристрій (IMEI на GSM, MEID для CDMA).

Вам знадобиться такий дозвіл у вашому AndroidManifest.xml:

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

для того, щоб це зробити.

Коли це говориться, будьте обережні в цьому. Користувачі не тільки задаються питанням, чому ваша програма отримує доступ до свого стека телефонії, можливо, буде важко перенести дані, якщо користувач отримає новий пристрій.

Оновлення: Як зазначено в коментарях нижче, це не безпечний спосіб аутентифікації користувачів та викликає занепокоєння щодо конфіденційності. Не рекомендується. Натомість подивіться на API входу в Google+, якщо ви хочете впровадити систему входу без тертя.

Android резервне копіювання API також є , якщо ви просто хочете легкий спосіб наполягати зв'язку рядків для того, коли користувач скидає свій телефон (або купує новий пристрій).


1
Що було б тоді кращим рішенням, яке б дозволило їм мігрувати дані в майбутньому? Електронна адреса Google? Якщо так, як я можу це витягнути із системи?
Том

3
Найнадійніший спосіб зробити це - просто змусити їх створити обліковий запис під час першого запуску програми. Існує спосіб отримати електронну адресу користувача (див. Документи в AccountManager), але для підтвердження того, що зловмисний користувач не підробив цю інформацію, потребує трохи знань про те, як працюють API даних Google - більше, ніж я можу вказати в цьому невелике поле для коментарів. ;)
Тревор Джонс

1
Насправді, з цього приводу, ви не маєте жодної гарантії, що користувач також не підробив свої IMEI / MEID. Якщо безпека викликає будь-які проблеми, вам дійсно потрібно використовувати або ім’я користувача / пароль, або метод getAuthToken () в AccountManager (і знову ж таки, вам потрібно буде підтвердити цей маркер із сервером, який його первинно видав).
Тревор Джонс

2
Аді: Код для отримання ідентифікатора пристрою? Немає нічого, крім одного методу + дозволу, про який я згадував вище. Зважаючи на це, варто заглянути в API для входу в Google+. Це рекомендований підхід для автентифікації користувачів сьогодні: developer.android.com/google/play-services/auth.html
Тревор Джонс,

2
Це ОС Android 6? А ти націлений на SDK 23? Тоді вам потрібно подати запит на READ_PHONE_STATE під час виконання, перш ніж запитувати IMEI
Flo We

284

Окрім відповіді Тревора Джонса, ви можете використати це так:

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

І слід додати наступний дозвіл у файл Manifest.xml:

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

В емуляторі ви, ймовірно, отримаєте як "00000 ..." значення. getDeviceId () повертає NULL, якщо ідентифікатор пристрою недоступний.


1
Чи є спосіб отримати емулятор повернути номер IMEI?
MikeSchem

@MikeSchem, емулятор не має значущого рядка IMEI.
shizhen

Спробуйте не використовувати: <використання-дозволу android: name = "android.permission.READ_PHONE_STATE" /> цей дозвіл дуже чутливий, ви можете відхилити додаток від команди Google Play (нові правила безпеки додано наприкінці 2018 року). Як порада краще використовувати рекламний ідентифікатор.
Дуна

@Taner Чи буде це працювати на пристрої Dual sim? (Потрібно отримати лише перший IMEI)
Арнольд Браун

Чи є питання щодо безпеки використання READ_PHONE_STATEдозволу?
гадюка

62

Я використовую такий код, щоб отримати 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;
}

17
TextUtils.isEmpty () -> якщо (ідентифікатор == NULL || ідентифікатор .length () == 0)
Mikhaili

2
Привіт Пінхассі. У вас був випадок, коли ідентифікатор пристрою, який повернувся менеджером телефонії, був недійсним або порожнім, але значення, прочитане з Secure.ANDROID_ID, було не порожнім? Дякую
Будда

4
Наскільки я пам'ятаю, це було для планшетів без SIM-карти (але я не впевнений на 100%).
Асаф Пінхассі

Secure.ANDROID_ID змінюється, якщо пристрій відформатовано або ром скинуто на заводські налаштування
shridutt kothari

Мій Nexus7 (1stGen) повертається nullдля пристрою телефоніїІд ... Хтось знає, як отримати IMEI з планшета?
Сакібой

38

Або ви можете скористатися налаштуваннями 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);

Примітка щодо впровадження : якщо ідентифікатор критично важливий для архітектури системи, вам потрібно знати, що на практиці деякі Android-телефони та планшети із найнижчим рівнем використання використовували той самий ANDROID_ID (значення, що відображається в наших журналах, було 9774d56d682e549c)


15
Ця константа застаріла. Натомість вам потрібно використовувати android.provider.Settings.Secure.ANDROID_ID;
mcorley

@mcorley, коли я використовую android.provider.Settings.Secure.ANDROID_ID для планшета Nexus 7 і Nexus 4, він повертає те саме значення 'android_id'
vuhung3990

3
@meowmeo зробив те саме для мене, поки я не використав код, який зараз є частиною відповіді (ish). String androidID = android.provider.Settings.System.getString(this.getContentResolver(), Secure.ANDROID_ID);
Маттіас

Але чи не повернеться він до нового ANDROID_ID після скидання на завод? Що робити, якщо мені потрібен стійкий ANDROID_ID, який може пережити скидання.
ІгорГанапольський

35

Від: http://mytechead.wordpress.com/2011/08/28/how-to-get-imei-number-of-android-device/ :

Наступний код допомагає отримати IMEI кількість андроїд-пристроїв:

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

Дозволи, необхідні в Android Manifest:

android.permission.READ_PHONE_STATE

ПРИМІТКА. Якщо планшетні ПК або пристрої, які не можуть діяти як мобільний телефон, IMEI буде недійсним.


1
це фактичний код, який я знаходжу для отримання IMEI
Anand Savjani

2
На жаль, з програмою Marshmallow вперед ви повинні просити цей дозвіл під час виконання. Цей дозвіл не є ідеальним, оскільки заважає користувачу, і може викликати підозру у деяких користувачів.
ІгорГанапольський

Спробуйте не використовувати: <використання-дозволу android: name = "android.permission.READ_PHONE_STATE" /> цей дозвіл дуже чутливий. Ви можете відхилити додаток від команди Google Play (нові правила безпеки додано наприкінці 2018 року). В якості ради краще використовувати рекламний ідентифікатор замість IMEI
Дуна

яке рішення для android 10?
Амін Пінджарі

23

отримати IMEI (міжнародний ідентифікатор мобільного обладнання)

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

щоб отримати унікальний ідентифікатор пристрою

public String getDeviceUniqueID(Activity activity){
    String device_unique_id = Secure.getString(activity.getContentResolver(),
            Secure.ANDROID_ID);
    return device_unique_id;
}

2
Показати альтернативу device_unique_id дуже корисно
JoeGalind

20

Для 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);
}
}

Сподіваюся, що це допоможе тобі чи комусь.


16

Нове оновлення:

Для версії Android 6 і вище, MAC-адреса WLAN застаріла, дотримуйтесь відповіді Тревора Джонса

Оновлення:

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

Стара відповідь:

Недоліки використання IMEI як унікального ідентифікатора пристрою:

  • IMEI залежить від слота Simcard пристрою, тому неможливо отримати IMEI для пристроїв, які не використовують Simcard. У пристроях з двома симами ми отримуємо 2 різних IMEI для одного пристрою, оскільки він має 2 слота для simcard.

Ви можете використовувати рядок MAC-адреси WLAN (не рекомендується для зефіру та зефіру +, оскільки МАС-адреса WLAN застаріла на Marshmallow вперед. Отже, ви отримаєте помилкове значення)

Ми також можемо отримати унікальний ідентифікатор для андроїд-телефонів, використовуючи MAC-адресу WLAN. MAC-адреса унікальна для всіх пристроїв, і вона працює для всіх типів пристроїв.

Переваги використання MAC-адреси WLAN як ідентифікатора пристрою:

  • Це унікальний ідентифікатор для всіх типів пристроїв (смартфонів та планшетів).

  • Він залишається унікальним, якщо програма буде перевстановлена

Недоліки використання MAC-адреси WLAN як ідентифікатора пристрою:

  • Дайте вам велику цінність від зефіру і вище.

  • Якщо на пристрої немає апаратного забезпечення Wi-Fi, ви отримуєте нульову MAC-адресу, але, як правило, видно, що більшість пристроїв Android мають апаратне забезпечення Wi-Fi, і на ринку навряд чи мало пристроїв, де немає апаратного забезпечення Wi-Fi.

ДЖЕРЕЛ : technetexperts.com


7
"IMEI залежить від Simcard" ... Це помилково. Здається, ви плутаєте IMEI з номером IMSI
Merlevede

2
Міжнародний ідентифікатор обладнання мобільної станції або короткий IMEI - це номер, який ідентифікує мобільні телефони, які працюють у мережі GSM. Я особисто спробував це, і це дає мені нульову програму, якщо на телефоні GSM немає бездротового оператора. smartmobilephonesolutions.com/content/…
Джаміль

3
Ти маєш рацію, я не читав уважно. IMEI асоціюється з приймачем SIM-картки, а не з SIM-карткою. Моє ліжко!
Мерлевед

2
MAC-адреса бездротової локальної мережі застаріла на Marshmallow вперед. Так ви отримаєте хибну цінність!
ІгорГанапольський

1
android 6 не повертайте правильну WIFI MAC-адресу зі своїм кодом. Зауважте це.
zszen

15

Як і в 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 на використання вищевказаного коду.

ОНОВЛЕННЯ: З Android 10 його обмежено для програм користувачів, які можуть не встановлювати апаратні ідентифікатори типу IMEI.


Розум, де я можу знайти посилання на метод 'getImei () "?
Сам байт

2
Звичайно, будь ласка, використовуйте developer.android.com/reference/android/telephony/… для посилання getImei ()
Мухаммед Хамза Шахід

яке рішення для android 10?
Амін Пінджарі

1
На жаль, Amin в Android 10 з причини безпеки тепер обмежений для сторонніх додатків, щоб отримати апаратні ідентифікатори, такі як IMEI, для отримання додаткової інформації про зміни конфіденційності на Android 10, відвідайте developer.android.com/about/versions/10/privacy
Muhammad Hamza Shahid

Працює на Android Oreo.
Satish Shetty

10

Метод getDeviceId () з TelephonyManager повертає унікальний ідентифікатор пристрою, наприклад, IMEI для GSM та MEID або ESN для телефонів CDMA. Повернути нуль, якщо ідентифікатор пристрою недоступний.

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;
 }

}
}

XML

<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 у файлі маніфесту.


4

Ви можете використовувати цю функцію TelephonyManager TELEPHONY_SERVICE, щоб отримати унікальний ідентифікатор пристрою , потрібен дозвіл: READ_PHONE_STATE

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

Наприклад, IMEI для GSM та 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();
}

Повернути нуль, якщо ідентифікатор пристрою недоступний .


і чому пристрій Id null? через укорінений пристрій.
Вішал Соджітра

яке рішення для android 10?
Амін Пінджарі


3

Спробуйте це (потрібно отримати перший IMEI завжди)

TelephonyManager mTelephony = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        if (ActivityCompat.checkSelfPermission(LoginActivity.this,Manifest.permission.READ_PHONE_STATE)!= PackageManager.PERMISSION_GRANTED) {

         return;
}

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                if (mTelephony.getPhoneCount() == 2) {
                    IME = mTelephony.getImei(0);
                }else{
                    IME = mTelephony.getImei();
                }
            }else{
                if (mTelephony.getPhoneCount() == 2) {
                    IME = mTelephony.getDeviceId(0);
                } else {
                    IME = mTelephony.getDeviceId();
                }
            }
        } else {
            IME = mTelephony.getDeviceId();
        }


2

Використовуваний нижче код дає номер IMEI:

TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
System.out.println("IMEI::" + telephonyManager.getDeviceId());

1

для API рівня 11 або вище:

case TelephonyManager.PHONE_TYPE_SIP: 
return "SIP";

TelephonyManager tm= (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
textDeviceID.setText(getDeviceID(tm));

1

Код Котліна для отримання DeviceId (IMEI) з дозволом на обробку та перевірку порівнянності для всіх версій Android:

 val  telephonyManager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
        == PackageManager.PERMISSION_GRANTED) {
        // Permission is  granted
        val imei : String? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)  telephonyManager.imei
        // older OS  versions
        else  telephonyManager.deviceId

        imei?.let {
            Log.i("Log", "DeviceId=$it" )
        }

    } else {  // Permission is not granted

    }

Також додайте цей дозвіл на AndroidManifest.xml:

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

1

Вам знадобиться такий дозвіл у AndroidManifest.xml:

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

Щоб отримати IMEI (міжнародний ідентифікатор мобільного обладнання) і якщо він вище рівня 26 API, ми отримаємо telephonyManager.getImei()як нуль, для цього ми використовуємо ANDROID_ID як унікальний ідентифікатор.

 public static String getIMEINumber(@NonNull final Context context)
            throws SecurityException, NullPointerException {
        TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        String imei;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            assert tm != null;
            imei = tm.getImei();
            //this change is for Android 10 as per security concern it will not provide the imei number.
            if (imei == null) {
                imei = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
            }
        } else {
            assert tm != null;
            if (tm.getDeviceId() != null && !tm.getDeviceId().equals("000000000000000")) {
                imei = tm.getDeviceId();
            } else {
                imei = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
            }
        }

        return imei;
    }

0

Для тих, хто шукає версію Котліна, ви можете використовувати щось подібне;

private fun telephonyService() {
    val telephonyManager = getSystemService(TELEPHONY_SERVICE) as TelephonyManager
    val imei = if (android.os.Build.VERSION.SDK_INT >= 26) {
        Timber.i("Phone >= 26 IMEI")
        telephonyManager.imei
    } else {
        Timber.i("Phone IMEI < 26")
        telephonyManager.deviceId
    }

    Timber.i("Phone IMEI $imei")
}

ПРИМІТКА. Ви повинні завершити telephonyService()перевірку дозволу, використовуючи checkSelfPermission або будь-який інший метод, який ви використовуєте.

Також додайте цей дозвіл у файл маніфесту;

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

0

використовувати нижче код:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        String[] permissions = {Manifest.permission.READ_PHONE_STATE};
        if (ActivityCompat.checkSelfPermission(this,
                Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(permissions, READ_PHONE_STATE);
        }
    } else {
        try {
            TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
                return;
            }
            String imei = telephonyManager.getDeviceId();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

І зателефонуйте методуRequestPermissionsResult наступним кодом:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case READ_PHONE_STATE:
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED)
                try {
                    TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
                    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
                        return;
                    }
                    String imei = telephonyManager.getDeviceId();

                } catch (Exception e) {
                    e.printStackTrace();
                }
    }
}

Додайте наступний дозвіл у свій AndroidManifest.xml:

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

0

Для Android 10 Наступний код працює для мене.

val uid: String = Settings.Secure.getString(ctx.applicationContext.contentResolver, Settings.Secure.ANDROID_ID)
if (ContextCompat.checkSelfPermission(ctx, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
            imei = when {
                Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q -> {
                    uid
                }
                Build.VERSION.SDK_INT >= Build.VERSION_CODES.O -> {
                    telephonyManager.imei
                }
                else -> {
                    telephonyManager.deviceId
                }
            }
        }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.