webentwicklung-frage-antwort-db.com.de

Androide Seriennummer

Ich entwickle eine Android-Anwendung für Android 4.0 (API 14) und höher.

Ich suche nach einer Seriennummer, die pro Gerät eindeutig ist und für immer bestehen bleibt (stirbt mit dem Gerät, ändert sich nach dem Zurücksetzen der Werkseinstellungen nicht).

Ich habe viele Ergebnisse im Internet gefunden, die eindeutige Bezeichner für Android-Geräte betreffen, aber wenig über die Android.os.Build.SERIAL - Nummer.

Bisher habe ich die Verwendung der Android_ID eliminiert, da sich diese nach Werksresets ändern könnte. Ich habe auch die Verwendung desIMEIeliminiert, da das Android-Gerät möglicherweise kein Telefon ist. Ich kann weder WLAN noch Bluetooth MAC ADDRESS verwenden, da das Gerät möglicherweise keine solche Hardware besitzt und/oder solche MAC-Adressen möglicherweise nicht lesbar sind, wenn die Hardware nicht aktiviert ist (basierend auf dem, was ich im Web gefunden habe).

Ich glaube, ich könnte die Seriennummer des Android-Geräts wählen.

Es ist leicht zugänglich mit Android.os.Build.SERIAL (da es in API Level 9 hinzugefügt wird und keine zusätzliche Berechtigung benötigt).

Meine Fragen sind:

  • Unter Berücksichtigung der Tatsache, dass meine Anwendung auf Android 4.0 (API 14) und höher abzielt, ist die Android.os.Build.SERIAL - Nummer für die Android-Geräte für jedes Gerät eindeutig?

  • Derzeit wird in der Dokumentation von Android.os.Build.SERIAL Folgendes angezeigt: Eine Hardware-Seriennummer, falls verfügbar. Nur alphanumerisch, ohne Berücksichtigung der Groß- und Kleinschreibung. Bedeutet dies, dass die Seriennummer möglicherweise nicht verfügbar ist?

  • Was könnte eine andere Alternative sein, die die oben genannten Bedingungen erfüllt?

50
Leeeeeeelo

Unter Berücksichtigung der Tatsache, dass meine Anwendung auf Android 4.0 (API 14) und höher ausgerichtet ist, ist die Android.os.Build.SERIAL-Nummer für die Android-Geräte für jedes Gerät eindeutig?

Gemäß diesem nützlichen article im Android Developers Blog ist Android.os.Build.SERIALsollte eindeutig, wenn es verfügbar ist . Aus dem Artikel:

Geräte ohne Telefonie werden benötigt, um hier eine eindeutige Geräte-ID zu melden, möglicherweise auch einige Telefone.

Bedeutet dies, dass die Seriennummer möglicherweise nicht verfügbar ist?

Richtig, es ist möglicherweise nicht verfügbar. Beachten Sie, dass sie "Geräte ohne Telefonie sind erforderlich ..." angeben, sodass nur Geräte ohne "Telefonie" (wie nur WLAN-Tablets) eine SERIAL-Nummer angeben müssen, obwohl einige Telefone dies noch tun (wie z Nexus 4).

Es fehlt definitiv an Dokumentation zu diesem Thema, aber nach dem Wortlaut ist es möglich, dass nur "Geräte ohne Telefonie" erforderlich sind, um eine eindeutige ID zu übermitteln, während Telefone, die eine übermitteln, möglicherweise nicht eindeutig sind.

Was könnte eine andere Alternative sein, die die oben genannten Bedingungen erfüllt?

Für Ihre Situation denke ich, dass Sie am besten nach einer deviceId (IMEI oder was nicht) suchen. Wenn deviceId nicht vorhanden ist, verwenden Sie Android.os.Build.SERIAL (da dies wahrscheinlich ein Tablet ist):

public static String getDeviceId(Context context) {
    final String deviceId = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId();
    if (deviceId != null) {
        return deviceId;
    } else {
        return Android.os.Build.SERIAL;
    }
}

Denken Sie daran, deviceId zu verwenden, benötigen Sie die Berechtigung Android.permission.READ_PHONE_STATE.

So Da das minSDK Ihrer App 14 ist, können Sie das Feld Android.os.Build.SERIAL sicher verwenden. Und wenn wir davon ausgehen, dass Geräte ohne Telefonie wirklich eindeutige IDs in SERIAL bereitstellen, dann wäre dies meiner Meinung nach eine sichere Sache, immer eine eindeutige Geräte-ID zu erhalten (natürlich, um Fehler zu vermeiden).

53
Tony Chan

Ich persönlich benutze Secure.Android_ID & Build.SERIAL, um ein Telefon zu identifizieren:

androidId = Settings.Secure.getString(this.getContentResolver(), 
                Settings.Secure.Android_ID) + Build.SERIAL;

Sie können denselben Android_ID haben, sie haben möglicherweise keine SERIAL. Aber die Chance von beiden ist gering.

9
Kai Wang

Sie scheinen die Situation ziemlich gut zusammengefasst zu haben.

Die Seriennummer soll für jedes Gerät eindeutig sein, es gibt jedoch natürlich (bei Android) Fehler, die Ausnahmen verursachen, z. B https://code.google.com/p/Android/issues/detail ? id = 35193

Wie Sie darauf hinweisen, schlagen die Dokumente vor, dass es sich hierbei um eine Seriennummer der Hardware handeln soll, aber die Formulierung dieser Form legt nahe, dass Sie sich nicht darauf verlassen sollten. Verwechseln Sie das nicht mit der tatsächlichen Seriennummer des Geräts, d. H. Der Seriennummer, die auf der Rückseite oder auf der Verpackung angegeben ist. Ich glaube auch, dass es weniger verbreitet ist als Android_id, daher könnte es Probleme geben, die nicht gemeldet werden.

Ich habe weithin berichtet, dass die Android_id auf der Seriennummer basiert, aber ich glaube, dass dies nicht stimmt. Ich habe kürzlich beobachtet, dass auf einem Tablet mit der neuen Multi-User-Fähigkeit jedes Benutzerkonto eine eigene Android_id erhält Seriennummer ist für beide gleich.

AFAIK 'eine andere Alternative' existiert nicht: Ihre Liste ist vollständig. Die Seriennummer ist dem, was Sie suchen, am nächsten, es sei denn, Sie sind bereit, sich auf WLAN- oder Bluetooth-Berechtigungen zu verlassen.

4
Tom

Normalerweise erhalte ich eindeutige IDs, indem ich einen SHA1-Hash einer eindeutigen Zeichenfolge (Firmenname in der Regel) + imei (wenn keine Imei, MAC-Adresse [WLAN, Bluetooth usw.]) mache. Dies gibt mir eindeutige IDs, die gleich aussehen und in der Regel pro Gerät eindeutig sind (nicht perfekt, wenn der MAC jedoch geändert/gefälscht wird).

0
Ryan Schultz