果冻豆问题 - wifiManager.getConnectionInfo().getSSID() - 额外的""

25

大家好,以下是有关Bug报告的信息。链接

问题详情

代码 - wifiManager.getConnectionInfo().getSSID()

以上代码返回当前SSID,但它会在返回的SSID周围添加额外的引号。

例如,SSID internet 返回为 "internet"

只有在使用Nexus 7设备的Jelly Bean 4.2版本中才会出现此问题。

此Bug会导致我们的应用程序出现错误,因为我们将当前SSID与我们尝试连接的SSID进行比较。

然而,代码wifiManager.getScanResults();仍然返回所有SSID,没有额外的引号。



几天前我也遇到了这个问题。不确定是问题还是有意为之。希望他们不会“修复”它,因为那将破坏很多代码! - Oleksandr Kravchuk
三星Galaxy Note2在Android 4.3更新后出现了同样的问题。在Note2的4.1.2版本中没有引号。 - faizal
它也发生在Android 4.4.2上。 - Utsav Gupta
5个回答

32

根据http://developer.android.com/reference/android/net/wifi/WifiInfo.html#getSSID()文档,此为正常行为,不是 bug。

所谓的 bug 显然出现在 4.2 版本之前的设备上,因为它们没有使用 "" 将其括起来返回。

Aiden 的方法在当前 Android 混乱状态下看起来很好。但从理论上讲,只需要

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

9
这个正则表达式非常简洁:
String ssid = wi.getSSID().replaceAll("^\"(.*)\"$", "$1");

仅供参考

编辑 1(针对评论中的问题):

OP描述的问题是,在某些设备上,getSSID() 返回的SSID被包含在""中,而在其他设备上则不是。例如,在某些设备上,SSID为"MY_WIFI",而在其他设备上,则为MY_WIFI - 或者用Java代码来说:"\"MY_WIFI\"""MY_WIFI"

为了统一这两个结果,我建议在开头和结尾删除" - 只有在那里,因为"是SSID内的合法字符。在上面的正则表达式中:

^ 表示从开头
$ 表示在结尾处
\" 表示"(已转义)
.* 表示任意数量的字符
(...) 表示一个捕获组,可以通过$1引用

所以整个表达式的意思是:将"<something>"替换为<something>,其中$1=<something>。如果没有在末尾/开头有",则正则表达式不匹配,不进行任何替换。

有关更多详细信息,请参见Java Pattern类


这很不错,但是如果您能添加一些解释,那将有助于我们理解它的作用。同时,原帖并没有明确的问题。 - msysmilu

6

目前我是这样解决这个问题的,虽然不太好但可以解决问题。

 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

有两种非常简单的变体:

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

并且

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

2
请小心处理这些内容,因为有效的SSID可能会在其内部包含引号,例如:"my "freeking" wifi"。另外第二个变量很好,但是你需要检查我回答中提到的内容,以确保不会弄乱其他任何东西。 - Aiden Fry
@AidenFry 我认为正则表达式不会影响你提供的示例,因为它只检查起始字符和结束字符(使用^和$)。根据文档,该函数只返回带引号或十六进制数字的字符串,因此它仅消除函数包围的引号,但会保留原始字符串的引号。正则表达式的问题在于引号之后/之前不应该有空格。例如 ("^\"|\"$") - Dante Y
这很整洁,但如果您能添加一些解释,那将有助于我们理解它的功能。此外,原帖并没有明确的问题。 - msysmilu

0

遇到了同样的问题!使用这种向后兼容的技术:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接