Android переключает точку доступа программно

#java #android #android-studio #android-wifi #wifimanager

#java #Android #android-studio #android-wifi #wifimanager

Вопрос:

Мне нужно проверить весь доступный Wi-Fi, а затем подключиться к другому, к которому я сейчас подключен.

Пример — устройство подключено к 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 amp;amp; 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", ""));
  

я не могу подключиться, потому что этот i.networkId, похоже, не работает, когда я использую ScanResult, а не WifiConfiguration.

Кто-нибудь сталкивался с этим? Спасибо, ребята.

Причина, по которой я не использую List, заключается в том, что устройство никогда раньше не подключалось к этому SSOD. и список возвращает только все предварительные просмотры, подключенные к сети.

Ответ №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, вы всегда будете зависать при сравнении if, когда SSID приходит с нулевым значением, поскольку вы пытаетесь использовать функцию-член с нулевым значением.

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

ожидаемая трассировка стека: «бла-бла-бла пытается использовать String.equals (строка) для нулевого значения».

Вы должны выполнить внутреннее или другое if после сравнения null для сравнения equals(…).