Ich muss eine eindeutige ID für eine Android-App verwenden und dachte, die Seriennummer für das Gerät wäre ein guter Kandidat. Wie rufe ich die Seriennummer eines Android-Geräts in meiner App ab?
115
Ich muss eine eindeutige ID für eine Android-App verwenden und dachte, die Seriennummer für das Gerät wäre ein guter Kandidat. Wie rufe ich die Seriennummer eines Android-Geräts in meiner App ab?
Antworten:
getSystemService ist eine Methode aus der Activity-Klasse. getDeviceID () gibt die MDN oder MEID des Geräts zurück, je nachdem, welches Funkgerät das Telefon verwendet (GSM oder CDMA).
Jedes Gerät MUSS hier einen eindeutigen Wert zurückgeben (vorausgesetzt, es handelt sich um ein Telefon). Dies sollte für jedes Android-Gerät mit einem Sim-Steckplatz oder CDMA-Radio funktionieren. Mit dieser Android-Mikrowelle bist du allein ;-)
quelle
Wie Dave Webb erwähnt, enthält der Android Developer Blog einen Artikel , der dies behandelt.
Ich habe mit jemandem bei Google gesprochen, um zusätzliche Informationen zu einigen Punkten zu erhalten. Folgendes habe ich entdeckt, das im oben genannten Blog-Beitrag NICHT erwähnt wird:
Basierend auf den Empfehlungen von Google habe ich eine Klasse implementiert, die für jedes Gerät eine eindeutige UUID generiert. Dabei wird ANDROID_ID als Startwert verwendet, wobei bei Bedarf auf TelephonyManager.getDeviceId () zurückgegriffen wird. Wenn dies fehlschlägt, wird auf eine zufällig generierte eindeutige UUID zurückgegriffen Dies bleibt auch bei App-Neustarts erhalten (jedoch nicht bei App-Neuinstallationen).
quelle
Dieser Code gibt die Seriennummer des Geräts mithilfe einer versteckten Android-API zurück.
quelle
Es kann jedoch nicht garantiert werden, dass die Android-ID eine eindeutige Kennung ist.
quelle
getContentResolver
das zurückkehrtnull
. Es kann sich jedoch lohnen, eine Frage zu öffnen und Ihren Code zu veröffentlichen.Es gibt einen ausgezeichneten Beitrag im Blog des Android-Entwicklers, in dem dies diskutiert wird .
Es wird davon abgeraten, es zu verwenden,
TelephonyManager.getDeviceId()
da es auf Android-Geräten, die keine Telefone wie Tablets sind, nicht funktioniertREAD_PHONE_STATE
nicht funktioniert. Erlaubnis und funktioniert nicht auf allen Telefonen zuverlässig.Stattdessen können Sie eine der folgenden Optionen verwenden:
In diesem Beitrag werden die Vor- und Nachteile der einzelnen Elemente erläutert. Es lohnt sich, sie zu lesen, damit Sie herausfinden können, welches für Sie am besten geeignet ist.
quelle
Verwenden Sie Settings.Secure.ANDROID_ID für eine einfache Nummer, die für das Gerät eindeutig und für die gesamte Lebensdauer konstant ist (außer beim Zurücksetzen auf die Werkseinstellungen oder beim Hacken) .
So verwenden Sie die Seriennummer des Geräts (die unter "Systemeinstellungen / Info / Status" angegebene), falls verfügbar, und greifen auf die Android-ID zurück:
quelle
Die IMEI ist gut, funktioniert aber nur auf Android-Geräten mit Telefon. Sie sollten auch die Unterstützung für Tablets oder andere Android-Geräte in Betracht ziehen, die kein Telefon haben.
Sie haben einige Alternativen wie: Erstellen Sie Klassenmitglieder, BT MAC, WLAN MAC oder noch besser - eine Kombination aus all diesen.
Ich habe diese Details in einem Artikel in meinem Blog erklärt, siehe: http://www.pocketmagic.net/?p=1662
quelle
Da hier keine Antwort erwähnt wird, wird eine perfekte, ausfallsichere ID erwähnt, die sowohl durch Systemaktualisierungen BESTÄNDIG ist als auch auf ALLEN Geräten vorhanden ist (hauptsächlich aufgrund der Tatsache, dass es keine individuelle Lösung von Google gibt), habe ich beschlossen, eine Methode zu veröffentlichen Das nächstbeste ist, wenn Sie zwei der verfügbaren Bezeichner kombinieren und zur Laufzeit eine Auswahl treffen.
Vor dem Code 3 Fakten:
TelephonyManager.getDeviceId()
(akaIMEI) funktioniert nicht gut oder überhaupt nicht für Geräte ohne GSM, 3G, LTE usw., gibt jedoch immer eine eindeutige ID zurück, wenn verwandte Hardware vorhanden ist , selbst wenn keine SIM-Karte eingelegt ist oder wenn kein SIM-Steckplatz vorhanden ist ( Einige OEMs haben dies getan.Da Gingerbread (Android 2.3)
android.os.Build.SERIAL
auf jedem Gerät vorhanden sein muss, das keine IMEI bereitstellt , dh die oben genannte Hardware gemäß der Android-Richtlinie nicht vorhanden ist.Aufgrund der Tatsache (2.) ist IMMER mindestens eine dieser beiden eindeutigen Kennungen vorhanden , und SERIAL kann gleichzeitig mit IMEI vorhanden sein.
Hinweis: Fakt (1.) und (2.) basieren auf Google-Aussagen
LÖSUNG
Mit den obigen Fakten kann man immer eine eindeutige Kennung haben, indem man prüft, ob IMEI-gebundene Hardware vorhanden ist, und auf SERIAL zurückgreifen, wenn dies nicht der Fall ist, da man nicht prüfen kann, ob die vorhandene SERIAL gültig ist. Die folgende statische Klasse enthält zwei Methoden zum Überprüfen des Vorhandenseins und Verwenden von IMEI oder SERIAL:
Ich würde raten zur Verwendung
getCleartextID_HARDCHECK
. Wenn die Reflexion nicht in Ihrer Umgebung haftet, verwenden SiegetCleartextID_SIMCHECK
stattdessen die Methode. Berücksichtigen Sie jedoch, dass sie an Ihre spezifischen Anforderungen an die SIM-Präsenz angepasst werden sollte.PS : Bitte beachten Sie, dass es OEMs gelungen ist, SERIAL gegen die Google-Richtlinien (mehrere Geräte mit derselben SERIAL) auszutauschen. Wie bereits erwähnt, gibt es bei einem großen OEM mindestens einen bekannten Fall (nicht bekannt gegeben und ich weiß nicht, welche Marke) es ist entweder, ich vermute Samsung).
Haftungsausschluss : Dies beantwortet die ursprüngliche Frage nach einer eindeutigen Geräte-ID. Das OP führte jedoch Unklarheiten ein, indem es angab, dass er eine eindeutige ID für eine APP benötigt. Selbst wenn für solche Szenarien Android_ID besser wäre, wird es beispielsweise nach einer Titan-Sicherung einer App durch zwei verschiedene ROM-Installationen NICHT funktionieren (kann sogar dasselbe ROM sein). Meine Lösung behält die Persistenz bei, die unabhängig von einem Flash oder einem Zurücksetzen auf die Werkseinstellungen ist, und schlägt nur fehl, wenn IMEI- oder SERIAL-Manipulationen durch Hacks / Hardware-Mods auftreten.
quelle
Es gibt Probleme mit allen oben genannten Ansätzen. Bei Google i / o veröffentlichte Reto Meier eine solide Antwort darauf, wie dies angegangen werden sollte, um die Anforderungen der meisten Entwickler zu erfüllen und Benutzer über Installationen hinweg zu verfolgen.
Mit diesem Ansatz erhalten Sie eine anonyme, sichere Benutzer-ID, die für den Benutzer auf verschiedenen Geräten (einschließlich Tablets, basierend auf dem primären Google-Konto) und bei Installationen auf demselben Gerät dauerhaft bleibt. Der grundlegende Ansatz besteht darin, eine zufällige Benutzer-ID zu generieren und diese in den gemeinsamen Einstellungen der Apps zu speichern. Anschließend verwenden Sie den Backup-Agenten von Google, um die mit dem Google-Konto verknüpften freigegebenen Einstellungen in der Cloud zu speichern.
Gehen wir den vollständigen Ansatz durch. Zuerst müssen wir mit dem Android Backup Service ein Backup für unsere SharedPreferences erstellen. Registrieren Sie zunächst Ihre App über diesen Link: http://developer.android.com/google/backup/signup.html
Google gibt Ihnen einen Sicherungsdienstschlüssel, den Sie dem Manifest hinzufügen müssen. Sie müssen der Anwendung außerdem mitteilen, dass sie den BackupAgent wie folgt verwenden soll:
Anschließend müssen Sie den Sicherungsagenten erstellen und ihn anweisen, den Hilfsagenten für freigegebene Einstellungen zu verwenden:
Um die Sicherung abzuschließen, müssen Sie in Ihrer Hauptaktivität eine Instanz von BackupManager erstellen:
Erstellen Sie abschließend eine Benutzer-ID, falls diese noch nicht vorhanden ist, und speichern Sie sie in den SharedPreferences:
Diese Benutzer-ID bleibt jetzt installationsübergreifend erhalten, auch wenn der Benutzer zwischen Geräten wechselt.
Weitere Informationen zu diesem Ansatz finden Sie in Retos Vortrag hier http://www.google.com/events/io/2011/sessions/android-protips-advanced-topics-for-expert-android-app-developers.html
Ausführliche Informationen zur Implementierung des Sicherungsagenten finden Sie auf der Entwicklerseite hier: http://developer.android.com/guide/topics/data/backup.html. Ich empfehle insbesondere den Abschnitt unten zum Testen, wie dies bei der Sicherung der Fall ist nicht sofort passieren und um zu testen, müssen Sie die Sicherung erzwingen.
quelle
Eine andere Möglichkeit besteht darin, / sys / class / android_usb / android0 / iSerial in einer App ohne jegliche Berechtigungen zu verwenden.
Um dies in Java zu tun, würde man einfach einen FileInputStream verwenden, um die iSerial-Datei zu öffnen und die Zeichen vorzulesen. Stellen Sie nur sicher, dass Sie es in einen Ausnahmebehandler einbinden, da nicht alle Geräte über diese Datei verfügen.
Es ist bekannt, dass mindestens die folgenden Geräte diese Datei weltweit lesbar haben:
Sie können meinen Blog-Beitrag auch hier sehen: http://insitusec.blogspot.com/2013/01/leaking-android-hardware-serial-number.html, wo ich diskutiere, welche anderen Dateien für Informationen verfügbar sind.
quelle
Wie @haserman sagt:
Es ist jedoch erforderlich, die Berechtigung in die Manifestdatei aufzunehmen:
quelle
Eindeutige Geräte-ID des Android-Betriebssystemgeräts als Zeichenfolge.
Ich empfehle diese von Google :: vorgeschlagene Methode jedoch dringend.
App-Installationen identifizieren
quelle
Build.SERIAL
Dies ist der einfachste Weg, obwohl er nicht ganz zuverlässig ist, da er leer sein oder manchmal einen anderen Wert ( Proof 1 , Proof 2 ) zurückgeben kann als in den Einstellungen Ihres Geräts angegeben.Abhängig vom Hersteller des Geräts und der Android-Version gibt es verschiedene Möglichkeiten, diese Nummer zu ermitteln . Daher habe ich beschlossen, alle möglichen Lösungen, die ich finden konnte, in einem einzigen Inhalt zusammenzustellen . Hier ist eine vereinfachte Version davon:
quelle
Ich weiß, dass diese Frage alt ist, aber sie kann in einer Codezeile gestellt werden
String deviceID = Build.SERIAL;
quelle
Ich fand die Beispielklasse, die oben von @emmby gepostet wurde, ein guter Ausgangspunkt. Aber es hat ein paar Mängel, wie von anderen Plakaten erwähnt. Das wichtigste ist, dass die UUID unnötig in einer XML-Datei gespeichert bleibt und danach immer aus dieser Datei abgerufen wird. Dies eröffnet der Klasse einen einfachen Hack: Jeder mit einem verwurzelten Telefon kann die XML-Datei bearbeiten, um sich eine neue UUID zu geben.
Ich habe den Code so aktualisiert, dass er nur dann in XML verbleibt, wenn dies unbedingt erforderlich ist (dh wenn eine zufällig generierte UUID verwendet wird), und die Logik gemäß der Antwort von @Brill Pappin neu berücksichtigt:
quelle
Ja. Es handelt sich um eine Seriennummer der Gerätehardware, die eindeutig ist. Ab API-Level 2.3 und höher können Sie android.os.Build.ANDROID_ID verwenden , um es abzurufen . Verwenden Sie für API-Level unter 2.3 TelephonyManager.getDeviceID () .
Sie können diese http://android-developers.blogspot.in/2011/03/identifying-app-installations.html lesen
quelle