Comment puis-je obtenir l'UUID de mon téléphone Android dans une application?

je cherche de l'aide pour obtenir L'UUID de mon téléphone Android. J'ai cherché sur le net et trouvé une solution potentielle, mais il ne travaille pas dans l'émulateur.

Voici le code:

Class<?> c;
try {
    c = Class.forName("android.os.SystemProperties");
    Method get = c.getMethod("get", String.class);
    serial = (String) get.invoke(c, "ro.serialno");
    Log.d("ANDROID UUID",serial);
} catch (Exception e) {
    e.printStackTrace();
}

est-ce que quelqu'un sait pourquoi ça ne fonctionne pas, ou a une meilleure solution?

43
demandé sur Cody Gray 2011-02-23 11:21:36

7 réponses

Cela fonctionne pour moi:

TelephonyManager tManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
String uuid = tManager.getDeviceId();

EDIT:

Vous avez également besoin d' android.permission.READ_PHONE_STATE dans votre manifeste. Depuis Android M, vous devez demander cette permission à l'exécution.

https://stackoverflow.com/a/38782876/1339179

61
répondu pedr0 2017-05-23 12:34:19

comme le mentionne Dave Webb, le Développeur Android Blog a un article cela couvre ceci. Leur solution préférée est de pister les installations app plutôt que les appareils, et cela fonctionnera bien pour la plupart des cas d'utilisation. Le blog sera de vous montrer le code nécessaire pour faire ce travail, et je vous recommande de vérifier it out.

cependant, le blog continue à discuter des solutions si vous avez besoin d'un identifiant de périphérique plutôt que d'un identifiant d'installation d'application. J'ai parlé avec quelqu'un à Google pour obtenir des précisions supplémentaires sur quelques éléments dans le cas où vous devez le faire. Voici ce que j'ai découvert au sujet des identificateurs de périphérique qui n'est pas mentionné dans le billet de blog susmentionné:

  • ANDROID_ID est l'Identificateur de périphérique préféré. ANDROID_ID est parfaitement fiable sur les versions D'Android <=2.1 ou >=2.3. Seulement 2,2 a les problèmes mentionnés dans le post.
  • plusieurs périphériques de plusieurs fabricants sont affectés par le bug ANDROID_ID dans 2.2.
  • d'après ce que j'ai pu déterminer, tous les appareils affectés ont the same ANDROID_ID 9774d56d682e549c. Qui est aussi le même ID de périphérique rapporté par l'émulateur, btw.
  • Google estime que les OEM ont corrigé le problème pour beaucoup ou la plupart de leurs appareils, mais j'ai été en mesure de vérifier qu'au début du mois d'avril 2011, au moins, il est encore assez facile de trouver des appareils qui ont la ANDROID_ID.
  • quand un périphérique a plusieurs utilisateurs (disponible sur certains appareils fonctionnant sous Android 4.2 ou supérieur), chaque utilisateur apparaît comme un périphérique complètement séparé, de sorte que la valeur ANDROID_ID est unique pour chaque utilisateur.

basé sur les recommandations de Google, j'ai implémenté une classe qui va générer un UUID unique pour chaque périphérique, en utilisant ANDROID_ID comme la graine le cas échéant, en retombant sur TelephonyManager.getDeviceId () si nécessaire, et si cela échoue, le recours à un UUID unique généré au hasard qui est persisté à travers les redémarrages d'applications (mais pas les ré-installations d'applications).

notez que pour les périphériques qui doivent retomber sur l'ID de périphérique, l'ID unique conserver sur l'usine réinitialise. C'est quelque chose d'être conscient de. Si vous avez besoin de vous assurer qu'une réinitialisation d'usine va réinitialiser votre ID unique, vous pouvez envisager de retomber directement sur l'UUID aléatoire au lieu de l'ID de périphérique.

Encore une fois, ce code est pour un ID de périphérique, pas un ID d'installation d'application. Pour la plupart des situations, un ID d'installation d'application est probablement ce que vous recherchez. Mais si vous avez besoin d'un ID de périphérique, alors le code suivant fonctionnera probablement pour vous.

import android.content.Context;
import android.content.SharedPreferences;
import android.provider.Settings.Secure;
import android.telephony.TelephonyManager;

import java.io.UnsupportedEncodingException;
import java.util.UUID;

public class DeviceUuidFactory {
    protected static final String PREFS_FILE = "device_id.xml";
    protected static final String PREFS_DEVICE_ID = "device_id";

    protected static UUID uuid;



    public DeviceUuidFactory(Context context) {

        if( uuid ==null ) {
            synchronized (DeviceUuidFactory.class) {
                if( uuid == null) {
                    final SharedPreferences prefs = context.getSharedPreferences( PREFS_FILE, 0);
                    final String id = prefs.getString(PREFS_DEVICE_ID, null );

                    if (id != null) {
                        // Use the ids previously computed and stored in the prefs file
                        uuid = UUID.fromString(id);

                    } else {

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

                        // Use the Android ID unless it's broken, in which case fallback on deviceId,
                        // unless it's not available, then fallback on a random number which we store
                        // to a prefs file
                        try {
                            if (!"9774d56d682e549c".equals(androidId)) {
                                uuid = UUID.nameUUIDFromBytes(androidId.getBytes("utf8"));
                            } else {
                                final String deviceId = ((TelephonyManager) context.getSystemService( Context.TELEPHONY_SERVICE )).getDeviceId();
                                uuid = deviceId!=null ? UUID.nameUUIDFromBytes(deviceId.getBytes("utf8")) : UUID.randomUUID();
                            }
                        } catch (UnsupportedEncodingException e) {
                            throw new RuntimeException(e);
                        }

                        // Write the value out to the prefs file
                        prefs.edit().putString(PREFS_DEVICE_ID, uuid.toString() ).commit();

                    }

                }
            }
        }

    }


    /**
     * Returns a unique UUID for the current android device.  As with all UUIDs, this unique ID is "very highly likely"
     * to be unique across all Android devices.  Much more so than ANDROID_ID is.
     *
     * The UUID is generated by using ANDROID_ID as the base key if appropriate, falling back on
     * TelephonyManager.getDeviceID() if ANDROID_ID is known to be incorrect, and finally falling back
     * on a random UUID that's persisted to SharedPreferences if getDeviceID() does not return a
     * usable value.
     *
     * In some rare circumstances, this ID may change.  In particular, if the device is factory reset a new device ID
     * may be generated.  In addition, if a user upgrades their phone from certain buggy implementations of Android 2.2
     * to a newer, non-buggy version of Android, the device ID may change.  Or, if a user uninstalls your app on
     * a device that has neither a proper Android ID nor a Device ID, this ID may change on reinstallation.
     *
     * Note that if the code falls back on using TelephonyManager.getDeviceId(), the resulting ID will NOT
     * change after a factory reset.  Something to be aware of.
     *
     * Works around a bug in Android 2.2 for many devices when using ANDROID_ID directly.
     *
     * @see http://code.google.com/p/android/issues/detail?id=10603
     *
     * @return a UUID that may be used to uniquely identify your device for most purposes.
     */
    public UUID getDeviceUuid() {
        return uuid;
    }
}
91
répondu emmby 2014-05-14 07:43:14
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
8
répondu Anil Bhatiya 2013-01-25 06:05:43

au lieu d'obtenir IMEI de TelephonyManager utilisez ANDROID_ID.

Settings.Secure.ANDROID_ID

cela fonctionne pour chaque appareil android indépendamment d'avoir la téléphonie.

4
répondu porwalankit 2015-12-23 07:25:27
1
répondu Gopi cg 2016-06-02 16:54:53

Ajouter

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

Méthode

String getUUID(){
    TelephonyManager teleManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
    String tmSerial = teleManager.getSimSerialNumber();
    String tmDeviceId = teleManager.getDeviceId();
    String androidId = android.provider.Settings.Secure.getString(getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);
    if (tmSerial  == null) tmSerial   = "1";
    if (tmDeviceId== null) tmDeviceId = "1";
    if (androidId == null) androidId  = "1";
    UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDeviceId.hashCode() << 32) | tmSerial.hashCode());
    String uniqueId = deviceUuid.toString();
    return uniqueId;
}
1
répondu KongJing 2016-10-21 16:07:22

à partir de L'API 26, getDeviceId() est déprécié. Si vous avez besoin pour obtenir le numéro IMEI de l'appareil, utilisez le code suivant:

 String deviceId = "";
    if (Build.VERSION.SDK_INT >= 26) {
        deviceId = getSystemService(TelephonyManager.class).getImei();
    }else{
        deviceId = getSystemService(TelephonyManager.class).getDeviceId();
    }
0
répondu DummyData 2017-09-07 16:19:33