IMEI
L'IMEI est le 'MAC' du module de téléphonie - l'identifiant unique que le téléphone utilise lorsqu'il se connecte via GSM/GPRS/HSPDA/etc. Le réseau GSM l'utilise pour router les appels et les données du téléphone sur le réseau GSM jusqu'à la passerelle vers Internet (qui est un réseau IP).
Un module de téléphonie est une puce ou une carte de circuit qui gère le réseau téléphonique, soit GSM ou CMDA, et a souvent un emplacement pour une carte SIM amovible. Certains téléphones ont plus d'un module de téléphonie (téléphones actifs double-SIM ou multi-SIM). Chaque module de téléphonie a son propre IMEI.
Les fabricants attribuent à chaque téléphone (strictement au module de téléphonie) un IMEI unique lors de la fabrication. Cependant, le numéro peut normalement être réécrit si vous avez le bon logiciel. Cela est souvent fait après qu'un téléphone a été volé pour donner au téléphone une nouvelle identité et contourner le système de blocage des téléphones volés.
L'IMEI peut être obtenu de manière programmable en utilisant l'API [TelephonyManager.getDeviceId()](http://developer.android.com/reference/android/telephony/TelephonyManager.html#getDeviceId()).
Les téléphones CDMA ont un ESN ou MEID qui sont de longueurs et formats différents, même s'il est récupéré en utilisant la même API.
Les appareils Android sans modules de téléphonie - par exemple de nombreuses tablettes et appareils TV - n'ont pas d'IMEI. Comme l'a commenté Schlangi, certains appareils qui n'ont pas de module de téléphonie imitent l'IMEI, donc la présence d'un IMEI ne garantit pas (toujours) que l'appareil a un module de téléphonie.
ANDROID_ID
L'ANDROID_ID est un autre numéro unique sur le téléphone - il est automatiquement généré par le système d'exploitation lors de son démarrage pour la première fois (faire de cette manière simplifie beaucoup la tâche des fabricants en supprimant une étape de la chaîne de production).
L'ANDROID_ID peut (et le fait) changer, par exemple :
Il est principalement utilisé par les développeurs (par ex pour identifier et se connecter à des appareils en utilisant adb
)
ANDROID_ID peut être utilisé pour identifier un appareil Android compte tenu des avertissements ci-dessus, ce qui signifie de façon réaliste qu'il identifie de manière unique l'appareil sur de grandes périodes de sa durée de vie, mais il ne peut pas être fiable à 100%.
Remarquez également qu'il y avait un bug dans Froyo où de nombreux appareils se donnaient le même ANDROID_ID. Voici le bug
Autres identifiants
Il existe un certain nombre d'autres choses qui peuvent être utilisées pour identifier l'appareil :
- Adresse MAC du module WiFi : [WifiManager.getConnectionInfo()](http://developer.android.com/reference/android/net/wifi/WifiManager.html#getConnectionInfo()) -> [WifiInfo.getMacAddress()](http://developer.android.com/reference/android/net/wifi/WifiInfo.html#getMacAddress()). Cela peut souvent être modifié en logiciel, mais généralement reste constant sur la durée de vie de l'appareil. De plus, cela ne peut être lu que si le module WiFi est activé.
- Adresse MAC du module Bluetooth : [BluetoothAdaptor.getAddress()](http://developer.android.com/reference/android/bluetooth/BluetoothAdapter.html#getAddress()). Comme avec l'adresse MAC du WiFi, cela peut souvent être modifié en logiciel et peut être désactivé lorsque vous en avez besoin
- Le numéro de téléphone de l'abonné. Celui-ci peut changer si l'utilisateur demande un nouveau numéro à l'opérateur de téléphonie, ou s'il change de SIM. Il est obtenu avec [TelephonyManager.getLine1Number()](http://developer.android.com/reference/android/telephony/TelephonyManager.html#getLine1Number()). Ceci n'est présent que pour les appareils téléphoniques Android avec une SIM installée actuelle et un service payant avec un opérateur de téléphonie.
- La SIM contient son propre numéro d'identification (IMSI). Celui-ci est obtenu avec l'API [TelephonyManager.getSubscriberId()](https://developer.android.com/reference/android/telephony/TelephonyManager.html#getSubscriberId()). Évidemment, la SIM peut ne pas être présente à un moment spécifique, et elle change lorsque la SIM est modifiée - et les utilisateurs peuvent mettre à niveau/remplacer leur SIM tout en conservant le même numéro, donc on ne peut pas dire que cela corresponde de manière univoque à un téléphone ou à un utilisateur spécifique.
- Lié à l'IMSI, il y a le MSISDN. Celui-ci fonctionne comme l'identification d'une abonnement (votre contrat pour un numéro de téléphone spécifique avec votre fournisseur de services mobiles) et donne donc à l'appareil son numéro de téléphone. Le MSISDN peut être associé à plusieurs cartes SIM, et donc plusieurs téléphones. Il est fourni avec tous les avertissements pour la lecture de la SIM ci-dessus. Cela peut être récupéré avec [TelephonyManager.getSimSerialNumber()](http://developer.android.com/reference/android/telephony/TelephonyManager.html#getSimSerialNumber()). Merci à Schlangi pour les corrections et additions
- À partir de Gingerbread, il y a android.os.Build.SERIAL que de nombreux fabricants définissent (mais pas tous. Zut).
Autres notes
Vous avez besoin de permissions spécifiques pour accéder à chaque API, donc si vous essayez d'accéder à toutes, les permissions de votre application dans le Google Play Store semblent assez permissives.
Je pense que ce lien explique toutes les autres options disponibles également https://android-developers.googleblog.com/2011/03/identifying-app-installations.html