61 votes

Port d'écoute du réseau Android

Je veux vérifier si le réseau de téléphone Android, et s'en va. Puis-je capturer cet événement? Je ne reçois pas la bonne API ou un exemple qui pourrait expliquer la même chose. Si quelqu'un a fait ou n'importe quel exemple de liens serait vraiment utile. Merci à l'avance.

147voto

Eric Points 1508

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();
    }
  }
}

New xml dans votre AndroidManifest.xml dans le cadre du "manifeste" de l'élément:

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

New xml dans votre AndroidManifest.xml en vertu de la "demande" de l'élément:

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

17voto

LoungeKatt Points 692

J'ai été en utilisant une configuration de petite taille pour vérifier la bande passante pour déterminer comment faire évoluer les choses, comme les images.

En vertu de l'activité, dans AndroidManifest:

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

Dans l'activité où les vérifications sont effectuées:

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 il laisse suffisamment de souplesse que je peux changer la largeur de la bande de coupure pour les éléments en fonction de ce qu'ils sont et mes exigences.

11voto

Andev Points 11

Si vous utilisez Android Annotations est une option pour vous, que je recommande, 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
}

p.s.: bien sûr, vous devez toujours déclarer les autorisations dans votre manifeste

9voto

noillusion Points 83

La réponse ci-dessus ne fonctionne que si le mobile de paquets de données est activée. Sinon, ConnectivityManager serait nulle et vous ne pouvez plus récupérer NetworkInfo. Le moyen de contourner cela est d'utiliser un PhoneStateListener ou TelephonyManager à la place.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X