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

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

Pero en mi aplicación lo que quiero hacer es obtener una notificación si el dispositivo cambia su estado de "red" a "sin red". Esto sucedería, por ejemplo, cuando el usuario viaja a un túnel y pierde señal, etc. O cuando en WiFi, el usuario sale del alcance del punto de acceso y ya no tiene acceso a Internet.

¿La API de Android proporciona algo en el que puede registrar un oyente para que se notifique cada vez que se produce un cambio en el estado de la red?

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

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 añadido los permisos adecuados en AndroidManifest.xml:

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

 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 utilizar un BroadcastReceiver para ConnectivityManager.CONNECTIVITY_ACTION . De los documentos:

Se ha producido un cambio en la conectividad de red. Se ha establecido o perdido una conexión. El NetworkInfo para la red afectada se envía como un extra; Debe consultarse para ver qué tipo de evento de conectividad ocurrió.

Este receptor funciona tanto para WiFi como para la conectividad de datos celulares, 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 tablet estaba conectado a WiFi – no 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

 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <receiver android:name=".custom.ConnectivityChangeReceiver"> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> </intent-filter> </receiver> 

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

Implementé esta característica al registrar ConnectivityManager.

 _connectivityManager = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE); 

Una vez que tengamos un gestor de conectividad solo encuesta 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); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.