如何区分开放和安全的WiFi网络,而无需在Android中以编程方式连接到它?

时间:2014-09-04 10:10:21

标签: android android-wifi ssid

我正在尝试开发一个小应用程序,我可以扫描并连接到扫描的网络列表中的WiFi热点。但对于Open和Secure网络,我都写了一个密码提示,如果网络是打开的(事先知道它),我不输入密码并保持文本空白然后输入然后连接。任何人都可以告诉如何识别编程开放和安全的无线网络,以便我不会要求开放网络的密码,让它直接连接。请帮忙。 (我不知道哪个是Open,哪个是未来的安全网络,所以我们需要从SSID或其他东西识别开放和安全的网络)

3 个答案:

答案 0 :(得分: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
            }
        }
    }

答案 1 :(得分: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方法。

答案 2 :(得分:0)

使用此过滤器功能进行区分。

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

上找到更多相关的解决方案