首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何区分开放和安全的WiFi网络,而不是通过编程方式连接到它?

如何区分开放和安全的WiFi网络,而不是通过编程方式连接到它?
EN

Stack Overflow用户
提问于 2014-09-04 18:10:21
回答 3查看 3K关注 0票数 2

我正在尝试开发一个小应用程序,我可以扫描和连接到WiFi热点从扫描的网络列表。但对于开放和安全网络,我都写了一个密码提示,如果网络是开放的(通过事先知道),我不会输入密码,并将文本保留为空,然后输入,然后连接。谁能告诉我如何以编程方式识别开放和安全的wifi,这样我就不会要求开放网络的密码,并让它直接连接。(我将来不知道哪个是开放的,哪个是安全的网络,所以我们需要根据SSID或其他东西来识别开放和安全的网络)

EN

回答 3

Stack Overflow用户

发布于 2014-09-04 18:19:58

这里有用于标识网络类型的capabilities字段

代码语言:javascript
复制
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
            }
        }
    }
票数 7
EN

Stack Overflow用户

发布于 2015-07-30 12:38:15

今天我在寻找同样问题的答案,但这里和其他类似问题中指出的解决方案让我有点不安全。如果将来创建新的安全模式呢?

现在,我更喜欢这样做:

代码语言:javascript
复制
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;
}

在此之后,您可以使用未知的返回值执行您想要的操作。

如果以后创建了新的安全模式,您将不需要更改testAgainstSecurityModes方法。

票数 0
EN

Stack Overflow用户

发布于 2020-02-28 13:10:49

使用此筛选器功能来区分。

代码语言:javascript
复制
private boolean isProtectedNetwork(String capability){

       return (capability.contains("WPA") || 
               capability.contains("WEP") || 
               capability.contains("WPS")
              );
}

所以当你掌握了所有的列表。只需迭代它并将它们添加到两个不同的列表中。(一个用于开放网络,一个用于安全网络)。

这里是这方面的代码

代码语言:javascript
复制
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上找到更多相关的解决方案

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25662761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档