Haben Android-Geräte eine eindeutige ID, und wenn ja, wie kann man auf einfache Weise mit Java darauf zugreifen?
android
uniqueidentifier
Tyler
quelle
quelle
ANDROID_ID
, lesen Sie unbedingt diese Antwort und diesen Fehler .Antworten:
Settings.Secure#ANDROID_ID
Gibt die Android-ID als eindeutige 64-Bit-Hex-Zeichenfolge für jeden Benutzer zurück .quelle
UPDATE : Seit den letzten Versionen von Android wurden viele der Probleme
ANDROID_ID
behoben, und ich glaube, dass dieser Ansatz nicht mehr erforderlich ist. Bitte werfen Sie einen Blick auf Anthonys Antwort .Vollständige Offenlegung: Meine App hat ursprünglich den folgenden Ansatz verwendet, verwendet diesen Ansatz jedoch nicht mehr. Wir verwenden jetzt den im Android Developer Blog- Eintrag beschriebenen Ansatz, auf den die Antwort von emmby verweist (nämlich Generieren und Speichern von a
UUID#randomUUID()
).Es gibt viele Antworten auf diese Frage, von denen die meisten nur "teilweise" funktionieren, und das ist leider nicht gut genug.
Basierend auf meinen Gerätetests (alle Telefone, von denen mindestens eines nicht aktiviert ist):
TelephonyManager.getDeviceId()
TelephonyManager.getSimSerialNumber()
getSimSerialNumber()
(wie erwartet)ANDROID_ID
ANDROID_ID
undTelephonyManager.getDeviceId()
- solange während der Einrichtung ein Google-Konto hinzugefügt wurde.Wenn Sie also etwas Einzigartiges für das Gerät selbst wünschen ,
TM.getDeviceId()
sollte dies ausreichen. Offensichtlich sind einige Benutzer paranoider als andere, daher kann es nützlich sein, einen oder mehrere dieser Bezeichner zu hashen, damit die Zeichenfolge für das Gerät praktisch immer noch eindeutig ist, das tatsächliche Gerät des Benutzers jedoch nicht explizit identifiziert. Verwenden Sie beispielsweise inString.hashCode()
Kombination mit einer UUID:könnte zu etwas führen wie:
00000000-54b3-e7c7-0000-000046bffd97
Es funktioniert gut genug für mich.
Vergessen Sie nicht, dass Sie, wie Richard weiter unten erwähnt, eine Berechtigung zum Lesen der
TelephonyManager
Eigenschaften benötigen. Fügen Sie diese also Ihrem Manifest hinzu:libs importieren
quelle
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
, der Manifestdatei etwas hinzuzufügen . Beim Speichern in einer Datenbank ist die zurückgegebene Zeichenfolge 36 Zeichen lang.Letzte Aktualisierung: 02.06.15
Nachdem ich jeden Stack Overflow-Beitrag über das Erstellen einer eindeutigen ID, das Google-Entwicklerblog und die Android-Dokumentation gelesen habe, habe ich das Gefühl, dass die "Pseudo-ID" die bestmögliche Option ist.
Hauptproblem: Hardware vs Software
Hardware
Software
Gesamtaufschlüsselung mit Android
- Gewährleistung der Eindeutigkeit (einschließlich gerooteter Geräte) für API> = 9/10 (99,5% der Android-Geräte)
- Keine zusätzlichen Berechtigungen
Pseudocode:
Vielen Dank an @stansult für die Veröffentlichung aller unserer Optionen (in dieser Frage zum Stapelüberlauf ).
Liste der Optionen - Gründe, warum / warum sie nicht verwendet werden:
Benutzer-E-Mail - Software
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
oder<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
( So erhalten Sie die primäre E-Mail-Adresse des Android-Geräts )Benutzer Telefonnummer - Software
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
IMEI - Hardware (nur Telefone, Bedürfnisse
android.permission.READ_PHONE_STATE
)<uses-permission android:name="android.permission.READ_PHONE_STATE" />
Android ID - Hardware (kann null sein, kann sich beim Zurücksetzen auf die Werkseinstellungen ändern, kann auf einem gerooteten Gerät geändert werden)
WLAN MAC Address - Hardware (benötigt
android.permission.ACCESS_WIFI_STATE
)<uses-permission android:name="android.permission.ACCESS_WIFI_STATE "/>
Bluetooth MAC Address - Hardware (Geräte mit Bluetooth, benötigt
android.permission.BLUETOOTH
)<uses-permission android:name="android.permission.BLUETOOTH "/>
Pseudo-Unique ID - Software (für alle Android-Geräte)
Ich weiß, dass es keinen „perfekten“ Weg gibt, eine eindeutige ID zu erhalten, ohne Berechtigungen zu verwenden. Manchmal müssen wir jedoch nur die Geräteinstallation wirklich verfolgen. Wenn es darum geht, eine eindeutige ID zu erstellen, können wir eine "pseudo-eindeutige ID" erstellen, die ausschließlich auf Informationen basiert, die uns die Android-API ohne Verwendung zusätzlicher Berechtigungen gibt. Auf diese Weise können wir dem Benutzer Respekt entgegenbringen und versuchen, auch eine gute Benutzererfahrung zu bieten.
Mit einer pseudo-eindeutigen ID stoßen Sie wirklich nur auf die Tatsache, dass es möglicherweise Duplikate gibt, basierend auf der Tatsache, dass es ähnliche Geräte gibt. Sie können die kombinierte Methode optimieren, um sie einzigartiger zu machen. Einige Entwickler müssen jedoch die Geräteinstallationen nachverfolgen. Dies führt den Trick oder die Leistung auf der Grundlage ähnlicher Geräte aus.
API> = 9:
Wenn das Android-Gerät API 9 oder höher ist, ist dies aufgrund des Felds "Build.SERIAL" garantiert eindeutig.
Denken Sie daran, Sie verpassen technisch gesehen nur etwa 0,5% der Benutzer mit API <9 . Sie können sich also auf den Rest konzentrieren: Dies sind 99,5% der Benutzer!
API <9:
Wenn das Android-Gerät des Benutzers niedriger als API 9 ist; Hoffentlich haben sie keinen Werksreset durchgeführt und ihre 'Secure.ANDROID_ID' bleibt erhalten oder nicht 'null'. (Siehe http://developer.android.com/about/dashboards/index.html )
Wenn alle Stricke reißen:
Wenn alles andere fehlschlägt, wenn der Benutzer weniger als API 9 (niedriger als Gingerbread) hat, sein Gerät zurückgesetzt hat oder 'Secure.ANDROID_ID' 'null' zurückgibt, basiert die zurückgegebene ID einfach ausschließlich auf seinen Android-Geräteinformationen. Hier können Kollisionen auftreten.
Änderungen:
Bitte schauen Sie sich die folgende Methode an:
Neu (für Apps mit Anzeigen UND Google Play Services):
Über die Google Play-Entwicklerkonsole:
Implementierung :
Genehmigung:
Code:
Quelle / Dokumente:
http://developer.android.com/google/play-services/id.html http://developer.android.com/reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.html
Wichtig:
Warnung, Benutzer können zurücksetzen:
http://en.kioskea.net/faq/34732-android-reset-your-advertising-id
Ich habe versucht, auf jeden Link zu verweisen, von dem ich Informationen genommen habe. Wenn Sie fehlen und aufgenommen werden müssen, kommentieren Sie bitte!
Google Player Services InstanceID
https://developers.google.com/instance-id/
quelle
Build
Klasse beim Betriebssystem-Update nicht ändern? Vor allem, wenn die API aktualisiert wurde? Wenn ja, wie garantieren Sie, dass dies einzigartig ist? (Apropos Methode, die Sie geschrieben haben)Wie Dave Webb erwähnt, enthält der Android Developer Blog einen Artikel , der dies behandelt. Ihre bevorzugte Lösung besteht darin, App-Installationen anstelle von Geräten zu verfolgen. Dies funktioniert in den meisten Anwendungsfällen gut. Der Blog-Beitrag zeigt Ihnen den erforderlichen Code, damit dies funktioniert, und ich empfehle Ihnen, ihn zu überprüfen.
In dem Blogbeitrag werden jedoch Lösungen erläutert, wenn Sie eine Gerätekennung anstelle einer App-Installationskennung benötigen. Ich habe mit jemandem bei Google gesprochen, um zusätzliche Informationen zu einigen Punkten zu erhalten, falls Sie dies tun müssen. Folgendes habe ich über Gerätekennungen herausgefunden, die im oben genannten Blog-Beitrag NICHT erwähnt werden:
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 nach einem Neustart der App bestehen (jedoch nicht nach einer Neuinstallation der App).
Beachten Sie, dass für Geräte , die auf der Geräte - ID zu Rückfall haben, die eindeutige ID WIRD über Fabrik setzt bestehen bleiben. Dies ist etwas zu beachten. Wenn Sie sicherstellen müssen, dass durch einen Werksreset Ihre eindeutige ID zurückgesetzt wird, sollten Sie möglicherweise direkt auf die zufällige UUID anstelle der Geräte-ID zurückgreifen.
Auch dieser Code bezieht sich auf eine Geräte-ID und nicht auf eine App-Installations-ID. In den meisten Situationen ist eine App-Installations-ID wahrscheinlich das, wonach Sie suchen. Wenn Sie jedoch eine Geräte-ID benötigen, funktioniert der folgende Code wahrscheinlich für Sie.
quelle
Hier ist der Code, den Reto Meier in der diesjährigen Google I / O- Präsentation verwendet hat, um eine eindeutige ID für den Nutzer zu erhalten:
Wenn Sie dies mit einer Sicherungsstrategie koppeln, um Einstellungen an die Cloud zu senden (ebenfalls in Retos Vortrag beschrieben) , sollten Sie eine ID haben, die an einen Benutzer gebunden ist und nach dem Löschen oder sogar Ersetzen des Geräts erhalten bleibt. Ich plane, diese zu verwenden in der Analytik in Zukunft (mit anderen Worten, ich habe das noch nicht getan :).
quelle
Sie können auch die MAC-Adresse des Wi-Fi-Adapters berücksichtigen. So abgerufen:
Erfordert die Erlaubnis
android.permission.ACCESS_WIFI_STATE
im Manifest.Wird als verfügbar gemeldet, auch wenn keine Wi-Fi-Verbindung besteht. Wenn Joe aus der obigen Antwort diesen auf seinen vielen Geräten ausprobiert, wäre das schön.
Auf einigen Geräten ist es nicht verfügbar, wenn Wi-Fi ausgeschaltet ist.
HINWEIS: Ab Android 6.x wird eine konsistente gefälschte Mac-Adresse zurückgegeben:
02:00:00:00:00:00
quelle
android.permission.ACCESS_WIFI_STATE
02:00:00:00:00:00
Es gibt ziemlich nützliche Informationen hier .
Es werden fünf verschiedene ID-Typen behandelt:
android.permission.READ_PHONE_STATE
)android.permission.ACCESS_WIFI_STATE
)android.permission.BLUETOOTH
)quelle
Der offizielle Android-Entwickler-Blog enthält jetzt einen vollständigen Artikel zu diesem Thema: Identifizieren von App-Installationen .
quelle
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. Anthony Nolan zeigt die Richtung in seiner Antwort, aber ich dachte, ich würde den vollständigen Ansatz aufschreiben, damit andere leicht sehen können, wie es geht (es dauerte eine Weile, bis ich die Details herausgefunden hatte).
Mit diesem Ansatz erhalten Sie eine anonyme, sichere Benutzer-ID, die für den Benutzer auf verschiedenen Geräten (basierend auf dem primären Google-Konto) und bei Installationen dauerhaft gültig ist. 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.
Lassen Sie uns den vollständigen Ansatz durchgehen. Zunächst müssen wir mithilfe des Android-Sicherungsdienstes ein Backup für unsere SharedPreferences erstellen. Beginnen Sie mit der Registrierung Ihrer App über
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 das Gerät verschiebt.
Weitere Informationen zu diesem Ansatz finden Sie in Retos Vortrag .
Ausführliche Informationen zum Implementieren des Sicherungsagenten finden Sie unter Datensicherung . Ich empfehle insbesondere den Abschnitt unten zum Testen, da die Sicherung nicht sofort erfolgt. Zum Testen müssen Sie die Sicherung erzwingen.
quelle
Ich denke, dies ist ein sicherer Weg, ein Skelett für einen eindeutigen Ausweis zu bauen ... probieren Sie es aus.
Pseudo-eindeutige ID, die auf allen Android-Geräten funktioniert Einige Geräte haben kein Telefon (z. B. Tablets) oder aus irgendeinem Grund möchten Sie die Berechtigung READ_PHONE_STATE nicht einschließen. Sie können weiterhin Details wie ROM-Version, Herstellername, CPU-Typ und andere Hardwaredetails lesen, die sich gut eignen, wenn Sie die ID für eine Überprüfung des Serienschlüssels oder für andere allgemeine Zwecke verwenden möchten. Die auf diese Weise berechnete ID ist nicht eindeutig: Es ist möglich, zwei Geräte mit derselben ID (basierend auf derselben Hardware und demselben ROM-Image) zu finden, aber die Änderungen in realen Anwendungen sind vernachlässigbar. Zu diesem Zweck können Sie die Build-Klasse verwenden:
Die meisten Build-Mitglieder sind Zeichenfolgen. Wir nehmen hier ihre Länge und transformieren sie über Modulo in eine Ziffer. Wir haben 13 solcher Ziffern und wir fügen zwei weitere vor (35) hinzu, um die gleiche Größen-ID wie die IMEI (15 Ziffern) zu haben. Es gibt andere Möglichkeiten hier sind gut, schauen Sie sich nur diese Saiten an. Gibt so etwas wie zurück
355715565309247
. Es ist keine spezielle Genehmigung erforderlich, was diesen Ansatz sehr praktisch macht.(Zusätzliche Informationen: Die oben angegebene Technik wurde aus einem Artikel über Pocket Magic kopiert .)
quelle
Der folgende Code gibt die Seriennummer des Geräts mithilfe einer versteckten Android-API zurück. Dieser Code funktioniert jedoch nicht auf dem Samsung Galaxy Tab, da auf diesem Gerät nicht "ro.serialno" festgelegt ist.
quelle
ro.serialno
verwendet wird, um das zu generierenSettings.Secure.ANDROID_ID
. Es handelt sich also grundsätzlich um unterschiedliche Darstellungen desselben Wertes.ANDROID_ID
abgeleitet.android.os.Build.SERIAL
android.os.Build.SERIAL
wird in Android O veraltet sein, siehe android-developers.googleblog.com/2017/04/…Es ist eine einfache Frage ohne einfache Antwort.
Darüber hinaus sind alle vorhandenen Antworten hier veraltet oder unzuverlässig.
Also , wenn Sie im Jahr 2020 für eine Lösung sind .
Hier sind einige Dinge zu beachten:
Alle hardwarebasierten Kennungen (SSAID, IMEI, MAC usw.) sind für Geräte von Nicht-Google (alles außer Pixel und Nexus) unzuverlässig, die mehr als 50% der aktiven Geräte weltweit ausmachen. In den offiziellen Best Practices für Android-Kennungen heißt es daher eindeutig:
Das macht die meisten der oben genannten Antworten ungültig. Aufgrund verschiedener Android-Sicherheitsupdates erfordern einige von ihnen neuere und strengere Laufzeitberechtigungen, die vom Benutzer einfach verweigert werden können.
Als Beispiel
CVE-2018-9489
, das alle oben genannten WIFI-basierten Techniken betrifft.Das macht diese Kennungen nicht nur unzuverlässig, sondern in vielen Fällen auch unzugänglich.
Also in einfacheren Worten: Verwenden Sie diese Techniken nicht .
Viele andere Antworten hier schlagen vor, das zu verwenden
AdvertisingIdClient
, was ebenfalls nicht kompatibel ist, da es von Natur aus nur für die Erstellung von Anzeigenprofilen verwendet werden sollte. Es ist auch in der offiziellen Referenz angegebenEs ist nicht nur für die Geräteidentifikation unzuverlässig, sondern Sie müssen auch die Privatsphäre des Nutzers in Bezug auf die Anzeigenverfolgungsrichtlinie befolgen , in der eindeutig festgelegt ist, dass der Nutzer sie jederzeit zurücksetzen oder blockieren kann.
Also benutze es auch nicht .
Da Sie nicht die gewünschte statische global eindeutige und zuverlässige Gerätekennung haben können. Die offizielle Referenz von Android schlägt vor:
Es ist einzigartig für die Anwendungsinstallation auf dem Gerät. Wenn der Benutzer die App deinstalliert, wird sie gelöscht, ist also nicht 100% zuverlässig, aber das nächstbeste.
So verwenden Sie
FirebaseInstanceId
das Add neueste Firebase-Messaging - Abhängigkeit in Ihr gradleUnd verwenden Sie den folgenden Code in einem Hintergrund-Thread:
Wenn Sie die Geräteidentifikation auf Ihrem Remote-Server speichern müssen, speichern Sie sie nicht wie sie ist (einfacher Text), sondern einen Hash mit Salz .
Heutzutage ist dies nicht nur eine bewährte Methode , sondern Sie müssen dies auch gesetzlich gemäß den DSGVO-Kennungen und ähnlichen Vorschriften tun .
quelle
Mit dem folgenden Code können Sie die eindeutige Geräte-ID eines Android-Betriebssystemgeräts als Zeichenfolge abrufen.
quelle
Ein serielles Feld wurde der
Build
Klasse in API Level 9 (Android 2.3 - Gingerbread) hinzugefügt . Die Dokumentation besagt, dass es sich um die Hardware-Seriennummer handelt. Daher sollte es eindeutig sein, wenn es auf dem Gerät vorhanden ist.Ich weiß nicht, ob es tatsächlich von allen Geräten mit API-Level> = 9 unterstützt wird (= nicht null).
quelle
Eines werde ich hinzufügen - ich habe eine dieser einzigartigen Situationen.
Verwenden von:
Es stellt sich heraus, dass mein Viewsonic G Tablet zwar eine Geräte-ID meldet, die nicht Null ist, aber jedes einzelne G Tablet dieselbe Nummer meldet.
Das macht es interessant, "Pocket Empires" zu spielen, mit dem Sie sofort auf das Konto einer anderen Person zugreifen können, basierend auf der "einzigartigen" Geräte-ID.
Mein Gerät hat kein Mobilfunkgerät.
quelle
9774d56d682e549c
?Ausführliche Anweisungen zum Abrufen einer eindeutigen Kennung für jedes Android-Gerät, von dem aus Ihre Anwendung installiert wird, finden Sie im offiziellen Android Developers Blog-Beitrag Identifizieren von App-Installationen .
Es scheint der beste Weg zu sein, bei der Installation selbst einen zu generieren und ihn anschließend zu lesen, wenn die Anwendung neu gestartet wird.
Ich persönlich finde das akzeptabel, aber nicht ideal. Keine von Android bereitgestellte Kennung funktioniert in allen Fällen, da die meisten von den Funkzuständen des Telefons abhängen (WLAN ein / aus, Mobilfunk ein / aus, Bluetooth ein / aus). Die anderen, wie
Settings.Secure.ANDROID_ID
müssen vom Hersteller implementiert werden und sind nicht garantiert einzigartig.Das folgende Beispiel zeigt das Schreiben von Daten in eine Installationsdatei , die zusammen mit anderen Daten gespeichert werden, die die Anwendung lokal speichert.
quelle
Fügen Sie den folgenden Code in die Klassendatei ein:
In AndroidManifest.xml hinzufügen:
quelle
Die eindeutige Geräte-ID eines Android-Betriebssystemgeräts als String unter Verwendung von
TelephonyManager
undANDROID_ID
wird erhalten durch:Ich empfehle jedoch dringend eine von Google vorgeschlagene Methode, siehe Identifizieren von App-Installationen .
quelle
Es gibt viele verschiedene Ansätze, um diese
ANDROID_ID
Probleme zu umgehen (null
manchmal oder wenn Geräte eines bestimmten Modells immer dieselbe ID zurückgeben), mit Vor- und Nachteilen:Ich selbst bevorzuge die Verwendung einer vorhandenen OpenUDID-Implementierung (siehe https://github.com/ylechelle/OpenUDID ) für Android (siehe https://github.com/vieux/OpenUDID ). Es ist einfach zu integrieren und nutzt die
ANDROID_ID
With-Fallbacks für die oben genannten Probleme.quelle
Wie wäre es mit der IMEI . Das ist einzigartig für Android oder andere mobile Geräte.
quelle
So generiere ich die eindeutige ID:
quelle
Meine zwei Cent - Hinweis: Dies ist für eine eindeutige Geräte-ID (err) - nicht für die Installation, wie im Blog der Android-Entwickler beschrieben .
Beachten Sie, dass die von @emmby bereitgestellte Lösung auf eine Anwendungs-ID zurückgreift, da die SharedPreferences nicht prozessübergreifend synchronisiert sind (siehe hier und hier ). Also habe ich das ganz vermieden.
Stattdessen habe ich die verschiedenen Strategien zum Abrufen einer (Geräte-) ID in einer Aufzählung zusammengefasst. Das Ändern der Reihenfolge der Aufzählungskonstanten wirkt sich auf die Priorität der verschiedenen Methoden zum Abrufen der ID aus. Die erste Nicht-Null-ID wird zurückgegeben oder eine Ausnahme wird ausgelöst (gemäß den guten Java-Praktiken, Null keine Bedeutung zu geben). So habe ich zum Beispiel zuerst die TELEFONIE - aber eine gute Standardauswahl wäre die ANDROID_ID Beta:
quelle
Hier gibt es mehr als 30 Antworten und einige sind gleich und einige sind einzigartig. Diese Antwort basiert auf wenigen dieser Antworten. Eine davon ist die Antwort von @Lenn Dolling.
Es kombiniert 3 IDs und erstellt eine 32-stellige Hex-Zeichenfolge. Es hat sehr gut für mich funktioniert.
3 IDs sind:
Pseudo-ID - Sie wird basierend auf den Spezifikationen
des physischen Geräts generiert. ANDROID_ID -
Settings.Secure.ANDROID_ID
Bluetooth-Adresse - Bluetooth- Adapteradresse
Es wird ungefähr so etwas zurückgeben: 551F27C060712A72730B0A0F734064B1
Hinweis: Sie können der
longId
Zeichenfolge jederzeit weitere IDs hinzufügen . Zum Beispiel Seriennummer. WLAN-Adapteradresse. IMEI. Auf diese Weise machen Sie es pro Gerät einzigartiger.quelle
longId
und speichern sie in einer Datei, wird es die einzigartige Kennung machen:String uuid = UUID.randomUUID().toString();
longId
. Ändern Sie diese eine Zeile folgendermaßen:String longId = pseudoId + androidId + btId + UUID.randomUUID().toString();
Dies garantiert, dass die generierte ID eindeutig ist.Eine andere Möglichkeit ist die Verwendung
/sys/class/android_usb/android0/iSerial
in einer App ohne jegliche Berechtigungen.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 auch meinen Blog-Beitrag sehen, in dem die Seriennummer der Android-Hardware an nicht privilegierte Apps weitergegeben wird, in dem ich diskutiere, welche anderen Dateien für Informationen verfügbar sind.
quelle
TelephonyManger.getDeviceId () Gibt die eindeutige Geräte-ID zurück, z. B. die IMEI für GSM und die MEID oder ESN für CDMA-Telefone.
Aber ich empfehle zu verwenden:
Settings.Secure.ANDROID_ID , die die Android-ID als eindeutige 64-Bit-Hex-Zeichenfolge zurückgibt.
Manchmal gibt TelephonyManger.getDeviceId () null zurück. Um eine eindeutige ID sicherzustellen, verwenden Sie diese Methode:
quelle
Für die Hardwareerkennung eines bestimmten Android-Geräts können Sie die MAC-Adressen überprüfen.
Sie können es so machen:
in AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
jetzt in deinem Code:
In jedem Android-Gerät gibt es mindestens eine "wlan0" -Schnittstelle, bei der es sich um den WI-FI-Chip handelt. Dieser Code funktioniert auch, wenn WI-FI nicht aktiviert ist.
PS Es gibt eine Reihe anderer Schnittstellen, die Sie aus der Liste mit MACS erhalten. Dies kann sich jedoch zwischen den Telefonen ändern.
quelle
Ich verwende den folgenden Code, um das zu erhalten
IMEI
oder Secure zu verwenden.ANDROID_ID
Alternativ, wenn das Gerät nicht über Telefonfunktionen verfügt:quelle
Genauer gesagt
Settings.Secure.ANDROID_ID
. Dies ist eine 64-Bit-Größe, die beim ersten Start des Geräts generiert und gespeichert wird. Es wird zurückgesetzt, wenn das Gerät gelöscht wird.ANDROID_ID
scheint eine gute Wahl für eine eindeutige Gerätekennung zu sein. Es gibt Nachteile: Erstens ist es bei Android-Versionen vor 2.2 nicht 100% zuverlässig.(“Froyo”).
Außerdem gab es mindestens einen weit verbreiteten Fehler in einem beliebten Mobilteil eines großen Herstellers, bei dem jede Instanz dieselbe ANDROID_ID hat.quelle
Um die verfügbaren eindeutigen IDs in Android-Geräten zu verstehen. Verwenden Sie diesen offiziellen Leitfaden.
Best Practices für eindeutige Kennungen:
IMEI, Mac-Adressen, Instanz-ID, GUIDs, SSAID, Werbe-ID, Sicherheitsnetz-API zur Überprüfung von Geräten.
https://developer.android.com/training/articles/user-data-ids
quelle
Google Instance ID
Veröffentlicht am I / O 2015; Für Android sind Spieldienste erforderlich. 7.5.
https://developers.google.com/instance-id/
https://developers.google.com/instance-id/guides/android-implementation
Es scheint, dass Google beabsichtigt, diese ID zur Identifizierung von Installationen in Android, Chrome und iOS zu verwenden.
Es identifiziert eher eine Installation als ein Gerät, aber ANDROID_ID (die akzeptierte Antwort) identifiziert jetzt auch keine Geräte mehr. Mit der ARC-Laufzeit wird für jede Installation eine neue ANDROID_ID generiert ( Details hier ), genau wie bei dieser neuen Instanz-ID. Ich denke auch, dass die meisten von uns tatsächlich nach der Identifizierung von Installationen (nicht nach Geräten) suchen.
Die Vorteile der Instanz-ID
Es scheint mir, dass Google beabsichtigt, es für diesen Zweck zu verwenden (Identifizierung Ihrer Installationen), es ist plattformübergreifend und kann für eine Reihe anderer Zwecke verwendet werden (siehe die obigen Links).
Wenn Sie GCM verwenden, müssen Sie diese Instanz-ID möglicherweise verwenden, da Sie sie benötigen, um das GCM-Token zu erhalten (das die alte GCM-Registrierungs-ID ersetzt).
Die Nachteile / Probleme
In der aktuellen Implementierung (GPS 7.5) wird die Instanz-ID von einem Server abgerufen, wenn Ihre App dies anfordert. Dies bedeutet, dass der obige Anruf ein blockierender Anruf ist - in meinen unwissenschaftlichen Tests dauert es 1-3 Sekunden, wenn das Gerät online ist, und 0,5 - 1,0 Sekunden, wenn es offline ist (vermutlich ist dies die Zeit, die es wartet, bevor es aufgibt und einen generiert zufällige ID). Dies wurde in Nordamerika auf Nexus 5 mit Android 5.1.1 und GPS 7.5 getestet.
Wenn Sie die ID für die beabsichtigten Zwecke verwenden - z. App-Authentifizierung, App-Identifikation, GCM - Ich denke, diese 1-3 Sekunden könnten ein Ärgernis sein (natürlich abhängig von Ihrer App).
quelle