android - qué - kitkat vs marshmallow
Android 5.0 Lollipop y 4.4 KitKat ignoran mi red WiFi, enableNetwork() no sirve para nada (3)
Encontré una solución para habilitar la red deseada en Lollipop:
WifiConfiguración habilitar 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 lo sé en este momento.
ACTUALIZACIÓN Desafortunadamente, esta solución solo funciona si una conexión WiFi válida está activa antes de ejecutar el código. No funciona si estás conectado solo por 3G.
ACTUALIZACIÓN 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);
//...
}
});
}
Mi aplicación se conecta directamente a un dispositivo de hardware que actúa como un punto de acceso (sin acceso a Internet).
No puedo conectarme porque Android 5.0 cambia automáticamente a una conexión de Internet válida, por lo que si tengo una 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é programáticamente?
Simplemente estoy usando:
wifiManager.enableNetwork(id, true))
donde id
es la red de mi dispositivo al que quiero conectarme. El true
parámetro es inútil.
La solución sugerida que utiliza ConnectivityManager.requestNetwork()
no tiene ningún efecto.
Puedes intentar usar el nuevo 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 tu SSID WiFi. No estoy seguro de su formato, y si se usa en absoluto, no encontré ninguna referencia a setNetworkSpecifier
dentro de las fuentes de Android, excepto la clase NetworkCapabilities
.
Solo necesitas formatear correctamente el SSID. Aquí hay un código de ejemplo:
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();