2015-04-23 16 views
5

Ho notato che durante lo streaming audio da un server remoto tramite connessione 3G (mobile) e mentre il Wi-Fi è disconnesso o spento, non appena il Wi-Fi è attivato e connesso, la connessione tramite 3G viene interrotta.Come rimanere connessi tramite rete mobile dopo aver connesso WIFI su Android?

Voglio che l'app continui a utilizzare il 3G anche se ora è collegato anche il Wi-Fi. Voglio fare questo per mantenere la continuità. (L'utente può opt-in/out per/da questo comportamento).

C'è una bandiera speciale, lucchetto, ecc. Per questo scopo?

risposta

11

Questo non è possibile sui dispositivi precedenti ad Android 5.0 (Lollipop). Il sistema operativo mantiene una sola interfaccia alla volta e le applicazioni non hanno alcun controllo su questa scelta.

Su dispositivi con Android 5.0 o versioni successive, è possibile utilizzare le nuove API multi-networking per selezionare l'interfaccia che si desidera utilizzare per il traffico di rete.

Ecco i passi per fare questo, dal Android 5.0 changelog:

Per selezionare e collegare a una rete in modo dinamico dalla tua app, attenersi alla seguente procedura:

  1. Creare un ConnectivityManager.
  2. utilizzare la classe NetworkRequest.Builder per creare un oggetto NetworkRequest e specificare le funzioni di rete e tipo di trasporto la vostra applicazione è interessato a.
  3. Per eseguire la scansione delle reti adeguate, chiamare requestNetwork() o registerNetworkCallback(), e passare l'oggetto NetworkRequest e l'implementazione di ConnectivityManager.NetworkCallback. Utilizzare il metodo requestNetwork() se si desidera passare attivamente a una rete adeguata una volta rilevata; per ricevere solo le notifiche per le reti digitalizzate senza passare attivamente, utilizzare invece il metodo registerNetworkCallback().

Quando il sistema rileva una rete adeguata, si connette alla rete e richiama il callback onAvailable(). È possibile utilizzare l'oggetto Rete dal callback per ottenere ulteriori informazioni sulla rete o per indirizzare il traffico verso l'utilizzo della rete selezionata.

In particolare, se si vuole forzare il traffico su reti 3G/LTE, anche se c'è un segnale WiFi presente, utilizza qualcosa di simile:

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

Grande informazioni! Grazie mille! Hai un'idea su come bloccare il 3G dal lato NDK? (Rimanere connesso al 3G in c/C++, mentre mi collego al server con NDK) – frankish

+1

Questa API è disponibile solo nel framework Java di Android, quindi se vuoi accedervi dall'interno dell'NDK devi usare JNI per fare una chiamata da C++ in Java. –

+1

Salve @TrevorJohns, se utilizzo questo metodo per inviare richieste Http durante "onAvailable", verranno inviati dalla rete specificata? Ad esempio, sto usando AsyncHttpClient per questo. Se chiamo client.Get() all'interno di onAvailable, la richiesta verrà instradata attraverso la rete specificata? – Konstantinos

Problemi correlati