2014-11-27 12 views
14

Android Lollipop sembra essere impostato su Mobile Data quando lo Wi-Fi non è connesso a Internet. Qualcuno sa se questo è ufficialmente documentato da qualche parte?Il Lollipop per Android è impostato su Dati mobili quando il Wi-Fi non ha accesso a Internet?

Abbiamo un'applicazione che deve connettersi alle macchine tramite Wi-Fi che non dispone di Internet. I nostri clienti segnalano ora che la connessione Wi-Fi non funziona più, perché il telefono passa automaticamente a LTE.

La mia comprensione sarebbe che il telefono mantiene ancora la connessione Wi-Fi ma utilizza LTE oltre a fornire l'accesso a Internet (lollipop-feature-spotlight-android-now-defaults-to-mobile-data-when-wi-fi-has-no-internet-access-signal-icon-adds-a-for-no-connection).

La mia comprensione di questa funzione è errata? E se è così, c'è un modo per forzare l'utilizzo del Wi-Fi senza Internet? Non ho trovato nulla su questo in particolare nella documentazione per sviluppatori.

Qualsiasi aiuto è molto apprezzato.

risposta

18

Per estendere la risposta di @ ianhanniballake, ho trovato che legare la rete usando ConnectivityManager.setProcessDefaultNetwork() impedisce il roaming e consente l'accesso TCP completo. Pertanto, all'interno della callback onAvailable() è possibile associare il processo dell'applicazione a quella rete anziché aprire una connessione a un determinato URL.

ConnectivityManager connection_manager = 
    (ConnectivityManager) activity.getApplication().getSystemService(Context.CONNECTIVITY_SERVICE); 

NetworkRequest.Builder request = new NetworkRequest.Builder(); 
request.addTransportType(NetworkCapabilities.TRANSPORT_WIFI); 

connection_manager.registerNetworkCallback(request.build(), new NetworkCallback() { 

    @Override 
    public void onAvailable(Network network) { 
     ConnectivityManager.setProcessDefaultNetwork(network); 
    } 
} 
+0

Grazie, funziona perfettamente. – shantanu

+0

Questo non funziona nel mio codice. qualsiasi nuovo modo –

+0

Solo per chiarimenti, cosa succede se durante il download da connessione wifi del server andato e dati mobili sono stati collegati, come stiamo vincolando il nostro processo al wifi in modo che aspetti per la connessione wifi? –

0

Android 5.0 offre nuove API multi-networking che consentono all'app di eseguire la scansione dinamica delle reti disponibili con capacità specifiche e stabilire una connessione. More info here

Quindi la soluzione per voi è ConnectivityManager.requestNetwor().

7

Per impostazione predefinita, Android 5.0 invierà solo le richieste di rete sulle reti rilevate che dispongono di una connessione Internet attiva, pertanto, mentre potrebbe essere "connesso" al wifi, non invierà alcun dato sulla rete.

Tuttavia, i Android 5.0 APIs guide parla del nuovo supporto di rete multiple:

Android 5.0 fornisce nuove API multi-rete che consentono la vostra applicazione di scansione in modo dinamico per le reti disponibili con capacità specifiche, e stabilire una connessione con loro. Questa funzionalità è utile quando l'app richiede una rete specializzata, come un SUPL, MMS o rete di fatturazione del vettore, o se si desidera inviare dati utilizzando un particolare tipo di protocollo di trasporto.

Questo ti permette di costruire un NetworkRequest per un tipo TRANSPORT_WIFI e il traffico diretto ad esso tramite Network.openConnection() quando si riceve un onAvailable() callback se è necessario disporre di alcuni collegamenti avvengono tramite WiFi anche quando la rete wifi non ha accesso a internet.

+0

Sembra stupido, perché non indirizzare il traffico alle interfacce in base alla sottorete di destinazione? –

+3

@MaxEhrlich - se si dispone di un'implementazione migliore, si prega di fare [inviare una patch] (https://source.android.com/source/submit-patches.html). – ianhanniballake

+1

Non dovrei farlo, ogni altro sistema operativo lo fa già. Google ha chiaramente in mente come vogliono che funzioni e probabilmente rifiuterà una tale patch –

Problemi correlati