webentwicklung-frage-antwort-db.com.de

Android: So greifen Sie programmgesteuert auf die im AVD-Manager angezeigte Seriennummer des Geräts zu (API Version 8)

Wie greife ich programmgesteuert auf den in der folgenden Abbildung gezeigten Wert zu?

enter image description here

41
Heshan Perera

Dies ist die Hardware-Seriennummer. Um darauf zuzugreifen

  • Android 8 und höher (> = SDK 26) verwenden Android.os.Build.getSerial(), wofür die gefährliche Erlaubnis erforderlich ist READ_PHONE_STATE . Mit Android.os.Build.SERIAL gibt Android.os.Build.UNKNOWN zurück.

  • Android 7.1 und früher (<= SDK 25) und früher Android.os.Build.SERIAL gibt eine gültige Seriennummer zurück.

Es ist einzigartig für jedes Gerät. Wenn Sie nach Möglichkeiten suchen, wie Sie eine eindeutige Geräte-ID erhalten/verwenden können, lesen Sie hier .

Für eine Lösung mit Reflektion ohne Erlaubnis siehe diese Antwort .

71
thaussma

Bis zu Android 7.1 (SDK 25)

Bis Android 7.1 erhalten Sie es mit:

Build.SERIAL

Von Android 8 (SDK 26)

Ab Android 8 (SDK 26)) wird dieses Feld UNKNOWN zurückgegeben und muss wie folgt aufgerufen werden:

Build.getSerial()

das erfordert die gefährliche ErlaubnisAndroid.permission.READ_PHONE_STATE .

Von Android Q (SDK 29)

Da Android Q mit Build.getSerial() etwas komplizierter wird, benötigen Sie:

Android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE (Kann nur von System-Apps bezogen werden), oder , damit das aufrufende Paket das Gerät oder Profil ist Eigentümer und haben die Berechtigung READ_PHONE_STATE . Dies bedeutet, dass die meisten Apps diese Funktion nicht nutzen können. Siehe Android Q-Ankündigung von Google.

Siehe Android SDK-Referenz


Best Practice für eindeutige Gerätekennung

Wenn Sie nur eine eindeutige Kennung benötigen, vermeiden Sie am besten die Verwendung von Hardware-Kennungen, da Google aus Datenschutzgründen ständig versucht, den Zugriff darauf zu erschweren. Sie könnten einfach eine UUID.randomUUID().toString(); generieren und diese speichern, wenn zum ersten Mal in z. Gemeinsame Einstellungen. Alternativ können Sie Android_ID verwenden, eine 8 Byte lange Hex-Zeichenfolge, die für die Installation von Geräten, Benutzern und Apps (nur Android 8+)) eindeutig ist. Weitere Informationen zu diesem Thema finden Sie unter Best Practices für eindeutige Bezeichner .

40
patrickf

Build.SERIALkann leer sein oder manchmal einen anderen Wert zurückgeben ( Beweis 1 , Beweis 2 ) als das, was Sie in Ihrem sehen können Geräteeinstellungen.

Wenn Sie eine umfassendere und robustere Lösung wünschen, habe ich alle möglichen Lösungen in einem einzigen Gist zusammengefasst. Hier ist eine vereinfachte Version davon:

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;
}

Ich versuche, das Gist regelmäßig zu aktualisieren, wenn ich einen Test auf einem neuen Gerät oder einer Android - Version durchführen kann. Beiträge sind ebenfalls willkommen.

13
flawyte