Comment récupérer un identifiant unique pour identifier les appareils Android?

Certains développeurs peuvent avoir besoin d'un identifiant unique pour identifier les appareils Android. Les cas d'utilisation où les développeurs ont besoin de cet identifiant unique sont multiples. Par exemple, quand vous voulez:

  • identifier un utilisateur Android pour stocker les scores des jeux sur un serveur
  • suivre l'installation des applications
  • générer des DRM pour la protection contre la copie.

Plusieurs solutions existent mais aucune n'est parfaite. Dans ce tutoriel, nous allons examiner cinq solutions et en présenter les inconvénients:

1. Numéro de téléphonie unique (IMEI, MEID, ESN, IMSI)

Si vous ne ciblez que les smartphones, vous pouvez tirer parti du fait que le terminal dispose de services de téléphonie. Ainsi, vous pouvez facilement récupérer un identifiant unique identifiant le périphérique.

Cet identifiant unique peut être IMEI, MEID, ESN ou IMSI. Ils peuvent être définis comme suit:

  • IMEI pour l'identité internationale d'équipement mobile: le numéro unique permettant d'identifier les téléphones mobiles GSM, WCDMA ainsi que certains téléphones satellites
  • MEID for Mobile Equipment IDentifier: numéro unique au monde identifiant un élément physique de l'équipement de station mobile CDMA, le MEID a été créé pour remplacer le numéro de série électronique (ESN).
  • ESN pour numéro de série électronique: le numéro unique permettant d'identifier les téléphones mobiles CDMA
  • IMSI (International Mobile Subscriber Identity): identification unique associée à tous les utilisateurs de téléphones mobiles du réseau GSM et UMTS

Pour récupérer l'ID unique associé à votre appareil, vous pouvez utiliser le code suivant:

importer android.telephony.TelephonyManager;
importer android.content.Context;
// ...
TelephonyManager telephonyManager;
telephonyManager = (TelephonyManager) getSystemService (contexte.
                    TELEPHONY_SERVICE);
/ *
* getDeviceId () 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.
* /
String deviceId = telephonyManager.getDeviceId ();
/ *
* getSubscriberId () renvoie l'identifiant d'abonné unique,
* Par exemple, l'IMSI pour un téléphone GSM.
* /
String subscriberId = telephonyManager.getSubscriberId ();

Cette solution doit demander à votre utilisateur android.permission.READ_PHONE_STATE, ce qui peut être difficile à justifier en suivant le type d'application que vous avez faite.

De plus, cette solution est limitée aux smartphones car les tablettes n’ont pas de service de téléphonie. Un avantage est que la valeur survit aux réinitialisations d'usine sur les périphériques.

2. Adresse MAC

Vous pouvez également essayer d'obtenir une adresse MAC à partir d'un périphérique doté d'un matériel Wi-Fi ou Bluetooth. Cependant, cette solution n'est pas recommandée car tous les appareils ne disposent pas d'une connexion Wi-Fi. Même si l'utilisateur dispose d'une connexion Wi-Fi, celle-ci doit être activée pour récupérer les données. Sinon, l’appel n’indique pas l’adresse MAC.

3. Numéro de série

Les appareils sans services de téléphonie comme les tablettes doivent indiquer un ID d'appareil unique disponible via android.os.Build.SERIAL depuis Android 2.3 Gingerbread. Certains téléphones disposant de services téléphoniques peuvent également définir un numéro de série. Comme tous les appareils Android n’ont pas de numéro de série, cette solution n’est pas fiable.

4. Identifiant Android sécurisé

Sur un premier démarrage de périphérique, une valeur aléatoire est générée et stockée. Cette valeur est disponible via Settings.Secure.ANDROID_ID. C’est un nombre 64 bits qui devrait rester constant pendant toute la durée de vie d’un périphérique. ANDROID_ID semble être un bon choix pour un identifiant unique, car il est disponible pour les smartphones et les tablettes. Pour récupérer la valeur, vous pouvez utiliser le code suivant:

String androidId = Settings.Secure.getString (getContentResolver (),
                     Settings.Secure.ANDROID_ID);

Cependant, la valeur peut changer si une réinitialisation d'usine est effectuée sur le périphérique. Il existe également un bug connu avec un combiné populaire d'un fabricant où chaque instance a le même ANDROID_ID. Clairement, la solution n’est pas fiable à 100%.

5. Utiliser UUID

Comme la plupart des applications doivent impérativement identifier une installation particulière et non un périphérique physique, une bonne solution consiste à obtenir un identifiant unique pour un utilisateur qui doit utiliser la classe UUID. La solution suivante a été présentée par Reto Meier de Google dans une présentation Google I / O:

private static String uniqueID = null;
private static final String PREF_UNIQUE_ID = "PREF_UNIQUE_ID";
chaîne publique statique synchronisée id (contexte de contexte) {
   if (uniqueID == null) {
      SharedPreferences sharedPrefs = context.getSharedPreferences (
         PREF_UNIQUE_ID, Context.MODE_PRIVATE);
      uniqueID = sharedPrefs.getString (PREF_UNIQUE_ID, null);
      if (uniqueID == null) {
         uniqueID = UUID.randomUUID (). toString ();
         Éditeur editor = sharedPrefs.edit ();
         editor.putString (PREF_UNIQUE_ID, uniqueID);
         editor.commit ();
      }
   }
    renvoyer uniqueID;
}

La méthode UUID.randomUUID () génère un identifiant unique pour une installation spécifique. Il vous suffit de stocker cette valeur et votre utilisateur sera identifié lors du prochain lancement de votre application. Vous pouvez également essayer d'associer cette solution au service de sauvegarde Android pour que les informations restent disponibles pour l'utilisateur même s'il installe votre application sur un autre appareil.

Conclusion

Identifier un appareil particulier sur Android n'est pas une chose facile. Il y a beaucoup de bonnes raisons d'éviter cela. La meilleure solution consiste probablement à identifier une installation particulière à l'aide de la solution UUID. Toutefois, si vous souhaitez absolument identifier physiquement un périphérique particulier, vous pouvez essayer d'utiliser la solution ANDROID_ID. Pas fiable à 100% mais meilleur que d'autres solutions.