我正在尝试开发一个小应用程序,我可以在其中从扫描的网络列表中扫描并连接到 WiFi 热点。但是对于开放网络和安全网络,我都写了一个密码提示,如果网络是开放的(通过事先知道),我不输入密码并将文本保持为空白并输入然后连接。谁能告诉如何以编程方式识别开放和安全的wifi,这样我就不会要求开放网络的密码并让它直接连接。(我以后不知道哪个是开放的,哪个是安全的网络,所以我们需要从 SSID 或其他东西中识别开放和安全的网络)
问问题
3117 次
3 回答
7
在这里,您有用于识别网络类型的功能字段
WifiManager wifimanger = (WifiManager) getSystemService(Context.WIFI_SERVICE);
List<ScanResult> networkList = wifimanger.getScanResults();
if (networkList != null) {
for (ScanResult network : networkList) {
String capabilities = network.capabilities;
Log.w(TAG, network.SSID + " capabilities : " + capabilities);
if (capabilities.toUpperCase().contains("WEP")) {
// WEP Network
} else if (capabilities.toUpperCase().contains("WPA")
|| capabilities.toUpperCase().contains("WPA2")) {
// WPA or WPA2 Network
} else {
// Open Network
}
}
}
于 2014-09-04T10:19:58.087 回答
1
使用此过滤器功能进行区分。
private boolean isProtectedNetwork(String capability){
return (capability.contains("WPA") ||
capability.contains("WEP") ||
capability.contains("WPS")
);
}
因此,当您拥有所有列表时。只需遍历它并将它们添加到两个不同的列表中。(一个用于开放网络,一个用于安全网络)。
这是代码
private void filterScan(List<ScanResult> allScanResults){
List<ScanResult>openScans = new ArrayList<ScanResult>();
List<ScanResult>closeScans = new ArrayList<ScanResult>();
for(ScanResult result : allScanResults)
{
if(!isProtectedNetwork(result.capabilities))
{
openScans.add(result);
}
else {
closeScans.add(result);
}
}
}
有用的资源:
您可以在My Github Repository上找到更多相关解决方案
于 2020-02-28T05:10:48.513 回答
0
今天我正在寻找同一个问题的答案,但这里和其他类似问题中指出的解决方案让我有点不安全。如果将来创建一种新的安全模式?
现在我更喜欢做类似的事情:
public WifiSecurityMode testAgainstSecurityModes(WifiSecurityMode... securities) {
for (WifiSecurityMode security : securities) {
if (this.capabilities.toUpperCase().contains(security.getName().toUpperCase())) {
return security;
}
}
return WifiSecurityMode.UNKNOWN;
}
public enum WifiSecurityMode {
WEP("WEP"), WPA("WPA"), WPA2("WPA2"),//....
UNKNOWN ("UNKNOWN");
private String name;
WifiSecurityMode (String name){
this.name = name;
}
public String getName() {
return name;
}
}
//to use it: (WifiInfo are just a class I create to encapsulate the values in a ScanResult object)
public List<WifiInfo> getOpenWifis() {
List<WifiInfo> open = new ArrayList<>();
for (WifiInfo w : wifiInfoList) {
if (w.testAgainstSecurityModes(WifiSecurityMode.WEP, WifiSecurityMode.WPA, WifiSecurityMode.WPA2).equals(WifiSecurityMode.UNKNOWN)) {
open.add(w);
}
}
return open;
}
之后,您可以使用 UNKNOWN 返回做您想做的事。
如果将来创建新的安全模式,则无需更改 testAgainstSecurityModes 方法。
于 2015-07-30T04:38:15.267 回答