2012-08-28 14 views
25

Estoy trabajando en la aplicación de Android que permanecerá conectada continuamente con Internet. Si Internet no funciona, debe dar un mensaje apropiado al Usuario.Oyente de Internet Ejemplo de Android

¿Hay algo así como Internet Listener? o cómo implementar este evento que, cuando alguna vez la conexión a Internet no esté disponible, debería alertar.

+0

Este otro Q y A podrían ayudar: http://stackoverflow.com/questions/1560788/how-to-check-internet-access-on-android-inetaddress-never-timeouts – helios

+0

http: // desarrollador .android.com/training/monitoring-device-state/connectivity-monitoring.html –

Respuesta

48

Cree un receptor de difusión para eso y regístrelo en el archivo de manifiesto.

Primero cree una nueva clase NetworkStateReceiver y extienda BroadcastReceiver.

public class NetworkStateReceiver extends BroadcastReceiver { 
    public void onReceive(Context context, Intent intent) { 
    Log.d("app","Network connectivity change"); 
    if(intent.getExtras()!=null) { 
     NetworkInfo ni=(NetworkInfo) intent.getExtras().get(ConnectivityManager.EXTRA_NETWORK_INFO); 
     if(ni!=null && ni.getState()==NetworkInfo.State.CONNECTED) { 
      Log.i("app","Network "+ni.getTypeName()+" connected"); 
     } 
    } 
    if(intent.getExtras().getBoolean(ConnectivityManager.EXTRA_NO_CONNECTIVITY,Boolean.FALSE)) { 
      Log.d("app","There's no network connectivity"); 
    } 
    } 
} 

Pon este código en tu AndroidManifest.xml bajo el elemento "aplicación":

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

y añadir el permiso

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

EDITAR

Este código sólo detecta el cambio de conectividad pero no puede decir si la red a la que está conectado tiene acceso a internet. Utilice este método para verificar que -

public static boolean hasActiveInternetConnection(Context context) { 
    if (isNetworkAvailable(context)) { 
     try { 
      HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection()); 
      urlc.setRequestProperty("User-Agent", "Test"); 
      urlc.setRequestProperty("Connection", "close"); 
      urlc.setConnectTimeout(1500); 
      urlc.connect(); 
      return (urlc.getResponseCode() == 200); 
     } catch (IOException e) { 
     Log.e(LOG_TAG, "Error checking internet connection", e); 
     } 
    } else { 
    Log.d(LOG_TAG, "No network available!"); 
    } 
    return false; 
} 
+0

Ejemplos aquí: http://stackoverflow.com/questions/6176570/checking-the-networking-connectivity-using-broadcastreceiver-in-android – helios

+0

He intentado con esta solución, pero esto no funciona amigo. también da error en super.onReceive (contexto, intención); –

+0

¿cuál es el error? –

1

El código de Chirag Raval anterior ciertamente funciona. El problema es que el oyente será invocado incluso cuando la aplicación no se está ejecutando en primer plano.

En mi humilde opinión, el mejor enfoque es registrar/anular el registro del receptor en los métodos onResume()/onPause() de todas sus actividades de aplicación. Este código debe hacerlo:

private final NetworkStateReceiver stateReceiver = new NetworkStateReceiver(); 

@Override 
protected void onResume() { 
    super.onResume(); 
    IntentFilter filter = new IntentFilter(); 
    filter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); 
    registerReceiver(stateReceiver, filter); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    unregisterReceiver(stateReceiver); 
} 

Obviamente, eliminar el registro de AndroidManifest.xml archivo.

Al usar esta solución, se llamará al receptor también al cambiar entre las actividades de su aplicación (suponiendo que las está cerrando). En tal caso, utilice una bandera estática (que se comparte entre todas sus actividades) como en el ejemplo siguiente (llamado online):

public class NetworkStateReceiver extends BroadcastReceiver { 

    private static boolean online = true; // we expect the app being online when starting 

    public static final String TAG = NetworkStateReceiver.class.getSimpleName(); 

    public void onReceive(Context context, Intent intent) { 
     Log.d(TAG,"Network connectivity change"); 
     ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo ni = manager.getActiveNetworkInfo(); 
     if (ni == null || ni.getState() != NetworkInfo.State.CONNECTED) { 
      Log.d(TAG,"There's no network connectivity"); 
      if (online) // don't show the message if already offline 
       Toast.makeText(context, R.string.noInternet, Toast.LENGTH_SHORT).show(); 
      online = false; 
     } else { 
      Log.d(TAG,"Network "+ni.getTypeName()+" connected"); 
      if (!online) // don't show the message if already online 
       Toast.makeText(context, R.string.backOnline, Toast.LENGTH_SHORT).show(); 
      online = true; 
     } 
    } 
} 

Si iniciar su aplicación al estar fuera de línea, aparecerá el mensaje de pan tostado; de lo contrario, aparece solo al perder/restablecer la conexión.