Comment obtenir l’IMEI / ESN de l’appareil par programme dans Android?

Pour identifier chaque périphérique de manière unique, je souhaiterais utiliser l’IMEI (ou le numéro ESN pour les périphériques CDMA). Comment y accéder par programmation?

    Vous voulez appeler android.telephony.TelephonyManager.getDeviceId() .

    Cela retournera la chaîne identifiant de manière unique le périphérique (IMEI sur GSM, MEID pour CDMA).

    Vous aurez besoin de l’autorisation suivante dans votre AndroidManifest.xml :

    pour ce faire.

    Cela dit, faites attention à cela. Non seulement les utilisateurs se demanderont-ils pourquoi votre application accède à leur stack téléphonique, mais il peut être difficile de migrer les données si l’utilisateur obtient un nouveau périphérique.

    Mise à jour: comme mentionné dans les commentaires ci-dessous, ce n’est pas un moyen sécurisé d’authentifier les utilisateurs et soulève des problèmes de confidentialité. Ce n’est pas recommandé. Au lieu de cela, regardez l’ API de connexion Google+ si vous souhaitez implémenter un système de connexion sans friction.

    L’ API de sauvegarde Android est également disponible si vous souhaitez simplement conserver un ensemble de chaînes lorsque l’utilisateur réinitialise son téléphone (ou achète un nouveau périphérique).

    En plus de la réponse de Trevor Johns, vous pouvez utiliser ceci comme suit:

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

    Et vous devez append la permission suivante dans votre fichier Manifest.xml:

      

    Dans l’émulateur, vous obtiendrez probablement une valeur similaire à “00000 …”. getDeviceId () renvoie NULL si l’ID de périphérique n’est pas disponible.

    J’utilise le code suivant pour obtenir l’IMEI ou utiliser Secure.ANDROID_ID comme alternative lorsque le périphérique ne dispose pas de fonctionnalités téléphoniques:

     /** * Returns the unique identifier for the device * * @return unique identifier for the device */ public Ssortingng getDeviceIMEI() { Ssortingng 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.getSsortingng(this.getContentResolver(), Settings.Secure.ANDROID_ID); } return deviceUniqueIdentifier; } 

    Ou vous pouvez utiliser le paramètre ANDROID_ID d’Android.Provider.Settings.System (comme décrit ici strazerre.com ).

    Cela présente l’avantage de ne pas nécessiter d’permissions spéciales, mais peut changer si une autre application dispose d’un access en écriture et la modifie (ce qui est apparemment inhabituel mais pas impossible).

    Juste pour référence, voici le code du blog:

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

    Remarque sur l’implémentation : si l’ID est critique pour l’architecture du système, vous devez savoir qu’en pratique, certains téléphones et tablettes Android très bas de gamme ont été trouvés en train de réutiliser le même ANDROID_ID (9774d56d682e549c était la valeur affichée dans nos journaux)

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

    Le code suivant aide à obtenir le nombre IMEI de périphériques Android:

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

    Autorisations requirejses dans le manifeste Android:

     android.permission.READ_PHONE_STATE 

    REMARQUE: Dans le cas de tablettes ou d’appareils qui ne peuvent pas agir en tant que téléphone mobile, IMEI sera nul.

    obtenir l’ IMEI (identifiant international d’équipement mobile)

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

    obtenir l’ identifiant unique du périphérique

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

    Pour Android 6.0+, le jeu a changé, alors je vous suggère de l’utiliser.

    La meilleure façon de faire est pendant l’exécution sinon vous obtenez des erreurs de permission.

      /** * 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); //sortinggger 'loadIMEI' loadIMEI(); /** Fading Transition Effect */ overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); } /** * Called when the 'loadIMEI' function is sortingggered. */ 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(getSsortingng(R.ssortingng.permission_read_phone_state_rationale)) .setCancelable(false) .setPositiveButton(android.R.ssortingng.yes, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { //re-request ActivityCompat.requestPermissions(LoadingActivity.this, new Ssortingng[]{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 Ssortingng[]{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 Ssortingng[] 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(getSsortingng(R.ssortingng.permision_available_read_phone_state)); doPermissionGrantedStuffs(); } else { alertAlert(getSsortingng(R.ssortingng.permissions_not_granted_read_phone_state)); } } } private void alertAlert(Ssortingng msg) { new AlertDialog.Builder(LoadingActivity.this) .setTitle("Permission Request") .setMessage(msg) .setCancelable(false) .setPositiveButton(android.R.ssortingng.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 Ssortingng IMEINumber=tm.getDeviceId(); /************************************************ * ********************************************** * This is just an icing on the cake * the following are other children of TELEPHONY_SERVICE * //Get Subscriber ID Ssortingng subscriberID=tm.getDeviceId(); //Get SIM Serial Number Ssortingng SIMSerialNumber=tm.getSimSerialNumber(); //Get Network Country ISO Code Ssortingng networkCountryISO=tm.getNetworkCountryIso(); //Get SIM Country ISO Code Ssortingng SIMCountryISO=tm.getSimCountryIso(); //Get the device software version Ssortingng softwareVersion=tm.getDeviceSoftwareVersion() //Get the Voice mail number Ssortingng 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); } } 

    J’espère que cela vous aide ou aide quelqu’un.

    Nouvelle mise à jour:

    Pour Android version 6 et supérieure, l’adresse MAC WLAN est obsolète, suivez la réponse de Trevor Johns

    Mettre à jour:

    Pour l’identification unique des périphériques, vous pouvez utiliser Secure.ANDROID_ID .

    Ancienne réponse:

    Inconvénients de l’utilisation d’IMEI en tant qu’ID de périphérique unique:

    • IMEI dépend de l’emplacement de carte SIM du périphérique, il n’est donc pas possible d’obtenir l’IMEI pour les périphériques qui n’utilisent pas Simcard. Dans les appareils Dual Sim, nous obtenons 2 IMEI différents pour le même appareil car il dispose de 2 emplacements pour la carte SIM.

    Vous pouvez utiliser la chaîne d’adresse MAC WLAN (non recommandé pour Marshmallow et Marshmallow + car l’adresse MAC WLAN est devenue obsolète sur Marshmallow forward. Vous obtiendrez donc une valeur fausse)

    Nous pouvons également obtenir l’identifiant unique pour les téléphones Android utilisant l’adresse MAC WLAN. L’adresse MAC est unique pour tous les appareils et fonctionne pour tous les types d’appareils.

    Avantages de l’utilisation de l’adresse MAC WLAN en tant qu’ID de périphérique:

    • C’est un identifiant unique pour tous les types d’appareils (smartphones et tablettes).

    • Il rest unique si l’application est réinstallée

    Inconvénients de l’utilisation de l’adresse MAC WLAN en tant qu’ID de périphérique:

    • Donnez-vous une fausse valeur de guimauve et au-dessus.

    • Si l’appareil ne possède pas de matériel wifi, vous obtenez une adresse MAC nulle, mais en général, on constate que la plupart des appareils Android ont un matériel wifi et qu’il y a très peu d’appareils sur le marché sans matériel wifi.

    SOURCE: technetexperts.com

    La méthode getDeviceId () de TelephonyManager renvoie l’ID de périphérique unique, par exemple, l’IMEI pour GSM et le MEID ou ESN pour les téléphones CDMA. Renvoie la valeur null si l’ID de périphérique n’est pas disponible.

    Code 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); //resortingeve a reference to an instance of TelephonyManager TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); textDeviceID.setText(getDeviceID(telephonyManager)); } Ssortingng getDeviceID(TelephonyManager phonyManager){ Ssortingng 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

         

    Autorisation Obligatoire READ_PHONE_STATE dans le fichier manifeste.

    Comme dans l’API 26, getDeviceId () est déprécié, vous pouvez donc utiliser le code suivant pour gérer l’API 26 et les versions antérieures.

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

    N’oubliez pas d’append une demande d’autorisation pour “READ_PHONE_STATE” à utiliser au-dessus du code.

    Vous pouvez utiliser cette fonction TELEPHONY_SERVICE de TelephonyManager pour obtenir un ID de périphérique unique , Permission requirejse: READ_PHONE_STATE

      

    Exemple, l’ IMEI pour GSM et le MEID ou ESN pour les téléphones CDMA .

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

    Renvoie la valeur null si l’ ID de périphérique n’est pas disponible .

    Utiliser le code ci-dessous vous donne le numéro IMEI:

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

    pour API niveau 11 ou supérieur:

     case TelephonyManager.PHONE_TYPE_SIP: return "SIP"; TelephonyManager tm= (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); textDeviceID.setText(getDeviceID(tm)); 

    La méthode getDeviceId () est obsolète. Il existe une nouvelle méthode pour ce getImei (int)

    Vérifier ici