Phone ID Icon

Android und eine einzigartige Telefon ID

Im Zuge einer eigenen Implementierung einer Online-Highscore zunächst für Le Dots und anschließend warscheinlich für Codename Rubn hab ich mich mit dem Thema einzigartiger Telefonerkennung auseinander gesetzt um meine Datenbank ein wenig zu sichern und dem Nutzer die Möglichkeit zu geben eine Art Benutzer-Konto zu besitzen. Die einfachste Option wäre natürlich die IMEI zu nutzen, jedoch muss man hierzu die READ_PHONE_STATE-Berechtigung besitzen, welcher ich persönlich eher ungern zustimme bei Apps im Market, bei denen ich den Sinn nicht erkenne. Außerdem besitzen alle Geräte ohne GSM-Modul auch keine IMEI-Nummer, was bei der steigenden Anzahl von Tablets nicht selten ist.

Eine gute Option bietet Settings.Secure.ANDROID_ID, jedoch wird dieser Wert nicht immer gesetzt und gibt dann NULL zurück. Dieser Wert wird beim ersten Start  und beim Factory-Reset neu erstellt, bleibt aber in der Zeit dazwischen persistent. Außerdem werden keine speziellen Berechtigungen benötigt, um diesen Wert zu benutzen.

Für die Geräte bei denen die ANDROID_ID gleich NULL ist bietet es sich an aus alternativen System-Variablen eine ID zu entwickeln. Hierfür bieten sich die android.os.Build-Variabeln, die sich nur bei einem Firmware-Update oder dem Flashen eines Roms ändern.

Welche Variabeln man nimmt, hängt davon ab, gegen welche Android-Version man mindestens kompiliert aber auch von den persönlichen Präferenzen.

Um den ganzen ein wenig Code folgen zu lassen hier meine Implementation einer Funktion die eine ID erzeugt.

public String createUniqueUserId() {
String uid=Secure.getString(mContext.getContentResolver(), Secure.ANDROID_ID);
if(uid==null){
Display display = ((WindowManager) mContext
.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
uid = ""+shrinkInfo(Build.BOARD) + shrinkInfo(Build.BRAND)
+ shrinkInfo(Build.CPU_ABI) + shrinkInfo(Build.DEVICE)
+ shrinkInfo(Build.MANUFACTURER) + shrinkInfo(Build.DISPLAY)
+ shrinkInfo(Build.PRODUCT) + shrinkInfo(""+display.getWidth() +display.getHeight());
}
return uid;
}
private String shrinkInfo(String code) {
int t=Math.abs(code.hashCode()+code.length()) % 99;
if(t<10) return "0"+t; else return ""+t; }

Die Funktion createUniqueUserId() wird aufgerufen und überprüft ob eine Android ID gesetzt ist. Wenn nicht erzeugt sie aus Build-Variabeln und Bildschirm Dimensionen einen eigenen 16-Zeichen langen String. Am Ende gibt sie diesen String oder die Android ID zurück. Es sei angemerkt, dass die alternativ Methode den Fehler in sich birgt, dass wenn man 2 identische Telefone mit der selben Firmware-Version hat, dass die selbe ID erzeugt wird und somit nur eine gewisses Level von Einzigartigkeit geboten werden kann. Man kann je nach Bedarf die Funktion auch noch weiter aufwerten mit anderen Hashes zum Beispiel aus der MAC-Addresse des WIFI- und/oder Bluetooth-Modules(wenn vorhanden), wofür aber weitere Berechtigungen(android.permission.ACCESS_WIFI_STATE und android.permission.BLUETOOTH) nötig wären. Man muss sich hier dann entscheiden, wie viele Berechtigungen man rechtfertigen kann und will.

Hier noch ein alternativ Code, der letzt genannte Optionen mit einbezieht.


public String createUniqueUserId() {
String uid=Secure.getString(mContext.getContentResolver(), Secure.ANDROID_ID);
if(uid==null){
Display display = ((WindowManager) mContext
.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
uid = ""+shrinkInfo(Build.BOARD) + shrinkInfo(Build.BRAND)
+ shrinkInfo(Build.CPU_ABI) + shrinkInfo((BluetoothAdapter.getDefaultAdapter()).getAddress())
+ shrinkInfo(Build.MANUFACTURER) + shrinkInfo(Build.DISPLAY)
+ shrinkInfo(Build.PRODUCT) + shrinkInfo(((WifiManager)getSystemService(Context.WIFI_SERVICE))
.getConnectionInfo().getMacAddress());
}
return uid;
}
private String shrinkInfo(String code) {
int t=Math.abs(code.hashCode()+code.length()) % 99;
if(t<10) return "0"+t; else return ""+t; }

Es gibt noch genug andere Lösungsvorschläge da draußen im weiten Netz, aber für die meisten Zwecke wird wohl diese Ansätze hier vollkommen ausreichen oder zumindest ein wenig den Weg weisen.

 

MFG m0keu.

Published by

Le m0keu

Developer of Drop Dots, an Android App available on Google Play!

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>