getMacAddress() liefert null zurück

  • Antworten:5
  • OffenNicht stickyBentwortet

06.02.2013 15:26:26

Hi Leute,
ich möchte in meiner App gerade die Funktion implementieren, dass ein Android-Gerät eindeutig
identifiziert werden kann. Ich habe mich jetzt für die Mac-Adresse entschieden. Leider
liefert die Methode dafür auf dem Emulator "null" zurück und auf meinem Handy (4.0.3)
stürzt sie dabei komplett ab.

Folgender Code:

Aufruf in der MainActivity:
1public void calculateDeviceRating() {
2 int devID;
3 WifiManager man = (WifiManager) getSystemService(Context.WIFI_SERVICE);
4 WifiInfo wi = man.getConnectionInfo();
5
6 DeviceRatingObject devR = new DeviceRatingObject();
7 devR.fillObject(wi);
8
9 ...
10 }

Zielmethode ( in Klasse DeviceRatingObject)
1private int getEncodedMAC(WifiInfo wi){
2 int result;
3 String mac = wi.getMacAddress();
4 // // Beim Emulator mac ist hier bereits null. Auf dem Handy stürzt es wohl an dieser Stelle ab, denke ich.
5 if (mac == null || mac == "") {
6 mac = "000000000000";
7 }
8 result = encodeMAC(mac);
9 devID = result;
10 return result;
11 }

Die benötigte Permission "ACCESS_WIFI_STATE" ist gesetzt.

Hat jemand eine Idee?

PS: Anfangs wollte ich die IMEI für die Identifikation benutzen, habe davon aber wieder abgelassen,
da hiermit meiner Meinung nach erstens mehr Schindluder betrieben werden kann, und zweitens
weil einfache Tablets über keine IMEI verfügen.

— geändert am 06.02.2013 15:31:20

06.02.2013 23:36:04

Jau, isses.
Beim Emulator weiß ich es nicht. Er hat aber Internetzugriff.

Beim Handy stürzt die App ab, wenn WLAN an ist, und wenn
es aus ist, hängt sie in einer Endlosschleife.
Es ist aber schon ziemlich ärgerlich, wenn es ohne aktiviertes
WLAN nicht funzt...
gibt es noch eine andere Möglichkeit, eine eindeutige und
permanente "ID" aus dem Gerät herauszukitzeln?

Der letzte Notnagel wäre wohl, eine ID zu generieren und
irgendwo auf dem Gerät abzuspeichern. Die wäre vielleicht
nicht unbedingt einzigartig, aber wenigstens persistent.
Dafür wird dann aber auch noch die Permission für den
Schreibzugriff auf den Speicher benötigt, was ich eigentlich
vermeiden wollte. Mich nerven solche Apps nämlich, die
unnachvollziehbarerweise auf fast alle Handyfunktionen
Zugriff haben wollen.

— geändert am 06.02.2013 23:36:49

07.02.2013 07:51:35

Warum machst Du es nicht beispielsweise so :


Codebeispiel:
/* This will generate a single Type 4 pseudo random UUID */
public UUID genRandomUID() {

return UUID.randomUUID();
}

/** a more sophisticated variant then the above, putting the one time UUID into shared *Preference
*Thanks to Reto Meier for this convienience method! **/

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;
}

Du generierst eine unique ID und speicherst diese in einer Shared Preference.

lg Voss - Ach ja und noch was, die AndroidPIT-Regeln ლ(╹◡╹ლ) Android Security

07.02.2013 12:30:03

Danke, das sieht schonmal sehr nützlich aus.
Auch wenn für mich aus dem Text hervorgeht, dass es keine perfekte
Möglichkeit zur Identifikation gibt und man am besten mehrere
parallel verwenden sollte...
Vielleicht stelle ich das ganze Prinzip auch auf Registration um,
was mir aber ein wenig sauer aufstößt, da es wesentlich aufwendiger
ist und die Software eigentlich nur ein Prototyp und ein Machbarkeits-
nachweis für etwas werden soll.


@Jörg Voss: Deine Antwort hab ich leider erst nach meiner
Antwort gesehen; ich schaus mir direkt mal an, danke ;).

EDIT:
@Jörg: Die Lösung funzt einwandfrei, herzlichen Dank!

— geändert am 07.02.2013 15:29:49