2009-11-23 6 views
60

Je veux vérifier quand le réseau du téléphone sous Android se déclenche. 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 avait fait ou des exemples de liens seraient vraiment utiles.Réseau d'écoute Android

Répondre

144

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

<!-- 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> 
+0

hey Merci cela a fonctionné comme prévu – Sam97305421562

+0

comme le dit @noillusioin, le activeNetInfo peut être nul. C'est une indication que la connexion réseau JUST DISCONNECTED si vous savez (enregistrer l'état) que vous étiez connecté précédemment. – larham1

+0

Vous devez également vérifier NetworkInfo.isConnected – shuriquen

7

La réponse ci-dessus ne fonctionne que si les données de paquets mobiles est activée. Sinon, ConnectivityManager serait null et vous ne pourrez plus récupérer NetworkInfo. La solution consiste à utiliser PhoneStateListener ou TelephonyManager à la place.

16

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é, en 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 
} 

Il est pas la plus jolie, mais elle permet assez de flexibilité pour changer la bande passante en attente sur ce qu'ils sont et mes exigences pour eux.

+0

Trouvé cela très utile, merci :) – Skynet

9

Si vous utilisez Android Annotations est une option pour vous essayer 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 
} 

Utilisez ce que si vous utilisez déjà AndroidAnnotations - mettre cette dépendance à l'intérieur de votre projet uniquement pour ce morceau de code serait exagéré.

+0

Pouvez-vous s'il vous plaît mettre plus d'explications sur cette réponse. J'ai essayé de trouver quelque chose mais je ne pouvais pas. Il n'y a pas d'annotation @Receiver dans la bibliothèque d'annotations google. Merci! – Sniper

+0

Hey, je me réfère à la 3ème partie de la bibliothèque AndroidAnnotations. Je mets à jour ma réponse. –

+0

Oui vous avez raison, avec cette bibliothèque, il est possible et aussi j'ai trouvé ce https://github.com/jd-alexander/flender vérifier pas mal, mais vous pouvez l'utiliser uniquement avec la construction progressive 1.3, avec les nouveaux plugins de gradation de construction ne fonctionne pas – Sniper