web-dev-qa-db-fra.com

Exemple d'écouteur Internet Android

Je travaille sur une application Android qui restera connectée en permanence à Internet. Si Internet est bas, il devrait donner un message approprié à l'utilisateur.

Y a-t-il quelque chose comme Internet Listener? Ou comment implémenter cet événement qui, chaque fois que la connexion Internet n'est pas disponible, devrait donner l'alerte.

25
Zeeshan Chaudhry

Créez un récepteur de diffusion pour cela et enregistrez-le dans le fichier manifeste.

Commencez par créer une nouvelle classe NetworkStateReceiver et développez BroadcastReceiver.

public class NetworkStateReceiver extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
     Log.d("app","Network connectivity change");
     if(intent.getExtras()!=null) {
        NetworkInfo ni=(NetworkInfo) intent.getExtras().get(ConnectivityManager.EXTRA_NETWORK_INFO);
        if(ni!=null && ni.getState()==NetworkInfo.State.CONNECTED) {
            Log.i("app","Network "+ni.getTypeName()+" connected");
        }
     }
     if(intent.getExtras().getBoolean(ConnectivityManager.EXTRA_NO_CONNECTIVITY,Boolean.FALSE)) {
            Log.d("app","There's no network connectivity");
     }
   }
}

Mettez ce code dans votre AndroidManifest.xml sous l'élément "application":

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

Et ajoutez cette permission

<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE"/>

MODIFIER

Ce code détecte uniquement le changement de connectivité mais ne peut pas dire si le réseau auquel il est connecté dispose d'un accès Internet. Utilisez cette méthode pour vérifier que -

public static boolean hasActiveInternetConnection(Context context) {
    if (isNetworkAvailable(context)) {
        try {
            HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection());
            urlc.setRequestProperty("User-Agent", "Test");
            urlc.setRequestProperty("Connection", "close");
            urlc.setConnectTimeout(1500); 
            urlc.connect();
            return (urlc.getResponseCode() == 200);
        } catch (IOException e) {
        Log.e(LOG_TAG, "Error checking internet connection", e);
        }
    } else {
    Log.d(LOG_TAG, "No network available!");
    }
    return false;
}
49
Chirag

Le code de Chirag Raval ci-dessus fonctionne certainement. Le problème est que l'auditeur sera invoqué même lorsque l'application ne s'exécute pas au premier plan. 

IMHO, la meilleure approche consiste à enregistrer/désenregistrer le récepteur dans les méthodes onResume()/onPause() de toutes vos activités d'application. Ce code devrait le faire:

private final NetworkStateReceiver stateReceiver = new NetworkStateReceiver();

@Override
protected void onResume() {
    super.onResume();
    IntentFilter filter = new IntentFilter();
    filter.addAction("Android.net.conn.CONNECTIVITY_CHANGE");
    registerReceiver(stateReceiver, filter);
}

@Override
protected void onPause() {
    super.onPause();
    unregisterReceiver(stateReceiver);
}

Évidemment, supprimez l'enregistrement du fichier AndroidManifest.xml.

En utilisant cette solution, le destinataire sera également appelé lors du basculement entre les activités de votre application (en supposant que vous les fermiez). Dans ce cas, utilisez un indicateur statique (partagé entre toutes vos activités) comme dans l'exemple ci-dessous (appelé online):

public class NetworkStateReceiver extends BroadcastReceiver {

    private static boolean online = true;  // we expect the app being online when starting

    public static final String TAG = NetworkStateReceiver.class.getSimpleName();

    public void onReceive(Context context, Intent intent) {
        Log.d(TAG,"Network connectivity change");
        ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo ni = manager.getActiveNetworkInfo();
        if (ni == null || ni.getState() != NetworkInfo.State.CONNECTED) {
            Log.d(TAG,"There's no network connectivity");
            if (online) // don't show the message if already offline
                Toast.makeText(context, R.string.noInternet, Toast.LENGTH_SHORT).show();
            online = false;
        } else {
            Log.d(TAG,"Network "+ni.getTypeName()+" connected");
            if (!online)  // don't show the message if already online
                Toast.makeText(context, R.string.backOnline, Toast.LENGTH_SHORT).show();
            online = true;
        }
    }
}

Si vous démarrez votre application alors que vous êtes hors ligne, le message Toast apparaîtra. sinon, il n'apparaît que lorsque vous perdez/rétablissez la connexion.

1
pepan