2010-02-19 6 views
38

Necesito recibir transmisiones para acciones de red como redes conectadas, desconectadas, etc. Estoy utilizando un receptor de difusión para este propósito. ¿Puede alguien decirme qué acción de intención debo capturar para eventos de red, ahora mismo, según mi búsqueda en Internet, estoy usando android.net.ConnectivityManager.CONNECTIVITY_ACTION.Acción intencionada para eventos de red en sdk de android

Aquí es mi clase de receptor de radiodifusión:

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

y también he añadido el permiso para acceder a la red estatal:

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

aquí es como yo he declarado esta clase en el archivo de manifiesto

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

Por favor sugiérame la acción correcta si estoy equivocado O si hay alguna otra manera para atrapar eventos de red.

Respuesta

51

Aquí está un ejemplo de trabajo:

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

. respuesta

public class ConnectivityReceiver extends BroadcastReceiver { 

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

} 
+0

De acuerdo con mi prueba de que no necesito ningún permiso para recibir transmisiones si wlan ahora está activo/inactivo o 3g ahora está activo/inactivo. Estoy un poco confundido, ¿para qué sirve android.net.conn.CONNECTIVITY_CHANGE? –

+0

Si vuelve a mirar, verá que CONNECTIVITY_CHANGE no es un permiso, está registrando un receptor intencionado (que alternativamente puede hacer en el código). – Hamid

+0

La respuesta es la misma que la de la pregunta. Entonces, ¿por qué NO funcionó antes de la respuesta? –

5

de Yanchenko es muy útil, ya solo queda simplificando un poco para obtener el estado de la conexión, modificar OnReceive de la siguiente manera:

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

en Ravi K Sharma, ¿sabe usted de android.net.ConnectivityManager.EXTRA_NO_CONNECTIVITY? Es un booleano extra en los extras de Intento desde el nivel 1 de API que indica si hay conectividad o no. –

+1

Con respecto al comentario de ayer, noté que no era preciso. Parece que EXTRA_NO_CONNECTIVITY, al menos en algunas circunstancias, solo se agrega a los extras de Intento si no hay conectividad. Por lo tanto, acceder a él con getBooleanExtra (ConnectivityManager.EXTRA_NO_CONNECTIVITY, false) supone dar un booleano que es verdadero si no hay conectividad en absoluto, y falso si hay alguna conectividad. Además, el código en esta respuesta es un ** patrón anti ** porque el análisis es limitado. No detectará el anclaje a red de Bluetooth, la conexión USB o la conectividad de LAN. No hagas eso. –

+2

Atribución para este código, dado que Ravi lo olvidó: http://stackoverflow.com/a/4239410/182653 – paulw1128

Cuestiones relacionadas