web-dev-qa-db-fra.com

Android: comment accéder par programme au numéro de série de l'appareil affiché dans le gestionnaire AVD (API version 8)

Comment accéder par programme à la valeur indiquée dans l'image ci-dessous?

enter image description here

41
Heshan Perera

Il s'agit du numéro de série du matériel. Pour y accéder sur

  • Android 8 et versions ultérieures (> = SDK 26) utilisez Android.os.Build.getSerial() qui nécessite la permission dangereuse READ_PHONE_STATE . En utilisant Android.os.Build.SERIAL renvoie Android.os.Build.UNknown .

  • Android 7.1 et versions antérieures (<= SDK 25) et versions antérieures Android.os.Build.SERIAL renvoie une série valide.

C'est unique pour n'importe quel appareil. Si vous cherchez des possibilités pour obtenir/utiliser un identifiant d'appareil unique, vous devriez lire ici .

Pour une solution impliquant la réflexion sans nécessiter d'autorisation, voir cette réponse .

71
thaussma

Jusqu'à Android 7.1 (SDK 25)

Jusqu'à Android 7.1 vous l'obtiendrez avec:

Build.SERIAL

Depuis Android 8 (SDK 26)

Sur Android 8 (SDK 26) et supérieur, ce champ renverra UNKNOWN et doit être accessible avec:

Build.getSerial()

qui nécessite la permission dangereuseAndroid.permission.READ_PHONE_STATE .

À partir de Android Q (SDK 29)

Puisque Android Q en utilisant Build.getSerial() devient un peu plus compliqué en exigeant:

Android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE (Qui ne peut être acquis que par les applications système), ou pour que le package appelant soit le appareil ou profil propriétaire et avoir l'autorisation READ_PHONE_STATE . Cela signifie que la plupart des applications ne pourront pas utiliser cette fonctionnalité. Voir Annonce Android Q de Google.

Voir référence du SDK Android


Meilleure pratique pour l'identifiant unique du périphérique

Si vous avez juste besoin d'un identifiant unique, il est préférable d'éviter d'utiliser des identifiants matériels, car Google essaie continuellement de rendre l'accès plus difficile pour des raisons de confidentialité. Vous pouvez simplement générer une UUID.randomUUID().toString(); et l'enregistrer la première fois qu'elle doit être accessible, par ex. préférences partagées. Vous pouvez également utiliser Android_ID qui est une chaîne hexadécimale de 8 octets unique à l'appareil, à l'utilisateur et (uniquement à l'installation de l'application Android 8+)). Pour plus d'informations sur ce sujet, voir Meilleures pratiques pour les identificateurs uniques .

40
patrickf

Build.SERIALpeut être vide ou renvoie parfois une valeur différente ( épreuve 1 , épreuve 2 ) que ce que vous pouvez voir dans les paramètres de votre appareil.

Si vous voulez une solution plus complète et robuste, j'ai compilé toutes les solutions possibles que j'ai pu trouver en un seul Gist . En voici une version simplifiée:

public static String getSerialNumber() {
    String serialNumber;

    try {
        Class<?> c = Class.forName("Android.os.SystemProperties");
        Method get = c.getMethod("get", String.class);

        serialNumber = (String) get.invoke(c, "gsm.sn1");
        if (serialNumber.equals(""))
            serialNumber = (String) get.invoke(c, "ril.serialnumber");
        if (serialNumber.equals(""))
            serialNumber = (String) get.invoke(c, "ro.serialno");
        if (serialNumber.equals(""))
            serialNumber = (String) get.invoke(c, "sys.serialnumber");
        if (serialNumber.equals(""))
            serialNumber = Build.SERIAL;

        // If none of the methods above worked
        if (serialNumber.equals(""))
            serialNumber = null;
    } catch (Exception e) {
        e.printStackTrace();
        serialNumber = null;
    }

    return serialNumber;
}

J'essaie de mettre à jour Gist régulièrement chaque fois que je peux tester sur un nouvel appareil ou Android. Les contributions sont également les bienvenues.

13
flawyte