我正在开发一款应用程序,它可以连接到某个没有互联网访问权限的WiFi网络。我通过应用程序添加了网络配置(而不是通过设置),这样我就可以启用/禁用此网络。
应用程序的工作步骤如下:
1.用户按下按钮。
2.我检查WiFi是否已启用,如果没有,我将其启用。此外,如果手机已经连接到一个WiFi网络,我会断开与该网络的连接并连接到我的网络(这部分运行良好)。
3.在启用WiFi之后,我使用以下方法连接到网络:
但是,如果WiFi最初被禁用,则似乎无法正常工作,WiFi被启用但不总是连接到我的网络,有时会连接到其他配置的网络(如果可用)。
我尝试将我的网络设置为高优先级(高于所有其他配置的网络),但没有任何区别。
我还尝试在启用WiFi之前启用网络,但它没有起作用。
我尝试添加mWifiManager.disconnect();但没有改变。
应用程序的工作步骤如下:
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;
}
}
}
}