2011-01-08 20 views
11

La mia app esegue una raccolta di dati di backgound e sto aggiungendo il supporto per le preferenze di rete dell'utente, come l'esecuzione di aggiornamenti in background e il roaming dei dati. Ho i seguenti controlli: giàCome rispettare le impostazioni di utilizzo della rete in Android

ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
if(cm.getBackgroundDataSetting()) { 
... 
NetworkInfo networkInfo = cm.getActiveNetworkInfo(); 
if (networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected()) { 

con le voci necessarie nel manifesto:

<uses-permission android:name="android.permission.INTERNET"></uses-permission> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> 

Tutto questo sembra funzionare bene, ma mi chiedevo se devo controllando ogni altra cosa? Ero preoccupato di verificare il roaming dei dati, ma lo stato docs è il networkInfo.isAvailable() che verifica per me. Quindi ci sono altri controlli che devo implementare per le impostazioni di rete? Qualcos'altro in questo settore dovrei essere a conoscenza?

+0

Buona domanda. Anche le informazioni di rete non hanno un metodo isRoaming. (E stai sviluppando app solo nell'area del Nord America, se non questo potrebbe essere un problema, dal momento che il protocollo di rete potrebbe essere diverso). –

+0

Sì, esiste un metodo 'isRoaming()'. Non l'ho usato fino a quando 'networkInfo.isAvailable()' sembra restituire 'false' se la rete è in roaming e l'utente ha disabilitato il roaming dei dati. L'app sarà solo per il Regno Unito - non penso ** questo ha un effetto sul codice che ho finora, ma se dovessi implementare alcuni dei controlli nelle risposte dovrei controllare un diverso NETWORK_TYPE . –

+0

Ero curioso. Ho consultato il codice sorgente e la documentazione. isNetworkAvilable è affidabile come qualsiasi, dal momento che controlla se sei nella rete di casa o meno. (dopotutto se fallisce, la tua applicazione non è l'unica in difficoltà;)) –

risposta

6

L'utente può modificare le impostazioni mentre è in esecuzione l'app in background. L'API consiglia di ascoltare il messaggio di trasmissione:

ConnectivityManager.ACTION_BACKGROUND_DATA_SETTING_CHANGED 

Forse si sta verificando cm.getBackgroundDataSetting() prima di inviare i dati, e ho il sospetto che questo sarebbe sufficiente. Tuttavia, l'ascolto del messaggio trasmesso consente di riprendere l'invio di dati in background quando le impostazioni vengono modificate.

Credo che sia sufficiente ascoltare il messaggio di trasmissione o controllare le impostazioni prima di inviare i dati. Android docs consiglia il primo.

+0

Ho una classe che estende 'BroadcastReceiver' per eseguire i download. Ho quindi impostato un allarme usando 'AlarmManager' per attivare un download in background. Ogni volta che il ricevitore viene attivato, esegue i controlli nel mio post. Suppongo che potrei anche ascoltare il messaggio di broadcast che suggerisci così che se gli aggiornamenti in background sono stati disattivati ​​e sono stati appena riattivati, posso attivare un download immediato. O potrei semplicemente aspettare che si verifichi il prossimo download pianificato. Credo di dover prendere una decisione sul design ... grazie per il post. –

6

In aggiunta ai suoi controlli anche io assegno per il roaming di stato per la rete 3G:

NetworkInfo info = m_connectivityManager.getActiveNetworkInfo(); 
int netType = info.getType(); 
int netSubtype = info.getSubtype(); 

if (netType == ConnectivityManager.TYPE_WIFI || netType == ConnectivityManager.TYPE_WIMAX) 
{ 
    //no restrictions, do some networking 
} 
else if (netType == ConnectivityManager.TYPE_MOBILE && 
    netSubtype == TelephonyManager.NETWORK_TYPE_UMTS) 
{ 
    //3G connection 
    if(!m_telephonyManager.isNetworkRoaming()) 
    { 
     //do some networking 
    }  
} 

La mia applicazione utilizza un sacco di dati, in modo da non permettono il download di dati sulle reti mobili non-3G.

+0

Approccio interessante, grazie per il post. '! M_telephonyManager.isNetworkRoaming()' impedisce il download anche se l'utente ha barrato la casella per consentire il roaming dei dati? –

+0

Se nelle impostazioni non è stato selezionato "Roaming dati", nessuno sarà in grado di utilizzare le reti mobili durante il roaming. Nel mio caso, tuttavia, dovevo impedire l'uso intensivo della rete anche se il roaming è abilitato (per le richieste "leggere" non ho effettuato questo controllo di roaming). Quindi, sì, ciò disabiliterà l'attività di rete dell'applicazione anche se è abilitato il roaming in base al dispositivo. – inazaruk

2

Come @inazaruk, anche io sto cercando di impedire (per l'utente possibilmente costoso) i trasferimenti di rete durante il roaming o il download di immagini solo su GPRS. Pertanto in Zwitscher ho implementato un NetworkHelper che controlla le preferenze degli utenti su romaing e stato di rete minimo; https://github.com/pilhuhn/ZwitscherA/blob/master/src/de/bsd/zwitscher/helper/NetworkHelper.java Le preferenze di corrispondenza sono qui: https://github.com/pilhuhn/ZwitscherA/blob/master/res/xml/preferences.xml#L30

Problemi correlati