Я создаю приложение, которое подключается к определенной сети 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;
}
}
}
}