Принудительно подключить приложение Android к определенной сети WiFi - PullRequest
0 голосов
/ 02 сентября 2018

Я создаю приложение, которое подключается к определенной сети Wi-Fi, у которой нет доступа к Интернету, Я добавил конфигурацию сети через приложение (не через настройки), чтобы иметь возможность включить / отключить эту сеть.

Приложение работает следующим образом:

1 - пользователь нажимает кнопку.

2-Я проверяю, включен ли WiFi, если нет - включаю. Кроме того, если телефон уже подключен к сети WiFi, я отключаю его от этой сети и подключаюсь к своей (что работает нормально).

3-я подключаюсь к сети следующими способами (после включения WiFi):

mWifiManager.enableNetwork(networkId, true);//I have the network ID from the list of configured networks.
mWifiManager.reconnect();

Но, похоже, это не работает, если WiFi был изначально отключен, WiFi включается, но не всегда подключается к моей сети, иногда он подключается к другим настроенным сетям, если доступно.

Я пытался дать высокий приоритет моей сети (выше, чем во всех других настроенных сетях), но это не имело никакого значения.

Я пытался также включить сеть до включения WiFi, но она не работала.

Я попытался добавить mWifiManager.disconnect (); но без изменений.

mWifiManager.disonnect();
mWifiManager.enableNetwork(networkId, true);
mWifiManager.reconnect();

Итак, у меня есть несколько вопросов:

Q1-Почему это работает, когда вы уже подключены к сети WiFi, но не, если WiFi отключен?

Q2-Есть ли какой-нибудь рабочий способ заставить приложение подключиться к определенной сети? (Я работаю над Android 7.0 API 24).

Вот мой код:

int mID;
String mSSID;
String mPASSWORD;
public void connectToWiFi(String ssid, String key) {
    mSSID = ssid;
    mPASSWORD = key;
    if (!mWifiManager.isWifiEnabled()) {
        WifiUtils.withContext(mContext).enableWifi(this::enableResult);
        //Also tried 
       // boolean wifiEnabled = mWifiManager.setWifiEnabled(true);
      return;
    }
    connectToNetwork();
}

private void enableResult(boolean b) { //This is to make sure WiFi has been enabled successfully
    Log.w(TAG, "enableResult:" + b);

    if (b) {
        connectToNetwork();
    }
}

private void connectToNetwork() {
    mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);// also tried to store the id in shared prefs and get it back here (did not work for me)
    mID = getExistingNetworkId(mSSID);
    if (mID == -1) {//Network has not been configured yet, so I add it
        mID = addNetworkToConfiguration();
        MyApplication.getInstance().getShared().setNetowrkID(mID);// store the id in shred prefs 
        mWifiManager.saveConfiguration();
    }
    boolean disconnect = mWifiManager.disconnect();
    boolean result = mWifiManager.enableNetwork(mID, true);
    boolean reconnect = mWifiManager.reconnect();
}

private int addNetworkToConfiguration() {
    WifiConfiguration config = new WifiConfiguration();
    config.SSID = quoted(mSSID);
    config.status = WifiConfiguration.Status.ENABLED;
    config.preSharedKey = quoted(mPASSWORD);
    config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
    config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
    config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
    config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
    config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
    config.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
    config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
    assignHighestPriority(config);
    return mWifiManager.addNetwork(config);
 }

 private int getExistingNetworkId(String SSID) {
    mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
    List<WifiConfiguration> configuredNetworks = mWifiManager.getConfiguredNetworks();
    if (configuredNetworks != null) {
        for (WifiConfiguration existingConfig : configuredNetworks) {
            if (areEqual(trimQuotes(existingConfig.SSID), trimQuotes(SSID))) {
                return existingConfig.networkId;
            }
        }
    }else {
        Log.e(TAG,"Unable to fetch network configurations");
    }
    return -1;}
private void assignHighestPriority(WifiConfiguration config) {
    List<WifiConfiguration> configuredNetworks = mWifiManager.getConfiguredNetworks();
    if (configuredNetworks != null) {
        for (WifiConfiguration existingConfig : configuredNetworks) {
            if (config.priority <= existingConfig.priority) {
                config.priority = existingConfig.priority + 1;
            }
        }
    }
}
...