【问题标题】:How to differentiate Open and Secure WiFi networks without connecting to it in Android programmatically?如何在不以编程方式在 Android 中连接的情况下区分开放和安全 WiFi 网络?
【发布时间】:2014-09-04 10:10:21
【问题描述】:

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

【问题讨论】:

标签: android android-wifi ssid


【解决方案1】:

这里有用于识别网络类型的功能字段

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
            }
        }
    }

【讨论】:

  • capabilities.toUpperCase().contains("WPA") 之后,|| capabilities.toUpperCase().contains("WPA2") 是多余的。
【解决方案2】:

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

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找到更多相关解决方案

【讨论】:

    【解决方案3】:

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

    现在我更喜欢这样做:

    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 方法。

    【讨论】:

      猜你喜欢
      • 2016-07-18
      • 1970-01-01
      • 2023-01-27
      • 1970-01-01
      • 2013-04-30
      • 1970-01-01
      • 2020-12-26
      • 1970-01-01
      • 2016-05-02
      相关资源
      最近更新 更多