2014-11-17 7 views
23

Moja aplikacja łączy się bezpośrednio z urządzeniem sprzętowym, które działa jako punkt dostępu (bez dostępu do Internetu).Android 5.0 Lollipop i 4.4 KitKat ignorują moją sieć WiFi, enableNetwork() jest bezużyteczna

Nie mogę się połączyć, ponieważ Android 5.0 automatycznie przełącza się na prawidłowe połączenie internetowe, więc jeśli mam połączenie danych (3G, 4G, ...) lub wstępnie skonfigurowaną sieć, nie mogę połączyć się z moim urządzeniem, ponieważ ignoruje WiFi.

Jak więc zmusić Androida do korzystania z sieci, którą aktywowałem programowo?

jestem po prostu za pomocą:

wifiManager.enableNetwork(id, true)) 

gdzie id jest sieć urządzeniu chcę się połączyć. Parametr true jest bezużyteczny.

Sugerowane rozwiązanie, które używa ConnectivityManager.requestNetwork(), nie ma żadnego efektu.

+3

Sugeruję złożyć zgłoszenie błędu na b.android.com, aby uzyskać oficjalne stanowisko w tej sprawie. IMO, zgodnie z dokumentacją 'wifiManager.enableNetwork (id, true)', uważa, że ​​powinno nadal działać tak jak wcześniej. Jeśli nie, to jest to błąd. Jakie urządzenia próbowałeś? – curioustechizen

+0

@ curioustechizen Jestem na nexusie 5 z lollipopem –

+0

@ curioustechizen Tak jak mówisz, enableNetwork() powinien kontynuować pracę, znalazłem rozwiązanie. –

Odpowiedz

7

znalazłem obejście aby umożliwić desidered sieć na Lollipop:

WifiConfiguration enable network in Lollipop

Teraz to jest mój kod po wywołaniu 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(); 
} 

może sekretem jest wezwanie do reconnect(), W tej chwili nie wiem.

UPDATE Niestety, obejście to działa tylko wtedy, gdy aktywne połączenie Wi-Fi jest aktywne przed wykonaniem kodu. Nie działa, jeśli łączysz się tylko przez 3G.

UPDATE 19 Jan 2015

Ten kod faktycznie działa dla mnie na 5/Android 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); 
      //... 
     } 
    }); 
} 
+0

Czy to oznacza, że ​​obecnie nie ma możliwości połączenia się z konkretną siecią WiFi w KitKat? – granko87

+0

@ Seraphim's Czy mimo to można połączyć się z KitKat? –

+0

@SamvelKartashyan Nadal nie działa dla mnie 4.4. Wydaje się być bardzo trudnym do rozwiązania lub, być może, jestem bardzo głupi. Daj mi znać Jeśli ci się udało. –

7

Można spróbować użyć nowego Lollipop API ConnectivityManager.requestNetwork(), podobno tak:

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) { 

         } 
        }); 

gdzie XX:XX:XX:XX:XX:XX jest SSID WiFi. Nie jestem pewien co do formatu, a jeśli jest on w ogóle używany, nie znalazłem żadnych odniesień do setNetworkSpecifier w źródłach Androida, z wyjątkiem klasy NetworkCapabilities.

0

wystarczy prawidłowo sformatować SSID. Oto przykładowy kod:

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(); 
Powiązane problemy