Je veux vérifier quand le réseau de téléphone dans Android s’éteint. Puis-je capturer cet événement?
Je ne reçois pas la bonne API ni aucun exemple qui expliquerait la même chose. Si quelqu’un avait fait ou des exemples de liens seraient vraiment utiles.
Nouvelle classe java:
public class ConnectionChangeReceiver extends BroadcastReceiver { @Override public void onReceive( Context context, Intent intent ) { ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService( Context.CONNECTIVITY_SERVICE ); NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo(); NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo( ConnectivityManager.TYPE_MOBILE ); if ( activeNetInfo != null ) { Toast.makeText( context, "Active Network Type : " + activeNetInfo.getTypeName(), Toast.LENGTH_SHORT ).show(); } if( mobNetInfo != null ) { Toast.makeText( context, "Mobile Network Type : " + mobNetInfo.getTypeName(), Toast.LENGTH_SHORT ).show(); } } }
Nouveau xml dans votre AndroidManifest.xml sous l’élément “manifest”:
Nouveau xml dans votre AndroidManifest.xml sous l’élément “application”:
J’ai utilisé une petite configuration pour vérifier la bande passante afin de déterminer comment adapter les choses, comme les images.
Sous l’activité, dans AndroidManifest:
...
Dans l’activité où les contrôles sont effectués:
boolean network; int bandwidth; @Override public void onCreate(Bundle savedInstanceState) { ... network = isDataConnected(); bandwidth = isHighBandwidth(); registerReceiver(new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { network = isDataConnected(); bandwidth = isHighBandwidth(); } }, new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE")); ... } ... private boolean isDataConnected() { try { ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); return cm.getActiveNetworkInfo().isConnectedOrConnecting(); } catch (Exception e) { return false; } } private int isHighBandwidth() { ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo info = cm.getActiveNetworkInfo(); if (info.getType() == ConnectivityManager.TYPE_WIFI) { WifiManager wm = (WifiManager) getSystemService(Context.WIFI_SERVICE); return wm.getConnectionInfo().getLinkSpeed(); } else if (info.getType() == ConnectivityManager.TYPE_MOBILE) { TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); return tm.getNetworkType(); } return 0; }
Un exemple d’utilisation serait alors:
if (network) { if (bandwidth > 16) { // Code for large items } else if (bandwidth <= 16 && bandwidth > 8) { // Code for medium items } else { //Code for small items } } else { //Code for disconnected }
Ce n’est pas la plus jolie, mais elle offre suffisamment de flexibilité pour que je puisse modifier la coupure de la bande passante pour les articles en fonction de ce qu’ils sont et de mes besoins.
Si l’utilisation des annotations Android est une option pour vous, essayez ceci dans vos activités – c’est tout, le rest est généré:
@Receiver(actions = ConnectivityManager.CONNECTIVITY_ACTION, registerAt = Receiver.RegisterAt.OnResumeOnPause) void onConnectivityChange() { //react }
Utilisez ceci uniquement si vous utilisez déjà AndroidAnnotations – mettre cette dépendance dans votre projet uniquement pour ce morceau de code serait excessif.
La réponse ci-dessus ne fonctionne que si les données par paquets mobiles sont activées. Sinon, ConnectivityManager serait nul et vous ne pouvez plus récupérer NetworkInfo. La solution consiste à utiliser plutôt PhoneStateListener ou TelephonyManager.