【问题标题】:Android switch AP programmaticallyAndroid以编程方式切换AP
【发布时间】:2016-10-05 11:13:53
【问题描述】:

我需要检查所有可用的 wifi,然后连接到我当前连接的另一个。

示例 - 设备连接到 AP01

    private void switchAP(String  ssid, String  pass)) {

        WifiConfiguration conf = new WifiConfiguration();
        conf.SSID               = "\"" + ssid + "\"";
        if(!TextUtils.isEmpty(pass))
            conf.wepKeys[0]     = "\"" + pass + "\"";
        conf.preSharedKey       = "\"" + pass + "\"";
        conf.wepTxKeyIndex      = 0;
        conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
        conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
        conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);

        WifiManager wifiManager = (WifiManager) SyncActivity.this.getSystemService(Context.WIFI_SERVICE);
        wifiManager.addNetwork(conf);

//        List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
        List<ScanResult> list = wifiManager.getScanResults();
        for (ScanResult i : list) {

            Log.w(TAG, "WIFI LIST > " + i.SSID);

            if (i.SSID != null && i.SSID.equals(ssid)) {
                wifiManager.disconnect();
                wifiManager.enableNetwork(i.networkId, true); //>i.networkId Does not work - only in List<WifiConfiguration>…
                wifiManager.reconnect();
                logMsg("WiFi connection switched to " + ssid);
                break;
            }

        }
    }

然后我打电话

switchAP("AP02", ""));

我无法连接,因为当我使用 ScanResult 而不是 WifiConfiguration 时,这个 i.networkId 似乎不起作用。

有人遇到过这个吗? 谢谢大家。

我不使用 List 的原因是因为该设备之前从未连接到此 SSOD。 而 List 只返回所有预览连接的网络。

【问题讨论】:

    标签: java android android-studio android-wifi wifimanager


    【解决方案1】:

    您需要使用WifiConfiguration.Status.ENABLED

    下面为您编写了一个示例代码:

    public void WIFI_CONNECT_WIFI (String ssid, String password)
    {
        WifiManager wifi_manager = (WifiManager)getSystemService(Context.WIFI_SERVICE);
    
        WifiConfiguration wifi_configuration = new WifiConfiguration();
        wifi_configuration.SSID              = String.format("\"%s\"", ssid);
        wifi_configuration.preSharedKey      = String.format("\"%s\"", password);
    
    
        if (WIFI_NETWORK_EXIST (wifi_configuration) == true) {
            wifi_configuration.status   = WifiConfiguration.Status.ENABLED;
            wifi_configuration.priority = 40;
        }
        else {
            boolean result = wifi_manager.getConfiguredNetworks().add(wifi_configuration);
            if (result == false) {
                return;
            }
            wifi_configuration.status    = WifiConfiguration.Status.ENABLED;
            wifi_configuration.priority  = 40;
            wifi_configuration.networkId = wifi_manager.addNetwork(wifi_configuration);
        }
    
        wifi_manager.enableNetwork(wifi_configuration.networkId, true);
        wifi_manager.saveConfiguration();
    }
    

    -

    public boolean WIFI_NETWORK_EXIST (WifiConfiguration wifi_configuration)
    {
        WifiManager wifi_manager = (WifiManager)getSystemService(Context.WIFI_SERVICE);
    
        for (WifiConfiguration config : wifi_manager.getConfiguredNetworks()) {
    
            if (wifi_configuration.SSID.equals(config.SSID)) {
                wifi_configuration.networkId = config.networkId;
                return true;
            }
        }
        return false;
    }
    

    顺便说一句,如果有可能使 SSID 为 null,那么当 SSID 带有 null 值时,你的 if 比较总是会崩溃,因为你试图使用 null 值的成员函数。

     if (i.SSID != null && i.SSID.equals(ssid)) {
         // ...
     }
    

    预期的堆栈跟踪是:“bla bla bla 试图在空值上使用 String.equals(String)。”

    你应该做一个内部或不同的 if 在 null 比较之后进行 equals(...) 比较。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-17
      • 2011-09-27
      • 2012-02-01
      • 2019-05-07
      • 1970-01-01
      相关资源
      最近更新 更多