Wie greife ich programmgesteuert auf den in der folgenden Abbildung gezeigten Wert zu?
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 .
Bis Android 7.1 erhalten Sie es mit:
Build.SERIAL
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
.
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
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 .
Build.SERIAL
kann 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.