2010-02-19 31 views
38

J'ai besoin de recevoir des émissions pour les actions réseau comme le réseau connecté, déconnecté, etc. J'utilise un récepteur de diffusion à cette fin. Quelqu'un peut-il me dire quelle action d'intention je dois capturer pour les événements de réseau, en ce moment, selon ma recherche sur internet, j'utilise android.net.ConnectivityManager.CONNECTIVITY_ACTION.Action d'intention pour les événements réseau dans android sdk

Voici ma classe de récepteur de radiodiffusion:

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.. 
    } 
} 
} 

et je l'ai également ajouté l'autorisation d'accès à l'état du réseau:

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

voici comment je l'ai déclaré cette classe dans le fichier manifeste

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

S'il vous plaît me suggérer la bonne action d'intention si je me trompe OU s'il y a un autre moyen pour attraper des événements de réseau.

Répondre

51

Voici un exemple de travail:

<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> 

. La réponse de

public class ConnectivityReceiver extends BroadcastReceiver { 

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

} 
+0

Selon mon test, je ne ai pas besoin d'aucune autorisation de recevoir des émissions si WLAN est maintenant haut/bas ou 3g est maintenant haut/bas. Je suis un peu confus, à quoi sert android.net.conn.CONNECTIVITY_CHANGE? –

+0

Si vous regardez à nouveau, vous verrez que CONNECTIVITY_CHANGE n'est pas une permission, c'est l'enregistrement d'un récepteur d'intention (que vous pouvez faire alternativement dans le code). – Hamid

+0

La réponse est la même que la question. Alors pourquoi n'a-t-il PAS fonctionné avant la réponse? –

5

Yanchenko est très utile, je suis juste simplifie un peu pour obtenir le statut de connexion, s'il vous plaît modifier OnReceive comme ci-dessous:

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

chez Ravi K Sharma, connaissez-vous android.net.ConnectivityManager.EXTRA_NO_CONNECTIVITY? C'est un booléen supplémentaire dans les extras Intent depuis API niveau 1 qui indique s'il y a connectivité ou non. –

+1

Concernant le commentaire d'hier, j'ai remarqué que ce n'était pas précis. Il semble que EXTRA_NO_CONNECTIVITY, au moins dans certaines circonstances, n'est ajouté qu'aux extras d'intention SI il n'y a pas de connectivité. Donc, y accéder avec getBooleanExtra (ConnectivityManager.EXTRA_NO_CONNECTIVITY, false) est censé donner un booléen qui est vrai s'il n'y a aucune connectivité, et false s'il y a une connectivité. De plus, le code dans cette réponse est un ** anti-pattern ** car l'analyse est limitée. Il ne détectera pas le partage de connexion Bluetooth, le partage de connexion USB ou la connectivité LAN. Ne fais pas ça. –

+2

Attribution de ce code, vu que Ravi l'a oublié: http://stackoverflow.com/a/4239410/182653 – paulw1128