102 votes

Est-ce que Secure.ANDROID_ID est unique pour chaque appareil ?

Je suis en train d'utiliser cet appel :

Secure.getString(getApplicationContext().getContentResolver(), Secure.ANDROID_ID);

Pour obtenir un UID pour le périphérique. Je pense cependant obtenir le même ID à partir de plusieurs périphériques. Est-ce possible ?

L'ID en question est : 9774d56d682e549c et apparemment il y a un problème avec plusieurs appareils renvoyant cet ID http://code.google.com/p/android/issues/list?cursor=10603&updated=10603&ts=1295993403

60voto

ninjasense Points 5934

Vérifiez ce fil de discussion. Cependant, vous devez être prudent car il est documenté comme pouvant changer lors d'une réinitialisation d'usine. Utilisez à vos propres risques, et il peut être facilement modifié sur un téléphone rooté. Il semble également que certains fabricants ont eu des problèmes avec leurs téléphones ayant des numéros en double fil de discussion. Selon ce que vous essayez de faire, je ne recommanderais probablement pas d'utiliser cela comme un UID.

50voto

userM1433372 Points 1209

Avec Android O, le comportement de l'ANDROID_ID va changer. L'ANDROID_ID sera différent pour chaque application et chaque utilisateur sur le téléphone.

Extrait de : https://android-developers.googleblog.com/2017/04/changes-to-device-identifiers-in.html

ID Android

Dans O, l'ID Android (Settings.Secure.ANDROID_ID or SSAID) a une valeur différente pour chaque application et chaque utilisateur sur l'appareil. Les développeurs nécessitant un identifiant associé à l'appareil devraient plutôt utiliser un identifiant réinitialisable, tel que l'identifiant publicitaire, donnant ainsi plus de contrôle aux utilisateurs. L'identifiant publicitaire fournit également un paramètre visible par l'utilisateur pour limiter le suivi des annonces.

De plus, dans Android O :

  • La valeur de l'ANDROID_ID ne changera pas lors de la désinstallation/réinstallation de l'application, tant que le nom du package et la clé de signature restent les mêmes. Les applications peuvent se fier à cette valeur pour conserver l'état lors de réinstallations.
  • Si une application était installée sur un appareil exécutant une version antérieure d'Android, l'ID Android reste le même lorsque l'appareil est mis à jour vers Android O, sauf si l'application est désinstallée et réinstallée.
  • La valeur de l'ID Android ne change que si l'appareil est réinitialisé aux paramètres d'usine ou si la clé de signature est modifiée entre les événements de désinstallation et de réinstallation.
  • Ce changement est uniquement requis pour les fabricants d'appareils expédiant avec les services Google Play et l'identifiant publicitaire. D'autres fabricants d'appareils peuvent fournir un identifiant réinitialisable alternatif ou continuer à fournir l'ANDROID ID.

24voto

Radhey Points 1335

Il existe plusieurs solutions mais aucune n'est parfaite. Allons-y une par une.

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

  • Cette solution nécessite de demander la permission android.permission.READ_PHONE_STATE à votre utilisateur, ce qui peut être difficile à justifier en fonction du type d'application que vous avez créée.

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

2. Adresse MAC

  • Vous pouvez également essayer d'obtenir une adresse MAC à partir d'un appareil ayant 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 a une connexion Wi-Fi, elle doit être activée pour récupérer les données. Autrement, l'appel ne rapporte pas l'adresse MAC.

3. Numéro de série

  • Les appareils sans services de téléphonie comme les tablettes doivent rapporter un identifiant d'appareil unique disponible via android.os.Build.SERIAL depuis Android 2.3 Gingerbread. Certains téléphones ayant des services de téléphonie 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é

  • Lors du premier démarrage de l'appareil, 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 sur 64 bits qui devrait rester constant pendant la durée de vie d'un appareil. ANDROID_ID semble être un bon choix pour un identifiant d'appareil unique car il est disponible pour les smartphones et les tablettes.

    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 l'appareil. Il existe également un bug connu avec un téléphone 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 l'exigence pour la plupart des applications est d'identifier une installation particulière et non un appareil physique, une bonne solution pour obtenir un identifiant unique pour un utilisateur est d'utiliser la classe UUID. La solution suivante a été présentée par Reto Meier de Google lors d'une présentation Google I/O :

    private static String uniqueID = null;
    private static final String PREF_UNIQUE_ID = "PREF_UNIQUE_ID";
    public synchronized static String id(Context context) {
       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();
               Editor editor = sharedPrefs.edit();
               editor.putString(PREF_UNIQUE_ID, uniqueID);
               editor.commit();
           }
       }    return uniqueID;
    }

Identifier un appareil particulier sur Android n'est pas une chose facile. Il y a de nombreuses bonnes raisons d'éviter cela. La meilleure solution est probablement d'identifier une installation particulière en utilisant la solution UUID. crédits : blog

16voto

Vincent Vettukal Points 553

Donc, si vous voulez quelque chose d'unique pour le périphérique lui-même, TM.getDeviceId() devrait être suffisant.

Voici le code qui montre comment obtenir l'identifiant du gestionnaire de téléphonie. L'identifiant du périphérique Android que vous utilisez peut changer lors des paramètres d'usine et certains fabricants rencontrent des problèmes pour fournir un identifiant unique.

TelephonyManager tm = 
        (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
String androidId = Secure.getString(this.getContentResolver(), Secure.ANDROID_ID);
Log.d("ID", "ID Android : " + androidId);
Log.d("ID", "ID du périphérique : " + tm.getDeviceId());

Assurez-vous de prendre les permissions pour TelephonyManager en utilisant

6voto

Squonk Points 28943

J'ai lu quelques choses à ce sujet et malheureusement l'ANDROID_ID ne doit pas être utilisé pour identifier de manière unique un appareil individuel.

Il ne semble pas être obligatoire dans les exigences de conformité Android et donc les fabricants semblent l'implémenter de la manière qu'ils choisissent, certains l'utilisant plutôt comme un identifiant de modèle, par exemple.

De plus, sachez que même si un fabricant a écrit un générateur pour en faire un UUID (par exemple), cela n'est pas garanti de survivre à une réinitialisation aux paramètres d'usine.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X