Récepteur de diffusion pour vérifier la connexion Internet dans l'application Android

Je développe un récepteur de diffusion Android pour vérifier la connexion Internet.

Le problème est que mon récepteur de diffusion est appelé deux fois. Je veux qu'il ne soit appelé que lorsque le réseau est disponible. Si ce n'est pas disponible, je ne veux pas être informé.

  • Comment utiliser Toast lorsque je ne peux pas utiliser "this" comme contexte
  • Ressource non trouvée TextView
  • Qu'est-ce que Android: layout_marginStart
  • Double carte SIM Android
  • Création de Hashmap à partir d'une chaîne JSON
  • Comment modifier la couleur de surbrillance sur le champ editText
  • C'est le récepteur de diffusion

    public class NetworkChangeReceiver extends BroadcastReceiver { @Override public void onReceive(final Context context, final Intent intent) { final ConnectivityManager connMgr = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); final android.net.NetworkInfo wifi = connMgr .getNetworkInfo(ConnectivityManager.TYPE_WIFI); final android.net.NetworkInfo mobile = connMgr .getNetworkInfo(ConnectivityManager.TYPE_MOBILE); if (wifi.isAvailable() || mobile.isAvailable()) { // Do something Log.d("Network Available ", "Flag No 1"); } } } 

    C'est le manifeste.xml

     <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.broadcastreceiverforinternetconnection" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <receiver android:name=".NetworkChangeReceiver" > <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> <action android:name="android.net.wifi.WIFI_STATE_CHANGED" /> </intent-filter> </receiver> </application> </manifest> 

  • Pilote USB Prestigio Multipad PMP3370B
  • Comment empêcher le menu contextuel de fermer sur la case à cocher, cliquez sur
  • Android - Listview supprimer l'élément et actualiser
  • Est-il possible d'afficher un texte multicolore avec un appel vers Canvas.drawText ()?
  • Comment trouver la liste des applications accessibles par un utilisateur dans un intervalle à l'aide d'une tâche d'arrière-plan?
  • OnMessageReceived n'est pas appelé dans WearableListenerService
  • 12 Solutions collect form web for “Récepteur de diffusion pour vérifier la connexion Internet dans l'application Android”

    Répondez à votre première question : votre récepteur de diffusion est appelé deux fois parce que

    Vous avez ajouté deux <intent-filter>

    1. Changement dans la connexion réseau:
      <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />

    2. Changement d'état WiFi:
      <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />

    Il suffit d'utiliser un:
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> .

    Il répond à une seule action au lieu de deux. Voir ici pour plus d'informations.

    Répondez à votre deuxième question (vous souhaitez que le destinataire n'appelle qu'une fois si la connexion Internet est disponible):

    Votre code est parfait; Vous ne le notifiez que lorsque l'Internet est disponible.

    METTRE À JOUR

    Vous pouvez utiliser cette méthode pour vérifier votre connectivité si vous voulez juste vérifier si le mobile est connecté à Internet ou non.

     public boolean isOnline(Context context) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo netInfo = cm.getActiveNetworkInfo(); //should check null because in airplane mode it will be null return (netInfo != null && netInfo.isConnected()); } 
     public class NetworkChangeReceiver extends BroadcastReceiver { @Override public void onReceive(final Context context, final Intent intent) { if(checkInternet(context)) { Toast.makeText(context, "Network Available Do operations",Toast.LENGTH_LONG).show(); } } boolean checkInternet(Context context) { ServiceManager serviceManager = new ServiceManager(context); if (serviceManager.isNetworkAvailable()) { return true; } else { return false; } } } 

    ServiceManager.java

     public class ServiceManager { Context context; public ServiceManager(Context base) { context = base; } public boolean isNetworkAvailable() { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = cm.getActiveNetworkInfo(); return networkInfo != null && networkInfo.isConnected(); } } 

    Autorisations:

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

    Utilisez cette méthode pour vérifier l'état du réseau:

     private void checkInternetConnection() { if (br == null) { br = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Bundle extras = intent.getExtras(); NetworkInfo info = (NetworkInfo) extras .getParcelable("networkInfo"); State state = info.getState(); Log.d("TEST Internet", info.toString() + " " + state.toString()); if (state == State.CONNECTED) { Toast.makeText(getApplicationContext(), "Internet connection is on", Toast.LENGTH_LONG).show(); } else { Toast.makeText(getApplicationContext(), "Internet connection is Off", Toast.LENGTH_LONG).show(); } } }; final IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); registerReceiver((BroadcastReceiver) br, intentFilter); } } 

    N'oubliez pas de désinstaller le service inDestroy.

    À votre santé!!

     public static boolean isNetworkAvailable(Context context) { boolean isMobile = false, isWifi = false; NetworkInfo[] infoAvailableNetworks = getConnectivityManagerInstance( context).getAllNetworkInfo(); if (infoAvailableNetworks != null) { for (NetworkInfo network : infoAvailableNetworks) { if (network.getType() == ConnectivityManager.TYPE_WIFI) { if (network.isConnected() && network.isAvailable()) isWifi = true; } if (network.getType() == ConnectivityManager.TYPE_MOBILE) { if (network.isConnected() && network.isAvailable()) isMobile = true; } } } return isMobile || isWifi; } /* You can write such method somewhere in utility class and call it NetworkChangeReceiver like below */ public class NetworkChangedReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (isNetworkAvailable(context)) { Toast.makeText(context, "Network Available Do operations",Toast.LENGTH_LONG).show(); } } } 

    Ce récepteur de diffusion ci-dessus sera appelé uniquement lorsque l'état du réseau est changé en connexion et non sur déconnecté.

    Essayez avec ceci

     public class ConnectionBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (<Check internet connection available >) { Toast.makeText(context, "connect to the internet", Toast.LENGTH_LONG).show(); /*upload background upload service*/ Intent serviceIntent = new Intent(context,<your service class>); context.startService(serviceIntent); }else{ Toast.makeText(context, "Connection faild", Toast.LENGTH_LONG).show(); } } } 

    C'est le récepteur de diffusion. Dès que la connexion Internet déclenchera cela sera chargé

    Je sais que ce fil est vieux et entièrement répondu, mais je pense que ce qui suit pourrait aider certaines personnes.

    Le code dans le corps de la question contient un bug sur lequel personne n'est ici adressé. @Nikhil vérifie si le wifi / mobile est disponible et non s'il est connecté.

    La solution est ici:

     @Override public void onReceive(final Context context, final Intent intent) { final ConnectivityManager connMgr = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); final android.net.NetworkInfo wifi = connMgr .getNetworkInfo(ConnectivityManager.TYPE_WIFI); final android.net.NetworkInfo mobile = connMgr .getNetworkInfo(ConnectivityManager.TYPE_MOBILE); if (wifi.isConnected() || mobile.isConnected()) { // do stuff } } 

    manifeste:

     <receiver android:name=".your.namepackage.here.ConnectivityReceiver"> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> </intent-filter> </receiver> 

    Classe pour le récepteur:

     public class ConnectivityReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); switch (action) { case ConnectivityManager.CONNECTIVITY_ACTION: DebugUtils.logDebug("BROADCAST", "network change"); if(NetworkUtils.isConnect()){ //do action here } break; } } } 

    Et les utilités de classes comme exemple:

     public class NetworkUtils { public static boolean isConnect() { ConnectivityManager connectivityManager = (ConnectivityManager) Application.getInstance().getSystemService(Context.CONNECTIVITY_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Network[] netArray = connectivityManager.getAllNetworks(); NetworkInfo netInfo; for (Network net : netArray) { netInfo = connectivityManager.getNetworkInfo(net); if ((netInfo.getTypeName().equalsIgnoreCase("WIFI") || netInfo.getTypeName().equalsIgnoreCase("MOBILE")) && netInfo.isConnected() && netInfo.isAvailable()) { //if (netInfo.getState().equals(NetworkInfo.State.CONNECTED)) { Log.d("Network", "NETWORKNAME: " + netInfo.getTypeName()); return true; } } } else { if (connectivityManager != null) { @SuppressWarnings("deprecation") NetworkInfo[] netInfoArray = connectivityManager.getAllNetworkInfo(); if (netInfoArray != null) { for (NetworkInfo netInfo : netInfoArray) { if ((netInfo.getTypeName().equalsIgnoreCase("WIFI") || netInfo.getTypeName().equalsIgnoreCase("MOBILE")) && netInfo.isConnected() && netInfo.isAvailable()) { //if (netInfo.getState() == NetworkInfo.State.CONNECTED) { Log.d("Network", "NETWORKNAME: " + netInfo.getTypeName()); return true; } } } } } return false; } } 

    Check Intenert Chaque fois que vous utilisez Broadcast Receiver Like same to Youtube Aller en ligne, hors ligne

    Entrez la description de l'image ici Code source

    https://drive.google.com/open?id=0BzBKpZ4nzNzUYjhZamFIZTh6VTQ

     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.INTERNET"/> <receiver android:name=".receivers.NetworkChangeReceiver"> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> </intent-filter> </receiver> =============================================================== package com.keshav.networkchangereceiverexample.receivers; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.util.Log; import static com.keshav.networkchangereceiverexample.MainActivity.dialog; public class NetworkChangeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { try { if (isOnline(context)) { dialog(true); Log.e("keshav", "Online Connect Intenet "); } else { dialog(false); Log.e("keshav", "Conectivity Failure !!! "); } } catch (NullPointerException e) { e.printStackTrace(); } } private boolean isOnline(Context context) { try { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo netInfo = cm.getActiveNetworkInfo(); //should check null because in airplane mode it will be null return (netInfo != null && netInfo.isConnected()); } catch (NullPointerException e) { e.printStackTrace(); return false; } } } ================================================================= package com.keshav.networkchangereceiverexample; import android.content.BroadcastReceiver; import android.content.Intent; import android.content.IntentFilter; import android.graphics.Color; import android.net.ConnectivityManager; import android.os.Build; import android.os.Handler; import android.os.Looper; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.TextView; import com.keshav.networkchangereceiverexample.receivers.NetworkChangeReceiver; public class MainActivity extends AppCompatActivity { private BroadcastReceiver mNetworkReceiver; static TextView tv_check_connection; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv_check_connection=(TextView) findViewById(R.id.tv_check_connection); mNetworkReceiver = new NetworkChangeReceiver(); registerNetworkBroadcastForNougat(); } public static void dialog(boolean value){ if(value){ tv_check_connection.setText("We are back !!!"); tv_check_connection.setBackgroundColor(Color.GREEN); tv_check_connection.setTextColor(Color.WHITE); Handler handler = new Handler(); Runnable delayrunnable = new Runnable() { @Override public void run() { tv_check_connection.setVisibility(View.GONE); } }; handler.postDelayed(delayrunnable, 3000); }else { tv_check_connection.setVisibility(View.VISIBLE); tv_check_connection.setText("Could not Connect to internet"); tv_check_connection.setBackgroundColor(Color.RED); tv_check_connection.setTextColor(Color.WHITE); } } private void registerNetworkBroadcastForNougat() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { registerReceiver(mNetworkReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { registerReceiver(mNetworkReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); } } protected void unregisterNetworkChanges() { try { unregisterReceiver(mNetworkReceiver); } catch (IllegalArgumentException e) { e.printStackTrace(); } } @Override public void onDestroy() { super.onDestroy(); unregisterNetworkChanges(); } } ============================================================== activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.keshav.networkchangereceiverexample.MainActivity"> <TextView android:id="@+id/tv_check_connection" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Connection establised !" android:padding="25dp" app:layout_constraintBottom_toBottomOf="parent" android:gravity="center" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> </LinearLayout> 

    Ajoutez un récepteur de diffusion qui peut écouter le changement de connectivité réseau. Vérifiez ensuite si votre périphérique est connecté à Internet ou que vous utilisez ConnectivityManager. Reportez-vous à cette publication ou cette vidéo pour une compréhension détaillée. Voici le code:

     public class NetworkStateChangeReceiver extends BroadcastReceiver { public static final String NETWORK_AVAILABLE_ACTION = "com.ajit.singh.NetworkAvailable"; public static final String IS_NETWORK_AVAILABLE = "isNetworkAvailable"; @Override public void onReceive(Context context, Intent intent) { Intent networkStateIntent = new Intent(NETWORK_AVAILABLE_ACTION); networkStateIntent.putExtra(IS_NETWORK_AVAILABLE, isConnectedToInternet(context)); LocalBroadcastManager.getInstance(context).sendBroadcast(networkStateIntent); } private boolean isConnectedToInternet(Context context) { try { if (context != null) { ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); return networkInfo != null && networkInfo.isConnected(); } return false; } catch (Exception e) { Log.e(NetworkStateChangeReceiver.class.getName(), e.getMessage()); return false; } } } 

    J'ai écrit ce récepteur pour afficher une notification sur l'écran, c'est pourquoi vous voyez une émission locale avec l'état du réseau. Voici le code pour afficher la notification.

     public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); IntentFilter intentFilter = new IntentFilter(NetworkStateChangeReceiver.NETWORK_AVAILABLE_ACTION); LocalBroadcastManager.getInstance(this).registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { boolean isNetworkAvailable = intent.getBooleanExtra(IS_NETWORK_AVAILABLE, false); String networkStatus = isNetworkAvailable ? "connected" : "disconnected"; Snackbar.make(findViewById(R.id.activity_main), "Network Status: " + networkStatus, Snackbar.LENGTH_LONG).show(); } }, intentFilter); } } 

    L'activité écoute l'intention diffusée par le récepteur du réseau et affiche la notification sur l'écran.

     public class AsyncCheckInternet extends AsyncTask<String, Void, Boolean> { public static final int TIME_OUT = 10 * 1000; private OnCallBack listener; public interface OnCallBack { public void onBack(Boolean value); } public AsyncCheckInternet(OnCallBack listener) { this.listener = listener; } @Override protected void onPreExecute() { } @Override protected Boolean doInBackground(String... params) { ConnectivityManager connectivityManager = (ConnectivityManager) General.context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); if ((networkInfo != null && networkInfo.isConnected()) && ((networkInfo.getType() == ConnectivityManager.TYPE_WIFI) || (networkInfo .getType() == ConnectivityManager.TYPE_MOBILE))) { HttpURLConnection urlc; try { urlc = (HttpURLConnection) (new URL("http://www.google.com") .openConnection()); urlc.setConnectTimeout(TIME_OUT); urlc.connect(); if (urlc.getResponseCode() == HttpURLConnection.HTTP_OK) { return true; } else { return false; } } catch (MalformedURLException e) { e.printStackTrace(); return false; } catch (IOException e) { e.printStackTrace(); return false; } } else { return false; } } @Override protected void onPostExecute(Boolean result) { if (listener != null) { listener.onBack(result); } } 

    }

    Juste pour quelqu'un d'autre qui veut enregistrer une diffusion de façon dynamique:

     BroadcastReceiver mWifiReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (checkWifiConnect()) { Log.d(TAG, "wifi has connected"); // TODO } } }; private void registerWifiReceiver() { IntentFilter filter = new IntentFilter(); filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); mContext.registerReceiver(mWifiReceiver, filter); } private void unregisterWifiReceiver() { mContext.unregisterReceiver(mWifiReceiver); } private boolean checkWifiConnect() { ConnectivityManager manager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = manager.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI && networkInfo.isConnected()) { return true; } return false; } 

    CONNECTIVITY_ACTION docs :

    Les applications ciblant l'Android 7.0 (niveau API 24) et supérieures ne reçoivent pas cette diffusion si elles déclarent le récepteur de diffusion dans leur manifeste. Les applications recevront encore des émissions si elles enregistrent leur BroadcastReceiver avec Context.registerReceiver () et que ce contexte est toujours valide.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.