2017-10-16 7 views
1

Je suis Android débutant et je veux déclarer un broadcastreceiver qui réagit sur CONNECTIVITY_CHANGE. Je l'ai essayé ce qui suit:comment définir Broadcastreceiver avec CONNECTIVITY_CHANGE?

private void checkInternet() { 
    IntentFilter ifilter = new IntentFilter ("android.net.conn.CONNECTIVITY_CHANGE"); 
    broadcastreceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive (Context Context, Intent Intent) { 
      ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService (getApplicationContext(). CONNECTIVITY_SERVICE); 
      NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); 
      if (networkInfo! = null && networkInfo.getState() == NetworkInfo.State.CONNECTED) 
       Toast.makeText (getApplicationContext(), "Internet", Toast.LENGTH_SHORT) .show(); 
      else 
       Toast.makeText (getApplicationContext(), "No Internet", Toast.LENGTH_SHORT) .show(); 
     } 
    }; 
    this.registerReceiver (broadcastreceiver, ifilter); 
} 

En Actitvity.onCreate j'appelle checkInternet. Lorsque je déconnecte Internet, les messages "No Internet" et "Internet" s'affichent. Et quand je me connecte à Internet les deux messages "No Internet" et "Internet" reviennent et dans le même ordre. Quelqu'un peut-il s'il vous plaît me dire pourquoi le Broadcastreceiver 2 fois commence et montre 2 statuts différents de départ? Je vous remercie à l'avance

+0

Possible copie de [Récepteur de diffusion pour vérifier la connexion Internet dans l'application Android] (https://stackoverflow.com/questions/ 15698790/diffusion-récepteur-pour-vérification-internet-connexion-dans-android-app) – mrid

+0

merci beaucoup pour la réponse rapide. J'ai déjà lu cet article et d'autres articles aussi. En ce que le récepteur est appelé deux fois, mais avec chaque appel vient le même message (par exemple "Internet" "Internet" ou "Pas d'Internet" "Pas d'Internet"). Dans mon APP, chaque appel montre 2 statuts différents ("No Internet" ET "Internet"). Je déclare le destinataire seulement au point, pas dans le manifeste. Pouvez-vous aider s'il vous plaît? – user7396065

+0

avez-vous inclus l'autorisation 'CONNECTIVITY_CHANGE' dans le manifeste? – mrid

Répondre

0

Essayez l'exemple suivant:

Mise en œuvre:

public class NetworkReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) { 
      NetworkInfo networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); 
      if (networkInfo != null && networkInfo.getDetailedState() == NetworkInfo.DetailedState.CONNECTED) { 
       Log.d("Network status: ", "Connected"); 
      } else if (networkInfo != null && networkInfo.getDetailedState() == NetworkInfo.DetailedState.DISCONNECTED) { 
       Log.d("Network status: ", "Not connected"); 
      } 
     } 
    } 
} 

Ajouter le récepteur dans votre AndroidMenifest:

<receiver 
    android:name=".receivers.NetworkReceiver"> 
    <intent-filter> 
     <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
    </intent-filter> 
</receiver> 
+0

merci beaucoup Mohammad, j'ai essayé votre solution, mais mon application se comporte de la même façon, 2 messages ("No Internet" et "Internet") quand je déconnecte Internet et 2 messages ("No Internet" et "Internet", exactement dans le même ordre) quand je connecte à nouveau Internet. Cela me rend fou. Comment peut-il être que l'application a à la fois internet et pas internet en même temps? Une idée s'il vous plaît? – user7396065

+0

Veuillez essayer cette solution dans un véritable périphérique. –

+0

J'ai essayé votre solution et la solution de sami sur un vrai appareil. Les deux solutions fonctionnent sur l'appareil. La seule différence entre les 2 solutions: votre solution affiche 2 fois "non connecté" quand je me déconnecte et 1 fois "connecté" quand je me connecte. La solution de Sami montre 1 fois "non connecté" quand je me déconnecte et 2 fois "connecté" quand je me connecte. mais ce n'est pas mal. La question est pourquoi ne fonctionne pas toutes les solutions sur la VM? cela est étrange. Je déconnecte et connecte mon ordinateur de sorte que la VM perd ou récupère Internet (Ethernet). Quel est le problème ici? – user7396065

1

si vous avez juste besoin de vérifier pour la connectivité Internet, vous pouvez utiliser ce qui suit. Dans votre activité

@Override 
protected void onCreate(Bundle savedInstanceState){ 
     ConnectionStateMonitor connectionStateMonitor = new ConnectionStateMonitor(); 
    connectionStateMonitor.enable(this); 
} 

et ajoutez cette classe dans votre activité

public class ConnectionStateMonitor extends ConnectivityManager.NetworkCallback { 

    final NetworkRequest networkRequest; 

    public ConnectionStateMonitor() { 
     networkRequest = new NetworkRequest.Builder(). 
       addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR).addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build(); 
    } 

    public void enable(Context context) { 
     ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     connectivityManager.registerNetworkCallback(networkRequest , this); 
    } 
    // Likewise, you can have a disable method that simply calls ConnectivityManager#unregisterCallback(networkRequest) too. 

    @Override 
    public void onAvailable(Network network) { 
     //do what you want when Connection is available 
    } 
    @Override 
    public void onLost(Network network){ 
     //Connection Lost 
    } 
} 

Je pense que ce sera plus facile que d'utiliser un récepteur BROADCAST

+0

hey sami, merci pour votre aide. J'ai essayé votre solution aussi. Le résultat est exactement le même. Pas d'Internet => onLost et onAvailable appelé, avec internet => onLost et onAvailable appelé. Mon Android fonctionne sur une machine virtuelle (VMware Player), peut-il être que CONNECTIVITY_CHANGE ne fonctionne pas correctement sur les machines virtuelles? – user7396065

+0

hey sami, voir s'il vous plaît mon commentaire ci-dessus – user7396065

+0

pouvez-vous s'il vous plaît vérifier si cela fonctionne sur un émulateur android, s'il ne fonctionne pas aussi, s'il vous plaît votre code entier –

0

Créer une nouvelle classe qui prolongera de BroadcastReceiver. Ici, vous définissez le filtre d'intention pour le changement de connectivité. Nous créons également une nouvelle méthode privée pour récupérer l'état actuel de la connexion réseau.

public class ConnectivityChangedBroadcastReceiver extends BroadcastReceiver { 

public static IntentFilter getIntentFilter() { 
    IntentFilter intentFilter = new IntentFilter(); 
    intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); 
    return intentFilter; 
} 

@Override 
public void onReceive(Context context, Intent intent) { 
    if (isNetworkAvailable(context)) { 
     // Network is available 
    } else { 
     // Network is not available 
    } 
} 

private boolean isNetworkAvailable(Context context) { 
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); 
    return activeNetworkInfo != null && activeNetworkInfo.isConnectedOrConnecting(); 
}} 

Enregistrez maintenant votre récepteur de diffusion dans la classe d'activité ou d'application comme ceci. Notez que les applications ciblant Android 7.0 (niveau d'API 24) et ultérieur ne reçoivent pas les diffusions CONNECTIVITY_ACTION si elles déclarent le récepteur de diffusion dans leur manifeste. Les applications continueront de recevoir les diffusions CONNECTIVITY_ACTION si elles enregistrent leur BroadcastReceiver avec Context.registerReceiver() et que ce contexte est toujours valide. Donc, si vous souhaitez cibler les dernières versions d'Android alors assurez-vous d'enregistrer le récepteur dans le code et ne se manifeste pas

ConnectivityChangedBroadcastReceiver connectivityChangedBroadcastReceiver; 
connectivityChangedBroadcastReceiver = new ConnectivityChangedBroadcastReceiver(); 
registerReceiver(connectivityChangedBroadcastReceiver, ConnectivityChangedBroadcastReceiver.getIntentFilter()); 
+0

Salut Ahmed, le problème est apparemment avec la VM sur laquelle Android est en cours d'exécution, sur un appareil réel de travail toutes les solutions. voir s'il vous plaît mon commentaire à Mohammad Arman. Je vous remercie – user7396065

0

comme dit l'ensemble des solutions de travail et le problème est la machine virtuelle. Lorsque je déconnecte Internet sur mon ordinateur, la machine virtuelle possède toujours la connexion physique, mais seule la communication est impossible. Par conséquent, les messages "Non connecté" "connecté" sont affichés dans cet ordre lors de la déconnexion ou de la connexion sur mon PC