Ist Secure.ANDROID_ID für jedes Gerät eindeutig?

80

Ich benutze diesen Anruf:

Secure.getString(getApplicationContext().getContentResolver(), Secure.ANDROID_ID);

So erhalten Sie eine UID für das Gerät. Ich glaube, ich bekomme die gleiche ID von mehreren Geräten. Sollte das möglich sein?

Die fragliche ID lautet: 9774d56d682e549c und anscheinend gibt es ein Problem mit mehreren Geräten, die diese ID zurückgeben. Http://code.google.com/p/android/issues/list?cursor=10603&updated=10603&ts=1295993403

FoamyGuy
quelle
Nachdem ich die fragliche ID nachgeschlagen und einen Thread darüber gesehen habe, bin ich mir sicher. Zuerst dachte ich, es könnte möglich sein, dass das Gerät null zurückgibt, und ich hatte es irgendwo als Standard eingegeben. Dies ist jedoch nicht der Fall. Ich weiß mit Sicherheit, dass ich auf mehreren Geräten den gleichen Wert erhalte.
FoamyGuy
1
Ich fand perfekt: stackoverflow.com/a/16929647/1318946
Pratik Butani
Verwenden Sie für Fälle, in denen es nicht eindeutig ist, diese Bibliothek, die mit Identity.getDeviceId (Kontext) geliefert wird .
Caw

Antworten:

47

In diesen Thread einchecken ,. Sie sollten jedoch vorsichtig sein, da dokumentiert ist, dass "sich beim Zurücksetzen auf die Werkseinstellungen ändern kann". Die Verwendung erfolgt auf eigenes Risiko und kann problemlos auf einem gerooteten Telefon geändert werden. Es scheint auch, als hätten einige Hersteller Probleme mit ihren Telefonen mit doppeltem Nummernfaden . Je nachdem, was Sie versuchen, würde ich dies wahrscheinlich nicht als UID verwenden.

ninjasense
quelle
19
Es ist eine Schande, dass die Implementierung von ANDROID_ID so ... lahm ist! Nach Googles Dokumentation zu urteilen, war die Absicht eine länger anhaltende ID: A 64-bit number (as a hex string) that is randomly generated on the device's first boot and should remain constant for the lifetime of the device
Jemand irgendwo
3
Laut diesem Thread- Link "gab es auch mindestens einen weit verbreiteten Fehler in einem beliebten Mobilteil eines großen Herstellers, bei dem jede Instanz dieselbe ANDROID_ID hat." Besser nicht benutzen
Muhammad Riyaz
2
Das war ab 2011 während Froyo. Es ist jetzt irrelevant.
Aubtin Samai
Was ist mit einer Gerätesicherung / -wiederherstellung oder einem Geräteklonen? Irgendeine Idee über die Chance, dieselbe ANDROID_ID zu haben? vorausgesetzt, das Gerät ist natürlich nicht gerootet.
FunkSoulBrother
39

Mit Android O ändert sich das Verhalten der ANDROID_ID. Die ANDROID_ID ist pro App und Benutzer auf dem Telefon unterschiedlich.

Entnommen aus: https://android-developers.googleblog.com/2017/04/changes-to-device-identifiers-in.html

Android ID

In O hat die Android-ID (Settings.Secure.ANDROID_ID oder SSAID) für jede App und jeden Benutzer auf dem Gerät einen anderen Wert. Entwickler, die eine Gerätekennung benötigen, sollten stattdessen eine zurücksetzbare Kennung wie die Werbe-ID verwenden, um den Benutzern mehr Kontrolle zu geben. Die Werbe-ID bietet auch eine benutzerbezogene Einstellung, um die Anzeigenverfolgung einzuschränken.

Zusätzlich in Android O:

  • Der ANDROID_ID-Wert ändert sich bei der Deinstallation / Neuinstallation des Pakets nicht, solange der Paketname und der Signaturschlüssel identisch sind. Apps können sich auf diesen Wert verlassen, um den Status bei Neuinstallationen beizubehalten.
  • Wenn eine App auf einem Gerät installiert wurde, auf dem eine frühere Version von Android ausgeführt wird, bleibt die Android-ID beim Aktualisieren des Geräts auf Android O unverändert, es sei denn, die App wird deinstalliert und neu installiert.
  • Der Android-ID-Wert ändert sich nur, wenn das Gerät auf die Werkseinstellungen zurückgesetzt wird oder wenn sich der Signaturschlüssel zwischen Deinstallations- und
    Neuinstallationsereignissen dreht .
  • Diese Änderung ist nur für Gerätehersteller erforderlich, die mit Google Play-Diensten und Werbe-ID versenden. Andere Gerätehersteller geben möglicherweise eine alternative rücksetzbare ID an oder geben weiterhin eine ANDROID-ID an.
userM1433372
quelle
Vielen Dank. Ich habe mir die Haare ausgezogen, um herauszufinden, warum ich keine Testanzeigen auf dem Telefon meiner Frau mit der von der Geräte-ID gemeldeten (md5'ed) ID erhalten habe und warum dies nicht mit dem Wert übereinstimmt, der über den Befehl adb shell settings gemeldet wurde. Ich dachte, ich würde verrückt.
ecv
15

Wenn Sie also etwas Einzigartiges für das Gerät selbst wünschen , TM.getDeviceId() sollte dies ausreichen.

Hier ist der Code, der zeigt, wie Sie die Telefonie-Manager-ID erhalten. Die von Ihnen verwendete Android-Geräte-ID kann sich in den Werkseinstellungen ändern, und auch einige Hersteller haben Probleme, eine eindeutige ID anzugeben.

TelephonyManager tm = 
        (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
String androidId = Secure.getString(this.getContentResolver(), Secure.ANDROID_ID);
Log.d("ID", "Android ID: " + androidId);
Log.d("ID", "Device ID : " + tm.getDeviceId());

Stellen Sie sicher, dass Sie die Berechtigungen für TelephonyManagerverwenden

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
Vincent Vettukal
quelle
3
Ja, die Verwendung von getDeviceId () funktioniert auch. Sie sollten jedoch sehr vorsichtig sein, da dies möglicherweise null zurückgibt. (Auf Geräten ohne 3G / Telefonmodem) Eine Lösung, die ich verwende, besteht darin, auf die Mac-Adresse des
WLANs zurückzugreifen
19
Die READ_PHONE_STATEErlaubnis zu verlangen ist schrecklich. Verwenden Sie ANDROID_IDstattdessen.
Dolmen
Ja, auf Geräten ohne 3G wird möglicherweise null zurückgegeben (viele davon sind auf dem Markt). Dann sollten Sie WLAN verwenden. Die Guid-Funktion kann auch null sein, bis Sie sie nach dem Neustart des Geräts mindestens einmal ein- und ausschalten. Und wenn kein WiFi ... ein wahrer Albtraum, auf Windows CE gab es GUID für jedes Gerät und das Leben war wunderschön.
März
Nach Tausenden von Anfragen stellt sich heraus, dass die Geräte-ID, bei der es sich um die IMEI handelt, auf gefälschten Geräten dupliziert werden kann, was keine vollständige Proof-Lösung darstellt. Ich verwende wieder getSimSerialNumber und ANDROID_ID als Fallback.
Ajibola
Android 10 (API-Level 29) fügt Einschränkungen für nicht zurücksetzbare Kennungen hinzu, die sowohl IMEI als auch Seriennummer enthalten. Bevor Sie den TM.getDeviceId()Ansatz implementieren , werfen Sie zunächst einen Blick auf die neuen Berechtigungsanforderungen für Gerätekennungen auf Android> = 10-Geräten.
Hesekiel Sebastine
6

Ich habe ein paar Dinge darüber gelesen und leider sollte man sich nicht auf die ANDROID_ID verlassen, um ein einzelnes Gerät eindeutig zu identifizieren.

Es scheint nicht in den Android-Konformitätsanforderungen durchgesetzt zu sein, und daher scheinen die Hersteller es so zu implementieren, wie sie es wünschen, einschließlich einiger, die es eher als "Modell" -ID usw. verwenden.

Beachten Sie auch, dass selbst wenn ein Hersteller einen Generator geschrieben hat, um ihn zu einer UUID zu machen (zum Beispiel), es nicht garantiert ist, dass er einen Werksreset überlebt.

Squonk
quelle
6
Ich denke, es wird garantiert NICHT das Zurücksetzen auf die Werkseinstellungen überleben, es wird irgendwo in den Dokumenten erwähnt. Und das ist der richtige Weg, um es umzusetzen.
Violette Giraffe
Wie können wir also eine GUID generieren?
IgorGanapolsky
6

Es gibt mehrere Lösungen, aber keine davon ist perfekt. Lass uns eins nach dem anderen gehen.

1. Unique Telephony Number (IMEI, MEID, ESN, IMSI)

  • Diese Lösung muss android.permission.READ_PHONE_STATE bei Ihrem Benutzer anfordern , was nach dem von Ihnen erstellten Anwendungstyp schwer zu rechtfertigen ist.

  • Darüber hinaus ist diese Lösung auf Smartphones beschränkt, da Tablets keine Telefoniedienste haben. Ein Vorteil ist, dass der Wert bis zum Zurücksetzen auf die Werkseinstellungen der Geräte erhalten bleibt.

2. MAC Address

  • Sie können auch versuchen, eine MAC-Adresse von einem Gerät mit Wi-Fi- oder Bluetooth-Hardware abzurufen. Diese Lösung wird jedoch nicht empfohlen, da nicht alle Geräte über eine Wi-Fi-Verbindung verfügen. Selbst wenn der Benutzer über eine Wi-Fi-Verbindung verfügt, muss diese aktiviert sein, um die Daten abzurufen. Andernfalls meldet der Anruf die MAC-Adresse nicht.

3. Serial Number

  • Geräte ohne Telefoniedienste wie Tablets müssen eine eindeutige Geräte-ID melden, die seit Android 2.3 Gingerbread über android.os.Build.SERIAL verfügbar ist. Einige Telefone mit Telefoniediensten können auch eine Seriennummer definieren. Da nicht alle Android-Geräte eine Seriennummer haben, ist diese Lösung nicht zuverlässig.

4. Secure Android ID

  • Beim ersten Start eines Geräts wird ein zufälliger Wert generiert und gespeichert. Dieser Wert ist über Settings.Secure.ANDROID_ID verfügbar. Es ist eine 64-Bit-Zahl, die für die Lebensdauer eines Geräts konstant bleiben sollte. ANDROID_ID scheint eine gute Wahl für eine eindeutige Gerätekennung zu sein, da sie für Smartphones und Tablets verfügbar ist.

    String androidId = Settings.Secure.getString(getContentResolver(),Settings.Secure.ANDROID_ID);
    
  • Der Wert kann sich jedoch ändern, wenn das Gerät auf die Werkseinstellungen zurückgesetzt wird. Es gibt auch einen bekannten Fehler mit einem beliebten Mobilteil eines Herstellers, bei dem jede Instanz dieselbe ANDROID_ID hat. Die Lösung ist eindeutig nicht 100% zuverlässig.

5. Use UUID

  • Da die meisten Anwendungen eine bestimmte Installation und kein physisches Gerät identifizieren müssen, ist dies eine gute Lösung, um eine eindeutige ID für einen Benutzer zu erhalten, wenn die UUID-Klasse verwendet werden soll. Die folgende Lösung wurde von Reto Meier von Google in einer Google I / O-Präsentation vorgestellt:

    private static String uniqueID = null;
    private static final String PREF_UNIQUE_ID = "PREF_UNIQUE_ID";
    public synchronized static String id(Context context) {
       if (uniqueID == null) {
           SharedPreferences sharedPrefs = context.getSharedPreferences(
                   PREF_UNIQUE_ID, Context.MODE_PRIVATE);
           uniqueID = sharedPrefs.getString(PREF_UNIQUE_ID, null);
           if (uniqueID == null) {
               uniqueID = UUID.randomUUID().toString();
               Editor editor = sharedPrefs.edit();
               editor.putString(PREF_UNIQUE_ID, uniqueID);
               editor.commit();
           }
       }    return uniqueID;
    }
    

Es ist nicht einfach, ein bestimmtes Gerät unter Android zu identifizieren. Es gibt viele gute Gründe, dies zu vermeiden. Die beste Lösung besteht wahrscheinlich darin, eine bestimmte Installation mithilfe der UUID-Lösung zu identifizieren. Kredit: Blog

Radhey
quelle
1

Listen Sie hier einfach eine alternative Lösung auf, die Werbe-ID:

https://support.google.com/googleplay/android-developer/answer/6048248?hl=en

Vom obigen Link kopiert:

Die Werbe-ID ist eine eindeutige, vom Benutzer zurücksetzbare ID für Werbung, die von Google Play-Diensten bereitgestellt wird. Es bietet Benutzern eine bessere Kontrolle und bietet Entwicklern ein einfaches Standardsystem, mit dem sie ihre Apps weiterhin monetarisieren können. Benutzer können ihre Kennung zurücksetzen oder personalisierte Anzeigen (früher als interessenbezogene Anzeigen bezeichnet) in Google Play-Apps deaktivieren.

Die Einschränkungen sind:

  1. Nur für Google Play-fähige Geräte.
  2. Datenschutz-Bestimmungen: https://support.google.com/googleplay/android-developer/answer/113469?hl=en&rd=1#privacy
Halbkreis21
quelle
Funktioniert dies für Telefone ohne Google Play (Dienste)?
Max Waterman
Dies ist keine GUID
IgorGanapolsky
0
//Fields
String myID;
int myversion = 0;


myversion = Integer.valueOf(android.os.Build.VERSION.SDK);
if (myversion < 23) {
        TelephonyManager mngr = (TelephonyManager) 
getSystemService(Context.TELEPHONY_SERVICE);
        myID= mngr.getDeviceId();
    }
    else
    {
        myID = 
Settings.Secure.getString(getApplicationContext().getContentResolver(), 
Settings.Secure.ANDROID_ID);
    }

Ja, Secure.ANDROID_ID ist für jedes Gerät eindeutig.

Boraberka
quelle