Android 6.0 No se puede agregar WifiConfiguration si ya hay otra WifiConfiguration para ese SSID

Android 6.0 hizo algunos cambios en el comportamiento WiFi y rompe el comportamiento de mi aplicación y no puede encontrar una solución para ello.

Básicamente, para Android 6.0 no se le permite modificar o eliminar objetos WifiConfiguration que no sean creados por su aplicación. Esto significa que necesito crear siempre mis propios objetos WifiConfiguration. Sin embargo, si ya existe una WifiConfiguration para un AP particular hecha por el usuario u otra aplicación, no puedo crear otra para ese AP.

WifiManager.addNetwork (wifiConfiguration) devuelve -1. Esto funciona en todas las versiones anteriores de Android, pero no en Android 6.0

Así que estoy atascado. ¿Se trata de un error de Android? Me imagino que un montón de desarrolladores deberían sufrir de esto si desarrollan aplicaciones para hardware personalizado que tiene su propio punto de acceso WiFi.

Sí. Es un Android 6.0. Bug y parece que se arreglará en una nueva versión.

https://code.google.com/p/android/issues/detail?id=192622

Creo que ayuda …. Algunos cambios necesarios … WifiConfiguration objetos que no son creados por su aplicación para cada momento. La aplicación no tiene permiso para crear otro objeto … Por lo tanto, necesitamos conectados con netID existente anterior.

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.RSN); wc.allowedProtocols.set(WifiConfiguration.Protocol.WPA); wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104); wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); wifiManager.setWifiEnabled(true); int netId = wifiManager.addNetwork(wc); if (netId == -1) { netId = getExistingNetworkId(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; } 

Y agrega permisos en el archivo Manifest también …

  • Soporte de multidifusión en Android en modo Hotspot / Tethering
  • Wi-Fi Android punto de acceso - sin Internet
  • Android Ethernet y Wi-Fi al mismo tiempo
  • ¿Cómo compartir programaticamente la pantalla del dispositivo Android con otra vía wifi? (No captura de pantalla)
  • Android: comprueba si la contraseña del wifi es correcta
  • WiFi-Direct en JellyBean, WPA Suplicante desordenado
  • ¿Pueden funcionar wifi y 3G al mismo tiempo en Android?
  • Adición de un nuevo portador de red a Android
  • Cómo crear WPA personalizado Hotspot con ssid y contraseña en android?
  • Forzar Android a utilizar la red Wifi sin Internet
  • ¿Cómo distinguir entre diferentes redes wifi?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.