2010-02-19 19 views
38

Ho bisogno di ricevere trasmissioni per azioni di rete come rete connessa, scollegata ecc. Sto usando un ricevitore di trasmissione per questo scopo. Qualcuno può dirmi quale azione intent ho bisogno di catturare per eventi di rete, in questo momento come per la mia ricerca su internet sto usando android.net.ConnectivityManager.CONNECTIVITY_ACTION.Azione intentata per eventi di rete in sdk android

Ecco la mia classe ricevitore trasmissione:

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 

public class NetworkStateReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    // TODO Auto-generated method stub 


    if (intent.getAction().equals(
      android.net.ConnectivityManager.CONNECTIVITY_ACTION)) { 

     // do something.. 
    } 
} 
} 

e ho aggiunto anche il permesso per l'accesso stato della rete:

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

ecco come ho dichiarato questa classe in manifest

<receiver class=".NetworkStateReceiver" android:name=".NetworkStateReceiver"> 
    <intent-filter> 
      <action android:name="android.net.ConnectivityManager.CONNECTIVITY_ACTION" /> 
    </intent-filter> 
</receiver> 

Si prega di suggerire la giusta azione intent se ho torto O se c'è un altro modo per catturare eventi di rete.

risposta

51

Ecco un esempio di lavoro:

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

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

. risposta

public class ConnectivityReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d(ConnectivityReceiver.class.getSimpleName(), "action: " 
       + intent.getAction()); 
    } 

} 
+0

Secondo la mia prova non ho bisogno di alcun permesso di ricevere le trasmissioni se wlan è ora su/giù o 3g ora è su/giù. Sono un po 'confuso, a cosa serve android.net.conn.CONNECTIVITY_CHANGE? –

+0

Se guardi di nuovo, vedrai che CONNECTIVITY_CHANGE non è un permesso, sta registrando un ricevitore intent (che puoi fare in alternativa nel codice). – Hamid

+0

La risposta ha lo stesso aspetto della domanda. Allora perché NON ha funzionato prima della risposta? –

5

di Yanchenko è molto utile, io sono solo semplificando un po 'per ottenere lo stato della connessione, si prega di modificare OnReceive come di seguito:

public class ConnectivityReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d(ConnectivityReceiver.class.getSimpleName(), "action: " 
       + intent.getAction()); 
     MyConstants.IS_NETWORK_AVAILABLE = haveNetworkConnection(context); 
     //IS_NETWORK_AVAILABLE this variable in your activities to check networkavailability. 

    } 


    private boolean haveNetworkConnection(Context context) { 
     boolean haveConnectedWifi = false; 
     boolean haveConnectedMobile = false; 

     ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo[] netInfo = cm.getAllNetworkInfo(); 
     for (NetworkInfo ni : netInfo) { 
      if (ni.getTypeName().equalsIgnoreCase("WIFI")) 
       if (ni.isConnected()) 
        haveConnectedWifi = true; 
      if (ni.getTypeName().equalsIgnoreCase("MOBILE")) 
       if (ni.isConnected()) 
        haveConnectedMobile = true; 
     } 
     return haveConnectedWifi || haveConnectedMobile;  
    } 
} 
+0

a Ravi K Sharma, sei a conoscenza di android.net.ConnectivityManager.EXTRA_NO_CONNECTIVITY? Questo è un extra booleano negli extra di Intent poiché il livello 1 dell'API indica se esiste o meno connettività. –

+1

Per quanto riguarda il commento di ieri, ho notato che non era preciso. Sembra che EXTRA_NO_CONNECTIVITY, almeno in alcune circostanze, sia aggiunto agli extra di Intent SE non c'è connettività. Quindi accedervi con getBooleanExtra (ConnectivityManager.EXTRA_NO_CONNECTIVITY, false) dovrebbe fornire un valore booleano che è vero se non c'è alcuna connettività e false se c'è una connessione. Inoltre, il codice in questa risposta è un ** anti pattern ** perché l'analisi è limitata. Non rileverà il tethering Bluetooth, il tethering USB o la connettività LAN. Non farlo. –

+2

Attribuzione per questo codice, visto che Ravi l'ha dimenticato: http://stackoverflow.com/a/4239410/182653 – paulw1128