Android Gerät eindeutig identifizieren
Für einen App Entwickler stellen sich bei der Konzeption für Apps bereits einige wichtige Fragen. Eine davon: Ist es möglich ein Android Gerät eindeutig zu identifizieren?
Android Gerät eindeutig identifizieren
Die Frage die man sich stellen sollte: Warum benötige ich eine eindeutige Identifizierung? Die Antwort ist recht einfach. Mit diese könnte man sich den Login ersparen. Einen Login braucht man immer dann, wenn die App in irgend einer Art und Weise Daten außerhalb des Gerät speichern will. Man denke hier an einfache Cloud Dienste bis hin zu Spiele die Ihre Highscorelisten auf einem Server speichern. Für einfache Anwendungen wäre es für die Usability der App sehr hinderlich sich erst jedes mal mit eMail und Passwort anzumelden.
Problem
Das Problem ist, dass es viele Möglichkeiten gibt ein Gerät eindeutig zu identifizieren, jedoch man nicht wissen kann, welche davon auch für das aktuelle Gerät die beste Lösung ist. Tatsächlich ist es sogar so, dass durch die große Anzahl unterschiedlicher Hardware man keine dieser Lösungen als allgemein gültig bezeichnen kann.
- ANDROID_ID
Die Android ID erhält man über Settings.Secure.ANDROID_ID. Das ist eine eindeutige Nummer die das Android Gerät beim ersten einschalten generiert. Das Problem: es ist nicht garantiert, dass es diese Nummer vor Android 2.2 gibt, außerdem kann man diese bei einem gerootetem Gerät ändern. - Seriennummer
Kann mit android.os.Build.SERIAL aufgerufen werden. Jedoch erst seit Android 2.3. - MAC Adresse
Die MAC Adresse ist eine gute Idee, da diese für jede Netzwerkschnittstelle eindeutig sein muss. Diese kann man sowohl für die WiFi als auch für die Bluetooth Schnittstelle abfragen. Einziger Nachteil: es kann vorkommen, dass ein Gerät keins von beiden besitzt, oder dass die Funktion der Schnittstelle vom Benutzer über Android deaktiviert wurde.
Wie man hier sieht tut man sich schwer hier eine universal eindeutige Lösung zu finden. Es gibt aber einen kleinen Trick!
Lösung
Die Lösung ist, wir erstellen uns selber eine eindeutige Nummer. Das Ganze identifiziert dann nicht das Android Gerät, sondern die Installation am Android Gerät. Dies ist für uns Entwickler natürlich die viel bessere Lösung.
public class Installation { private static String sID = null; private static final String INSTALLATION = "INSTALLATION"; public synchronized static String id(Context context) { if (sID == null) { File installation = new File(context.getFilesDir(), INSTALLATION); try { if (!installation.exists()) writeInstallationFile(installation); sID = readInstallationFile(installation); } catch (Exception e) { throw new RuntimeException(e); } } return sID; } private static String readInstallationFile(File installation) throws IOException { RandomAccessFile f = new RandomAccessFile(installation, "r"); byte[] bytes = new byte[(int) f.length()]; f.readFully(bytes); f.close(); return new String(bytes); } private static void writeInstallationFile(File installation) throws IOException { FileOutputStream out = new FileOutputStream(installation); String id = UUID.randomUUID().toString(); out.write(id.getBytes()); out.close(); } }
In dieser Installation Klasse gibt es eine statische ID Variable die über die beiden Funktionen entweder geschrieben, oder ausgelesen wird. Je nachdem ob die Datei existiert oder nicht, sollte also bei der erstmaligen Installation erstellt und dann nur noch ausgelesen werden. Und genau diese Eigenschaft suchen wir!
Dieser Code ist vom Android-Developers Blog und sollte DIE Lösung für das Problem sein, denn auch auf zB. stackoverflow ist dieses Thema heiß diskutiert und bringt auch keine eindeutige Lösung (aus meiner Sicht).
Ich hoffe dieser Artikel hilft, mir hat das bei der Konzeption meiner App geholfen.
Super Artikel, vielen Dank, wenn ich das einmal brauche kann ich darauf zurückgreifen.
Eine kleine Frage: kann man auch ev. die Google Email Adresse herausfinden?
lg
Alexander Predl
Hallo!
Gibt es eine Möglichkeit, per php oder Java, die IMEI eines Android-Smartphone/-Tablets auszulesen?
ja: android.telephony.TelephonyManager.getDeviceId() die Rechte aber nicht vergessen:
Danke für den Artikel. Ich werde alle Tipps berücksichtigen, die Sie in diesem Artikel erwähnt haben.
Ich frag mich ob mit einer kopierten weitergegebenen apk Datei,mit diesem code, eindeutigkeit erreicht werden kann? Und wenn ja ,why?