Как получить IMEI/ESN устройства программно в android?


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

14 282

14 ответов:

нужно позвонить android.telephony.TelephonyManager.getDeviceId().

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

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

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

для того, чтобы сделать это.

Это, как говорится, будьте осторожны об этом. Мало того, что пользователи будут удивляться, почему ваше приложение обращается к их стеку телефонии, может быть трудно перенести данные, если пользователь получает новое устройство.

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

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

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

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

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

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

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

Я использую следующий код, чтобы получить 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;
}

или вы можете использовать параметр ANDROID_ID с Android.Поставщик.Настройки.Система (как описано здесь strazerre.com).

это имеет то преимущество, что он не требует специальных разрешений, но может измениться, если другое приложение имеет доступ на запись и изменяет его (что, по-видимому, необычно, но не невозможно).

просто для справки, вот код от блог:

import android.provider.Settings;
import android.provider.Settings.System;   

String androidID = System.getString(this.getContentResolver(),Secure.ANDROID_ID);

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

от: 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:

android.permission.READ_PHONE_STATE

примечание: в случае планшетов или устройств, которые не могут выступать в качестве мобильного телефона IMEI будет null.

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

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

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

Обновление:

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

обновление:

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

Ответ:

недостатки использования IMEI в качестве уникального устройства Код:

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

вы можете использовать строку MAC-адреса WLAN (не рекомендуется для Marshmallow и Marshmallow+, поскольку MAC-адрес WLAN был устаревшим на Marshmallow forward. Так что вы получите фиктивный значение)

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

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

  • Это уникальный идентификатор для всех типов устройств (смартфонов и таблетки.)

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

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

  • дать вам фиктивное значение от зефира и выше.

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

источник:technetexperts.com

метод 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;
 }

}
}

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

Как и в 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" для использования выше кода.

Вы можете использовать этот TelephonyManager TELEPHONY_SERVICE

использовать ниже код дает вам номер IMEI:

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

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

регистрация здесь

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

case TelephonyManager.PHONE_TYPE_SIP: 
return "SIP";

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