¿Cómo puedo recibir una notificación cuando el dispositivo pierde conectividad de red?

Sé que puedes escribir código a través del cual puedes determinar si el dispositivo está conectado a una red.

Pero en mi aplicación, lo que quiero hacer es recibir una notificación si el dispositivo cambia su estado de ‘red’ a ‘sin red’. Esto sucedería, por ejemplo, cuando el usuario viaje a un túnel y pierda señal, etc. O cuando está conectado a WiFi, el usuario sale del scope del punto de acceso y ya no tiene acceso a Internet.

¿La API de Android proporciona algo donde puedes registrar un oyente para que te notifiquen cada vez que hay un cambio en el estado de la red?

Encontré este código e intenté usarlo, pero no hace nada. No recibo ninguna notificación cuando el estado de la red cambia.

public class ConnectivityManager extends PhoneStateListener{ Activity activity; public ConnectivityManager(Activity a){ TelephonyManager telephonyManager = (TelephonyManager)a.getSystemService(Context.TELEPHONY_SERVICE); telephonyManager.listen(this, PhoneStateListener.LISTEN_DATA_CONNECTION_STATE); activity = a; } @Override public void onDataConnectionStateChanged(int state) { super.onDataConnectionStateChanged(state); switch (state) { case TelephonyManager.DATA_DISCONNECTED: new AlertDialog.Builder(activity). setCancelable(false). setTitle("Connection Manager"). setMessage("There is no network connection. Please connect to internet and start again."). setNeutralButton("Ok", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { System.exit(0); } }).create(); break; case TelephonyManager.DATA_CONNECTED: break; } } } 

Además, he agregado los permisos apropiados en AndroidManifest.xml:

    

 myTelephonyManager=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); callStateListener = new PhoneStateListener(){ public void onDataConnectionStateChanged(int state){ switch(state){ case TelephonyManager.DATA_DISCONNECTED: Log.i("State: ", "Offline"); // String stateString = "Offline"; // Toast.makeText(getApplicationContext(), // stateString, Toast.LENGTH_LONG).show(); break; case TelephonyManager.DATA_SUSPENDED: Log.i("State: ", "IDLE"); // stateString = "Idle"; // Toast.makeText(getApplicationContext(), // stateString, Toast.LENGTH_LONG).show(); break; } } }; myTelephonyManager.listen(callStateListener, PhoneStateListener.LISTEN_DATA_CONNECTION_STATE); 

Es posible que desee considerar el uso de un BroadcastReceiver para ConnectivityManager.CONNECTIVITY_ACTION lugar. De los documentos:

Se ha producido un cambio en la conectividad de la red. Una conexión ha sido establecida o perdida. NetworkInfo para la red afectada se envía como un extra; se debe consultar para ver qué tipo de evento de conectividad ocurrió.

Este receptor funciona para conectividad WiFi y de datos móviles, a diferencia de PhoneStateListener.LISTEN_DATA_CONNECTION_STATE , que solo le notificará sobre cambios en las redes celulares.

La respuesta aceptada no funcionó para mí (mi tableta estaba conectada a WiFi, no a 3G). El siguiente código funcionó para mí:

 public class ConnectivityChangeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { System.out.println("*** Action: " + intent.getAction()); if(intent.getAction().equalsIgnoreCase("android.net.conn.CONNECTIVITY_CHANGE")) { Toast.makeText(context, "Connection changed", Toast.LENGTH_SHORT).show(); } } } 

y el cambio a AndroidManifest.xml

       

No estoy seguro si esto ayudará, pero esto se ve similar …

Implementé esta función al sondear ConnectivityManager.

 _connectivityManager = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE); 

Una vez que tengamos un administrador de conectividad, solo escríbalo de vez en cuando para ver si todavía estás conectado

 private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); final Runnable networkStatusChecker = new Runnable() { public void run() { NetworkInfo activeNetwork = _connectivityManager.getActiveNetworkInfo(); boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting(); if(!isConnected) { System.out.println("disconnected from network"); networkCheckerHandle.cancel(true); } } }; final ScheduledFuture networkCheckerHandle = scheduler.scheduleAtFixedRate(networkStatusChecker, 10, 10, SECONDS);