2009-11-23 12 views
60

Voglio verificare quando la rete del telefono in Android si spegne. Posso catturare quell'evento?Network listener Android

Non riesco a ottenere l'API corretta o alcun esempio che spieghi lo stesso. Se qualcuno avesse fatto o qualsiasi collegamento di esempio sarebbe davvero utile.

risposta

144

Nuova classe Java:

public class ConnectionChangeReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo(); 
    NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo( ConnectivityManager.TYPE_MOBILE); 
    if (activeNetInfo != null) 
    { 
     Toast.makeText(context, "Active Network Type : " + activeNetInfo.getTypeName(), Toast.LENGTH_SHORT).show(); 
    } 
    if(mobNetInfo != null) 
    { 
     Toast.makeText(context, "Mobile Network Type : " + mobNetInfo.getTypeName(), Toast.LENGTH_SHORT).show(); 
    } 
    } 
} 

Nuovo XML nei tuoi AndroidManifest.xml sotto l'elemento "manifest":

<!-- Needed to check when the network connection changes --> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 

Nuovo XML nel AndroidManifest.xml sotto l'elemento di "applicazione":

<receiver android:name="com.blackboard.androidtest.receiver.ConnectionChangeReceiver" 
      android:label="NetworkConnection"> 
    <intent-filter> 
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> 
    </intent-filter> 
</receiver> 
+0

hey Grazie ha funzionato come previsto – Sam97305421562

+0

come dice @noillusioin, activeNetInfo può essere nullo. Questa è un'indicazione che la connessione di rete JUST DISCONNECTED se si sa (stato di salvataggio) che si era connessi in precedenza. – larham1

+0

È inoltre necessario verificare NetworkInfo.isConnected – shuriquen

7

La risposta sopra funziona solo se i dati di pacchetto mobili sono abilitati. In caso contrario, ConnectivityManager sarebbe nullo e non sarà più possibile recuperare NetworkInfo. Il modo per aggirare è utilizzare PhoneStateListener o TelephonyManager.

16

Ho utilizzato una piccola installazione per controllare la larghezza di banda per determinare come ridimensionare le cose, come le immagini.

Sotto l'attività, in AndroidManifest:

<intent-filter> 
... 
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> 
</intent-filter> 

Nell'attività in cui vengono eseguite le verifiche:

boolean network; 
int bandwidth; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    ... 
    network = isDataConnected(); 
    bandwidth = isHighBandwidth(); 
    registerReceiver(new BroadcastReceiver() { 
     public void onReceive(Context context, Intent intent) { 
      network = isDataConnected(); 
      bandwidth = isHighBandwidth(); 
     } 
    }, new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE")); 
    ... 
} 
... 
private boolean isDataConnected() { 
    try { 
     ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
     return cm.getActiveNetworkInfo().isConnectedOrConnecting(); 
    } catch (Exception e) { 
     return false; 
    } 
} 

private int isHighBandwidth() { 
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo info = cm.getActiveNetworkInfo(); 
    if (info.getType() == ConnectivityManager.TYPE_WIFI) { 
     WifiManager wm = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
     return wm.getConnectionInfo().getLinkSpeed(); 
    } else if (info.getType() == ConnectivityManager.TYPE_MOBILE) { 
     TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
     return tm.getNetworkType(); 
    } 
    return 0; 
} 

Un esempio d'uso sarebbe allora:

if (network) { 
    if (bandwidth > 16) { 
     // Code for large items 
    } else if (bandwidth <= 16 && bandwidth > 8) { 
     // Code for medium items 
    } else { 
     //Code for small items 
    } 
} else { 
    //Code for disconnected 
} 

E ' non è il più bello, ma permette abbastanza flessibilità da poter cambiare il limite di larghezza di banda per gli oggetti de in attesa di quello che sono e dei miei requisiti per loro.

+0

Trovato molto utile, grazie :) – Skynet

9

Se si utilizza Android Annotations è un'opzione per provare questo nelle vostre attività - questo è tutto, il resto viene generato:

@Receiver(actions = ConnectivityManager.CONNECTIVITY_ACTION, 
     registerAt = Receiver.RegisterAt.OnResumeOnPause) 
void onConnectivityChange() { 
    //react 
} 

Utilizzare questo solo se si utilizza già AndroidAnnotations - mettere questa dipendenza all'interno del vostro progetto per questo pezzo di codice sarebbe eccessivo.

+0

Puoi per favore inserire più spiegazioni su questa risposta. Ho cercato di trovare qualcosa ma non potevo. Non c'è annotazione @Receiver nella libreria di annotazioni di google. Grazie! – Sniper

+0

Ehi, mi riferisco alla libreria di terze parti AndroidAnnotations. Aggiorno la mia risposta –

+0

Sì, hai ragione, con questa libreria è possibile e inoltre ho trovato questo https://github.com/jd-alexander/flender non è male, ma puoi usarlo solo con gradle build 1.3, con i nuovi plugin gradle di build non funziona – Sniper