android - servicio - quitar sonido cuando pierde la red samsung
¿Cómo puedo recibir una notificación cuando el dispositivo pierde la conectividad de la red? (5)
Sé que puede escribir un 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 recibir una notificación si el dispositivo cambia su estado de "red" a "no hay red". Esto sucedería, por ejemplo, cuando el usuario viaja a un túnel y pierde la señal, etc. O cuando está en WiFi, el usuario sale del alcance del punto de acceso y ya no tiene acceso a Internet.
¿La API de Android proporciona algo donde puede registrar un oyente para que reciba una notificación cada vez que se produzca 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 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:
<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>
Es posible que desee considerar utilizar un BroadcastReceiver
para ConnectivityManager.CONNECTIVITY_ACTION
lugar. De la documentación:
Se ha producido un cambio en la conectividad de la red. Se ha establecido o perdido una conexión. El NetworkInfo para la red afectada se envía como extra; debe consultarse para ver qué tipo de evento de conectividad ocurrió.
Este receptor funciona tanto para conectividad WiFi como para datos celulares, a diferencia de PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
, que solo le notificará los cambios en las redes celulares.
Implementé esta función mediante el sondeo de ConnectivityManager.
_connectivityManager = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE);
Una vez que tengamos un administrador de conectividad, simplemente sondélo de vez en cuando para ver si todavía está 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);
La respuesta aceptada no me funcionó (mi tableta estaba conectada 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 de si esto ayudará, pero esto parece similar ...
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);