web-dev-qa-db-fra.com

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

Je recherche de l'aide pour obtenir l'UUID de mon téléphone Android. J'ai effectué une recherche sur le réseau et trouvé une solution potentielle, mais cela ne fonctionne 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 cela ne fonctionne pas ou a une meilleure solution?

49
bHaRaTh

Cela fonctionne pour moi:

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

MODIFIER :

Tu as aussi besoin Android.permission.READ_PHONE_STATE défini dans votre manifeste. Depuis Android M, vous devez demander cette autorisation à l'exécution.

Voir cette réponse: https://stackoverflow.com/a/38782876/1339179

63
pedr0

Comme Dave Webb le mentionne, le Android Developer Blog contient un article qui couvre cela. Leur solution préférée consiste à suivre les installations d'applications plutôt que de périphériques, ce qui fonctionnera bien dans la plupart des cas d'utilisation. L'article de blog vous montrera le code nécessaire pour que cela fonctionne, et je vous recommande de le vérifier.

Cependant, l'article de blog continue pour 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é à quelqu'un chez Google pour obtenir des éclaircissements supplémentaires sur quelques éléments au cas où vous en auriez besoin. Voici ce que j'ai découvert sur les identificateurs de périphérique, qui n'est PAS mentionné dans l'article de blog susmentionné:

  • Android_ID est l'identifiant de périphérique préféré. Android_ID est parfaitement fiable sur les versions de Android <= 2.1 ou> = 2.3. Seule la version 2.2 présente les problèmes mentionnés dans le message.
  • Plusieurs périphériques de plusieurs fabricants sont affectés par le bogue Android_ID dans la version 2.2.
  • Autant que je sache, tous les appareils concernés ont le même Android_ID , ce qui est 9774d56d682e549c . Quel est également le même identifiant de périphérique que celui signalé par l'émulateur, btw.
  • Google pense que les OEM ont corrigé le problème pour la plupart ou la plupart de leurs appareils, mais j'ai pu vérifier qu'au début d'avril 2011, au moins, il était encore assez facile de trouver des appareils dotés de l'identifiant Android_ID défectueux.
  • Lorsqu'un appareil a plusieurs utilisateurs (disponible sur certains appareils exécutant Android 4.2 ou supérieur) , chaque utilisateur apparaît sous la forme d'un appareil complètement séparé. La valeur Android_ID est donc unique. chaque utilisateur.

Sur la base des recommandations de Google, j'ai implémenté une classe qui générera un UUID unique pour chaque périphérique, en utilisant Android_ID comme source, le cas échéant, en recourant à TelephonyManager.getDeviceId () si nécessaire, et en cas d'échec, en recourant à un UUID unique généré de manière aléatoire. qui persiste lors des redémarrages d'applications (mais pas pour les réinstallations d'applications).

Notez que pour les périphériques devant se replier sur l'ID de périphérique, l'ID unique [~ # ~] persistera [~ # ~] lors des réinitialisations d'usine. C'est quelque chose à prendre en compte. Si vous devez vous assurer qu'une réinitialisation d'usine réinitialisera votre ID unique, vous voudrez peut-être envisager de vous replier directement sur l'UUID aléatoire au lieu de l'ID de périphérique.

Encore une fois, ce code concerne un ID de périphérique, pas un ID d'installation d'application. Dans 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, 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;
    }
}
100
emmby
<uses-permission Android:name="Android.permission.READ_PHONE_STATE"></uses-permission>
7
Anil Bhatiya

Au lieu d'obtenir l'IMEI de TelephonyManager, utilisez Android_ID.

Settings.Secure.Android_ID

Cela fonctionne pour chaque appareil Android indépendamment de la téléphonie).

5
porwalankit
4
Gopi cg

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
KongJing

À partir de l'API 26, getDeviceId () est obsolète. Si vous devez obtenir l'IMEI du périphérique, utilisez les éléments suivants:

 String deviceId = "";
    if (Build.VERSION.SDK_INT >= 26) {
        deviceId = getSystemService(TelephonyManager.class).getImei();
    }else{
        deviceId = getSystemService(TelephonyManager.class).getDeviceId();
    }
0
DummyData