2012-11-26 9 views
24

Hallo alle Bug-Berichterstattung zu Ihrer Information. linkJelly Bean Problem - wifiManager.getConnectionInfo(). GetSSID() - extra ""

Problem Details:

Der Kodex-wifiManager.getConnectionInfo().getSSID()

Der obige Code die aktuelle SSID zurückkehrt, wird die aktuelle SSID mit zusätzlichen Angeboten um es zurück.

Für z. Die SSID internet wird als "internet" zurückgegeben.

Dies ist nur auf Jelly Bean gesehen 4.2 Gerät Nexus mit 7.

Dieser Fehler Fehler in unserer App verursacht, wie wir die aktuelle SSID mit der SSID vergleichen, die wir zu verbinden versuchen.

Der Code wifiManager.getScanResults(); gibt jedoch immer noch alle SSIDs ohne zusätzliche Anführungszeichen zurück.


+0

Yeap, konfrontiert dieses Problem vor ein paar Tagen. Nicht sicher, ob es sich um ein Problem handelt oder ob es mit Absicht entwickelt wurde. Hoffe, sie werden es nicht "reparieren", da es viel Code kaputt macht! –

+0

das gleiche Problem mit Android 4.3 Update auf Samsung Galaxy Note2. In der Version 4.1.2 auf der Note2 gab es keine Anführungszeichen. – faizal

+0

Es passiert auch mit Android 4.4.2 –

Antwort

30

dies ist kein Fehler und Verhalten ist korrekt gemäß Dokumentation bei http://developer.android.com/reference/android/net/wifi/WifiInfo.html#getSSID()

Die so genannte Bug anscheinend war in vor 4.2 Geräten, weil sie es nicht mit "" Gehäuse zurückgegeben haben.

Aiden-Methode sieht gut aus in der aktuellen Verwirrung von Android verlassen. Allerdings nur, erfordern

if (ssid.startsWith("\"") && ssid.endsWith("\"")){ 
      ssid = ssid.substring(1, ssid.length()-1); 
} 
6

Für die mittlere Zeit ist das, wie ich es herum komme, obwohl es nicht großartig ist, wird es das Problem beheben.

public String removeQuotationsInCurrentSSIDForJellyBean(String ssid){ 
    int deviceVersion= Build.VERSION.SDK_INT; 

    if (deviceVersion >= 17){ 
     if (ssid.startsWith("\"") && ssid.endsWith("\"")){ 
      ssid = ssid.substring(1, ssid.length()-1); 
     } 
    } 

    return ssid; 

} 
4

Zwei sehr einfache Varianten:

string = string.replaceAll("^\" | \"$", ""); 

und

string = string.substring(1, string.length() - 1); 
+1

seien Sie vorsichtig mit diesen, da es für gültige SSIDs möglich ist, Zitate in ihnen zu haben, dh. "mein" freeking "wifi". Auch die zweite Variante ist großartig, aber Sie brauchen den Check, der in meiner Antwort erwähnt wird, um sicherzustellen, dass Sie nichts anderes vermasseln. –

+0

@AidenFry Ich glaube nicht, dass die Regex das von Ihnen bereitgestellte Beispiel beeinflussen würde, da es nur das Startzeichen und das Endzeichen (mit^und $) überprüft. Die Funktion würde String nur mit Anführungszeichen oder Hexadezimalziffern entsprechend dem Dokument zurückgeben, so dass nur die durch die Funktion gerundeten Anführungszeichen eliminiert werden, aber die Anführungszeichen des ursprünglichen String beibehalten würden. Das Problem mit der Regex ist, dass sie nicht ** Leerzeichen ** vor/nach den Anführungszeichen haben sollte. z.B. '("^\ "| \" $ ")' –

+0

Es ist ordentlich, aber es würde uns helfen zu verstehen, was es tut, wenn Sie einige Erklärungen hinzufügen würden. Das OP hat auch keine klare Frage. – msysmilu

8

würde theoritically korrekt zu sein Dieser reguläre Ausdruck ist recht ordentlich:

bearbeiten ° 1 (im Kommentar als pro Frage) für die Noten

String ssid = wi.getSSID().replaceAll("^\"(.*)\"$", "$1"); 

Nur :

Das Problem, dass OP beschreibt, ist, dass auf einigen Geräten die SSID von getSSID() umschlossen ist Ed in "", während es nicht auf anderen Geräten ist. Z.B. Auf einigen Geräten ist die SSID "MY_WIFI" und auf anderen ist es MY_WIFI - oder in Java-Code gesprochen: "\"MY_WIFI\"" und "MY_WIFI".

Um beide Ergebnisse zu vereinheitlichen, habe ich vorgeschlagen, die " am Anfang und Ende zu entfernen - nur dort, weil " ein legales Zeichen innerhalb der SSID ist.In dem regulären Ausdruck oben

^ bedeutet, von Anfang
$ Mittel am Ende
\" bedeutet " (entkommen)
.* bedeutet, eine beliebige Anzahl von Zeichen
(...) eine Erfassungsgruppe bedeutet, die durch $1 bezeichnet werden kann

Also der ganze Ausdruck bedeutet: ersetzen "<something>" durch <something> wo $1 = <something>. Wenn am Ende/Anfang " nicht vorhanden ist, stimmt der reguläre Ausdruck nicht überein und nichts wird ersetzt.

Siehe Java Pattern class für weitere Details.

+0

Es * ist * ordentlich, aber, es würde uns helfen, zu verstehen, was es tut, wenn Sie einige Erklärungen hinzufügen würden. Das OP hat auch keine klare Frage. – msysmilu

0

Konfrontiert das gleiche Problem! Verwendet diese Technik, die rückwärts kompatibel:

if (suppliedSSID.equals(connectionInfo.getSSID()) || ("\"" + suppliedSSID + "\"").equals(connectionInfo.getSSID()) { DO SOMETHING }