web-dev-qa-db-fra.com

Écouteur réseau Android

Je veux vérifier quand le réseau de téléphone en Android s'éteint. Puis-je capturer cet événement?

Je ne reçois pas l'API appropriée ni aucun exemple qui expliquerait la même chose. Si quelqu'un l'avait fait ou des exemples de liens seraient vraiment utiles.

61
Sam97305421562

Nouvelle classe Java classe:

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":

<!-- Needed to check when the network connection changes -->
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE"/>

Nouveau xml dans votre AndroidManifest.xml sous l'élément "application":

<receiver Android:name="com.blackboard.androidtest.receiver.ConnectionChangeReceiver"
          Android:label="NetworkConnection">
  <intent-filter>
    <action Android:name="Android.net.conn.CONNECTIVITY_CHANGE"/>
  </intent-filter>
</receiver>
147
Eric

J'ai utilisé une petite configuration pour vérifier la bande passante pour déterminer comment mettre à l'échelle des choses, telles que des images.

Sous l'activité, dans AndroidManifest:

<intent-filter>
...
    <action Android:name="Android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>

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 le plus joli, mais cela permet une flexibilité suffisante pour que je puisse changer la limite de bande passante pour les éléments en fonction de ce qu'ils sont et de mes besoins pour eux.

16
Abandoned Cart

Si vous utilisez Annotations Android est une option pour vous essayez ceci dans vos activités - c'est tout, le reste est généré:

@Receiver(actions = ConnectivityManager.CONNECTIVITY_ACTION,
        registerAt = Receiver.RegisterAt.OnResumeOnPause)
void onConnectivityChange() {
    //react
}

N'utilisez ceci que si vous utilisez déjà AndroidAnnotations - mettre cette dépendance dans votre projet uniquement pour ce morceau de code serait exagéré.

11
luckyhandler

La réponse ci-dessus ne fonctionne que si les données de paquets mobiles sont activées. Sinon, ConnectivityManager serait nul et vous ne pourrez plus récupérer NetworkInfo. La solution consiste à utiliser plutôt PhoneStateListener ou TelephonyManager.

9
noillusion