Android 6: подключение к определенной сети Wi-Fi программно не работает
Я пытаюсь подключиться к сети Wi-Fi, давая SSID и проходить с использованием конфигураций WifiManager.
Основано на решении этих потоков: Как программно подключиться к определенной сети Wi-Fi в Android?
Метод переподключения вызывается. но ничего не происходит (не связано).
Версия Android (6.0.1) для чего-то? Если да, то как программно выполнить сетевое соединение на Android 6?
6 ответов
Несколько вещей изменились о том, как вы подключаетесь к сети Wi-Fi со времен Android Marshmallow. Следующий код поможет вам... Если вы используете Android 6.0 или более низкие версии...
public void connectToWifi(){
try{
WifiManager wifiManager = (WifiManager) super.getSystemService(android.content.Context.WIFI_SERVICE);
WifiConfiguration wc = new WifiConfiguration();
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
wc.SSID = "\"NETWORK_NAME\"";
wc.preSharedKey = "\"PASSWORD\"";
wc.status = WifiConfiguration.Status.ENABLED;
wc.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
wifiManager.setWifiEnabled(true);
int netId = wifiManager.addNetwork(wc);
if (netId == -1) {
netId = getExistingNetworkId(wc.SSID);
}
wifiManager.disconnect();
wifiManager.enableNetwork(netId, true);
wifiManager.reconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
private int getExistingNetworkId(String SSID) {
WifiManager wifiManager = (WifiManager) super.getSystemService(Context.WIFI_SERVICE);
List<WifiConfiguration> configuredNetworks = wifiManager.getConfiguredNetworks();
if (configuredNetworks != null) {
for (WifiConfiguration existingConfig : configuredNetworks) {
if (existingConfig.SSID.equals(SSID)) {
return existingConfig.networkId;
}
}
}
return -1;
}
И добавить разрешения в файле манифеста
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
Добавьте конфигурацию Wi-Fi, используя addNetwork, а затем подключитесь к нему, используя enableNetwork.
WifiConfiguration wificonfiguration = new WifiConfiguration();
StringBuffer stringbuffer = new StringBuffer("\"");
stringbuffer.append((new StringBuilder(String.valueOf(HOTSPOT_NAME))).append("\"").toString());
wificonfiguration.SSID = stringbuffer.toString();
wificonfiguration.allowedKeyManagement.set(KeyMgmt.WPA_PSK);
wificonfiguration.allowedAuthAlgorithms.set(0);
wificonfiguration.status = 2;
wificonfiguration.preSharedKey = "\"" + HOTSPOT_PASSWORD + "\"";
int networkId_ = wifi.addNetwork(wificonfiguration);
if(networkId>-1){
boolean status = wifi.enableNetwork(networkId_, true);
}
Для зефира: Ваши приложения теперь могут изменять состояние объектов WifiConfiguration только в том случае, если вы создали эти объекты. Вам не разрешено изменять или удалять объекты WifiConfiguration, созданные пользователем или другими приложениями. Подробнее о Зефир
Несколько вещей изменились о том, как вы подключаетесь к сети Wi-Fi со времен Android Lollipop и Marshmallow. Есть хороший пост в блоге, посвященный тому, как вы подключаетесь к сети WiFi в Marshmallow и ниже.
http://www.intentfilter.com/2016/08/programatically-connecting-to-wifi.html
В посте описывается сценарий, когда сеть WiFi не имеет подключения, и вы хотите отправлять трафик через эту сеть (что-то вроде портала портала). Но это также объясняет весь процесс и будет работать для обычных сетей. Вы не сможете найти точный код, но он все равно поможет узнать, где вы застряли.
Вам необходимо вызвать connect() и restnect () WiFiManager. Это работает для меня:
WifiConfiguration conf = new WifiConfiguration();
conf.hiddenSSID = true;
conf.priority = 1000;
conf.SSID = "\"" + SSID + "\"";
conf.preSharedKey = "\""+Password+"\"";
conf.status = WifiConfiguration.Status.ENABLED;
conf.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);
conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
conf.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
conf.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
int res = wifiManager.addNetwork(conf);
boolean es = wifiManager.saveConfiguration();
Log.d(TAG, "saveConfiguration returned " + es );
wifiManager.disconnect();
boolean bRet = wifiManager.enableNetwork(res, true);
Log.i(TAG, "enableNetwork bRet = " + bRet);
wifiManager.reconnect();
Это работает для меня для соединения WPA. Вам не нужно снова добавлять сеть, если она уже сохранена.
private void connectToWifi(final String networkSSID, final String networkPassword) {
int netID = -1;
String confSSID = String.format("\"%s\"", networkSSID);
String confPassword = String.format("\"%s\"", networkPassword);
netID = getExistingNetworkID(confSSID, netID);
/*
* If ssid not found in preconfigured list it will return -1
* then add new wifi
*/
if (netID == -1) {
Log.d(TAG,"New wifi config added");
WifiConfiguration conf = new WifiConfiguration();
conf.SSID = confSSID;
conf.preSharedKey = confPassword;
netID = wifiManager.addNetwork(conf);
}
wifiManager.disconnect();
wifiManager.enableNetwork(netID, true);
wifiManager.reconnect();
}
private int getExistingNetworkID (String confSSID, int netID){
List<WifiConfiguration> wifiConfigurationList = wifiManager.getConfiguredNetworks();
for (WifiConfiguration item : wifiConfigurationList){
/*
Find if the SSID is in the preconfigured list - if found get netID
*/
if (item.SSID != null && item.SSID.equals(confSSID)){
Log.d(TAG, "Pre-configured running");
netID = item.networkId;
break;
}
}
return netID;
}
Это правильный способ подключения Wi-Fi, и этот очень короткий, не шаблонный код
fun connectToWifi(ssid: String, password: String) {
val connManager = context!!.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val networkInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI)
val wifiConfiguration = WifiConfiguration()
wifiConfiguration.SSID = String.format("\"%s\"", ssid)
wifiConfiguration.preSharedKey = String.format("\"%s\"", password)
wifiManager = context!!.getSystemService(Context.WIFI_SERVICE) as WifiManager
val netId: Int = wifiManager.addNetwork(wifiConfiguration)
wifiManager.disconnect()
wifiManager.enableNetwork(netId, true)
wifiManager.reconnect()
val config = WifiConfiguration()
config.SSID == "\"\"" + ssid + "\"\""
config.preSharedKey == "\"\"" + password + "\"\""
wifiManager.addNetwork(config)
}
Попробуйте это и наслаждайтесь:
int res = mWifiManager.addNetwork(wifiConfiguration);
if (res == -1) {
// Get existed network id if it is already added to WiFi network
res = getExistingNetworkId(wifiConfiguration.SSID);
Log.d(TAG, "getExistingNetwrkId: " + res);
}
private int getExistingNetworkId(String SSID) {
List<WifiConfiguration> configuredNetworks = mWifiManager.getConfiguredNetworks();
if (configuredNetworks != null) {
for (WifiConfiguration existingConfig : configuredNetworks) {
if (SSID.equalsIgnoreCase(existingConfig.SSID)) {
return existingConfig.networkId;
}
}
}
return -1;
}