Android 5.0 Lollipop y 4.4 KitKat ignora mi red WiFi, enableNetwork () es inútil

Mi aplicación se conecta directamente a un dispositivo de hardware que actúa como punto de acceso (sin acceso a Internet).

No puedo conectarme porque Android 5.0 automaticcaly cambia a una conexión a Internet válida, así que si tengo conexión de datos (3G, 4G, …) o una red preconfigurada no puedo conectarme a mi dispositivo porque ignora el WiFi .

Entonces, ¿cómo puedo forzar a Android a usar la red que activé mediante programación?

Simplemente estoy usando:

wifiManager.enableNetwork(id, true)) 

Donde id es la red de mi dispositivo al que me quiero conectar. El true parámetro es inútil.

La solución sugerida que utiliza ConnectivityManager.requestNetwork() no tiene ningún efecto.

3 Solutions collect form web for “Android 5.0 Lollipop y 4.4 KitKat ignora mi red WiFi, enableNetwork () es inútil”

Puedes intentar usar la nueva Lollipop API ConnectivityManager.requestNetwork () , supuestamente así:

 ConnectivityManager cm = (ConnectivityManager) Context.getSystemService(Context.CONNECTIVITY_SERVICE); cm.requestNetwork(new NetworkRequest.Builder() .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) .setNetworkSpecifier("XX:XX:XX:XX:XX:XX") .build(), new ConnectivityManager.NetworkCallback() { void onAvailable(Network network) { } }); 

Donde XX:XX:XX:XX:XX:XX es su SSID WiFi. No estoy seguro acerca de su formato, y si se utiliza en absoluto, no encontré ninguna referencia a setNetworkSpecifier dentro de fuentes de Android, excepto para la clase NetworkCapabilities .

He encontrado una solución para habilitar la red deseada en Lollipop:

WifiConfiguration habilita la red en Lollipop

Ahora este es mi código después de llamar a wifiManager.enableNetwork(id, true) :

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { WifiManager wm = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); List<WifiConfiguration> networks = wm.getConfiguredNetworks(); Iterator<WifiConfiguration> iterator = networks.iterator(); while (iterator.hasNext()) { WifiConfiguration wifiConfig = iterator.next(); if (wifiConfig.SSID.replace("\"", "").equals(wc.SSID.replace("\"", ""))) wm.enableNetwork(wifiConfig.networkId, true); else wm.disableNetwork(wifiConfig.networkId); } wm.reconnect(); } 

Tal vez el secreto es la llamada a reconnect() , no sé en este momento.

ACTUALIZACIÓN Desafortunadamente, esta solución sólo funciona si una conexión WiFi válida está activa antes de ejecutar el código. No funciona si se conecta sólo por 3G.

UPDATE 19 ene 2015

Este código realmente funciona para mí en Android 5 / 6.0.x:

 //bind to current thread if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkRequest.Builder request = new NetworkRequest.Builder(); request.addTransportType(NetworkCapabilities.TRANSPORT_WIFI); connManager.registerNetworkCallback(request.build(), new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(Network network) { ConnectivityManager.setProcessDefaultNetwork(network); //... } }); } 

Sólo tiene que formatear correctamente el SSID. Aquí hay un ejemplo de código:

  WifiManager mWifiManager = (WifiManager) getActivity().getSystemService(Context.WIFI_SERVICE); WifiConfiguration tmpConfig = new WifiConfiguration(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { tmpConfig.SSID = String.format("\"%s\"", sSSID); tmpConfig.BSSID = sBSSID; } else { tmpConfig.SSID = "\"" + sSSID + "\""; tmpConfig.BSSID = "\"" + sBSSID + "\""; } tmpConfig.priority = 1; if (iSecurityType.equals("WEP")) { tmpConfig.wepKeys[0] = sPassword; tmpConfig.wepTxKeyIndex = 0; } else if (iSecurityType.equals("WPA2") || iSecurityType.equals("WPA")) { tmpConfig.preSharedKey = "\"" + sPassword+ "\""; } else { tmpConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); } tmpConfig.status = WifiConfiguration.Status.ENABLED; int netId = mWifiManager.addNetwork(tmpConfig); mWifiManager.updateNetwork(tmpConfig); boolean result = mWifiManager.enableNetwork(netId, true); mWifiManager.updateNetwork(tmpConfig); mWifiManager.saveConfiguration(); 
  • ¿Cómo depurar Android 6.0 sobre Wi-Fi? (Problema netcfg)
  • ¿Puedo usar WiFi para transferir datos / mensajes entre dos teléfonos Android, no conectados a un enrutador?
  • Android: 3G a WIFI cambiar mientras que en el medio en la app = pérdida de conectividad de red
  • ¿Cómo puedo transferir archivos entre dispositivos Android mediante Wi-Fi Direct?
  • WifiDirectActivity Alteración de la muestra: Transfiere un ArrayList <String> p2p
  • Inicie el navegador predeterminado desde el navegador de portal cautivo de Android (CaptivePortalLogin)
  • Enviar notificación a todos los dispositivos conectados a una red Wi-Fi
  • Cómo obtener la dirección MAC en Android 6.0
  • Cómo crear y leer configuraciones WEP / EAP WiFi de forma programática en Android?
  • WiFi-Comunicación directa entre Mac / Windows y Android
  • Android Scan para redes Wifi
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.