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:
- Tworzenie
ConnectivityManager
.
- Użyj klasę
NetworkRequest.Builder
utworzyć obiekt NetworkRequest
i określ funkcje sieciowe i rodzaju transportu aplikacja jest zainteresowany.
- 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...
}
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
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ę. –
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