2015-04-23 26 views
5

Zauważyłem, że podczas przesyłania strumieniowego audio ze zdalnego serwera przez połączenie 3G (mobilne) i gdy WIFI jest odłączone lub wyłączone, gdy tylko WIFI jest aktywowany i podłączony, połączenie przez 3G jest zrzucane.Jak połączyć się z siecią komórkową po podłączeniu WIFI na urządzeniu z Androidem?

Chcę, aby aplikacja nadal korzystała z 3G, nawet jeśli WIFI jest teraz podłączona. Chcę to zrobić, aby zachować ciągłość. (Użytkownik może opt-in/out do/z tego zachowania).

Czy jest specjalna flaga, zamek itd. W tym celu?

Odpowiedz

11

Nie jest to możliwe na urządzeniach przed Androidem 5.0 (Lollipop). System operacyjny utrzymuje tylko jeden interfejs naraz, a aplikacje nie mają żadnej kontroli nad tym wyborem.

Na urządzeniach z Androidem 5.0 lub nowszym można używać nowych interfejsów API obsługujących wiele sieci, aby wybrać interfejs, który ma być używany w ruchu sieciowym.

Oto kroki, aby to zrobić, z Android 5.0 changelog:

Aby wybrać i połączyć się z siecią dynamicznie z aplikacji, wykonaj następujące kroki:

  1. Tworzenie ConnectivityManager.
  2. Użyj klasę NetworkRequest.Builder utworzyć obiekt NetworkRequest i określ funkcje sieciowe i rodzaju transportu aplikacja jest zainteresowany.
  3. Aby wyszukać odpowiednich sieci, zadzwoń requestNetwork() lub registerNetworkCallback() i przechodzą w obiekcie NetworkRequest i implementacji ConnectivityManager.NetworkCallback. Użyj metody requestNetwork(), jeśli chcesz aktywnie przełączać się do odpowiedniej sieci po jej wykryciu; aby odbierać tylko powiadomienia dla skanowanych sieci bez aktywnej zmiany, użyj zamiast tego metody registerNetworkCallback().

Gdy system wykryje odpowiednią sieć, łączy się z siecią i wywołuje wywołanie zwrotne onAvailable(). Możesz użyć obiektu sieciowego z wywołania zwrotnego, aby uzyskać dodatkowe informacje o sieci lub skierować ruch do korzystania z wybranej sieci.

szczególności, jeśli chcesz, aby wymusić ruch w sieci 3G/LTE, nawet jeśli nie jest obecny sygnał WiFi, wy mieliście użyć czegoś takiego:

ConnectivityManager cm = (ConnectivityManager) context.getSystemService(
          Context.CONNECTIVITY_SERVICE); 
NetworkRequest.Builder req = new NetworkRequest.Builder(); 
req.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR); 
cm.requestNetwork(req.build(), new ConnectivityManager.NetworkCallback() { 

    @Override 
    public void onAvailable(Network network) { 
     // If you want to use a raw socket... 
     network.bindSocket(...); 
     // Or if you want a managed URL connection... 
     URLConnection conn = network.openConnection(...); 
    } 

    // Be sure to override other options in NetworkCallback() too... 

} 
+0

wspaniałych informacji! Dziękuję Ci bardzo! Czy masz pomysł, jak zablokować 3G przez stronę NDK? (Pozostając w kontakcie z 3G po stronie c/C++, gdy łączę się z serwerem z NDK) – frankish

+1

Ten interfejs API jest dostępny tylko w środowisku Java systemu Android, więc jeśli chcesz uzyskać do niego dostęp z poziomu NDK, musisz użyć JNI, aby utworzyć wywołanie z C++ na Javę. –

+1

Hi @TrevorJohns, jeśli użyję tej metody do wysyłania żądań Http podczas "onAvailable", czy będą one wysyłane z określonej sieci? Na przykład używam do tego AsyncHttpClient. Jeśli wywołasz metodę client.Get() w obszarze onAvailable, czy to żądanie zostanie skierowane przez określoną sieć? – Konstantinos

Powiązane problemy