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 .
- Cómo obtener mi hotspot wifi ssid en mi sistema android actual
- esperar hasta que el wifi esté conectado en android
- hostapd & rpbi portal cautivo
- ¿Qué pasará con las conexiones existentes cuando cambie entre 3g / wifi
- ADB, Wifi y Eclipse: ¿cómo puedo configurar?
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.
- Analizar todos los dispositivos wifi cerca del teléfono
- ¿Cómo pueden los usuarios / desarrolladores configurar la configuración de proxy de Android para las versiones 2.x?
- ¿Hay una manera de forzar una conexión de red sobre 4G, incluso cuando WiFi está habilitado y conectado?
- Solicitar al usuario que active Wi-Fi
- Android Personalizar la exploración Wifi
- ¿Cómo obtener la fuerza de conexión de los puntos de acceso Wifi?
- Android Wifi Direct detecta a sus compañeros pero Peer List es emty
- Descubrimiento del servicio directo Wifi de Android
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 puedo cambiar el nombre del dispositivo? (Dispositivos adb)
- Descargar y extraer archivos Zip en Android