Android getAllNetworkInfo () est déprécié. Quelle est l'alternative?

je veux utiliser le Gestionnaire de connectivité qui fournit la méthode getAllNetworkInfo() pour vérifier la disponibilité du réseau sous Android. Cette méthode a été dépréciée au niveau 23 de L'API. Et Developer doc suggère d'utiliser getAllNetworks() à la place. J'ai essayé mais je n'ai pas eu les fonctionnalités exactes que je sortais de mon ancien code. Svp quelqu'un pourrait me guider comment utiliser getAllNetworks() la méthode. Ci-dessous le code que j'utilise:

 public boolean isConnectingToInternet(){
    ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
      if (connectivity != null) 
      {
          @SuppressWarnings("deprecation")
        NetworkInfo[] info = connectivity.getAllNetworkInfo();
          //use getAllNetworks() instead
          if (info != null) 
              for (int i = 0; i < info.length; i++) 
                  if (info[i].getState() == NetworkInfo.State.CONNECTED)
                  {
                      return true;
                  }
      }
      return false;
}
24
demandé sur Heshan Sandeepa 2015-08-27 09:43:18

6 réponses

quand je mets à jour mon code obsolète et que je veux encore prendre en charge L'Api backward. j'utilise ceci :

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.WANTED API VERSION){
//code
}else{
//code
}

de cette façon, chaque appareil utilise le code approprié. Exemple:

public class ConnectionDetector {

    private Context mContext;

    public ConnectionDetector(Context context) {
        this.mContext = context;
    }
    /**
     * Checking for all possible internet providers
     * **/
    public boolean isConnectingToInternet() {
        ConnectivityManager connectivityManager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Network[] networks = connectivityManager.getAllNetworks();
            NetworkInfo networkInfo;
            for (Network mNetwork : networks) {
                networkInfo = connectivityManager.getNetworkInfo(mNetwork);
                if (networkInfo.getState().equals(NetworkInfo.State.CONNECTED)) {
                    return true;
                }
            }
        }else {
            if (connectivityManager != null) {
                //noinspection deprecation
                NetworkInfo[] info = connectivityManager.getAllNetworkInfo();
                if (info != null) {
                    for (NetworkInfo anInfo : info) {
                        if (anInfo.getState() == NetworkInfo.State.CONNECTED) {
                            LogUtils.d("Network",
                                    "NETWORKNAME: " + anInfo.getTypeName());
                            return true;
                        }
                    }
                }
            }
        }
        Toast.makeText(mContext,mContext.getString(R.string.please_connect_to_internet),Toast.LENGTH_SHORT).show();
        return false;
    }
}
29
répondu Maor Hadad 2016-10-13 05:53:45

j'ai fait des utils qui peuvent vous aider à vérifier:

  • si le réseau est connecté.
  • si WiFi est connecté.
  • si les données mobiles sont connectées.

il utilise une API ancienne ou nouvelle en fonction de la plate-forme d'exécution:

import android.annotation.TargetApi;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkInfo;
import android.os.Build;
import android.support.annotation.NonNull;

public class NetworkUtils {

public static boolean isConnected(@NonNull Context context) {
    ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
    return (networkInfo != null && networkInfo.isConnected());
}

public static boolean isWifiConnected(@NonNull Context context) {
    return isConnected(context, ConnectivityManager.TYPE_WIFI);
}

public static boolean isMobileConnected(@NonNull Context context) {
    return isConnected(context, ConnectivityManager.TYPE_MOBILE);
}

private static boolean isConnected(@NonNull Context context, int type) {
    ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        NetworkInfo networkInfo = connMgr.getNetworkInfo(type);
        return networkInfo != null && networkInfo.isConnected();
    } else {
        return isConnected(connMgr, type);
    }
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private static boolean isConnected(@NonNull ConnectivityManager connMgr, int type) {
    Network[] networks = connMgr.getAllNetworks();
    NetworkInfo networkInfo;
    for (Network mNetwork : networks) {
        networkInfo = connMgr.getNetworkInfo(mNetwork);
        if (networkInfo != null && networkInfo.getType() == type && networkInfo.isConnected()) {
            return true;
        }
    }
    return false;
}
}

mise à jour:

Plus d'informations sur @TargetApi et @RequiresApi : https://stackoverflow.com/a/40008157/421467 https://developer.android.com/reference/kotlin/androidx/annotation/RequiresApi

13
répondu Yakiv Mospan 2018-08-22 13:42:41

Pour quelqu'un a besoin de Kotlin version (ci-Dessous est le même code avec Maor Hadad)

fun Context.isNetworkConnected(): Boolean {
  val manager = getSystemService(Context.CONNECTIVITY_SERVICE) as? ConnectivityManager
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    val allNetworks = manager?.allNetworks?.let { it } ?: return false
    allNetworks.forEach { network ->
      val info = manager.getNetworkInfo(network)
      if (info.state == NetworkInfo.State.CONNECTED) return true
    }
  } else {
    val allNetworkInfo = manager?.allNetworkInfo?.let { it } ?: return false
    allNetworkInfo.forEach { info ->
      if (info.state == NetworkInfo.State.CONNECTED) return true
    }
  }
  return false
}

ce code est une méthode d'extension de contexte.

notez ce code dans n'importe quel fichier kotlin(.kt), alors vous pouvez utiliser cette méthode dans toute classe qui implémente Contexte(comme l'Activité).

3
répondu Mark 2017-04-17 02:35:22

essayez le code suivant:

ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);    
    Network[] networks = connectivityManager.getAllNetworks();
    NetworkInfo networkInfo;
    Network network;
        for (int i = 0; i < networks.length; i++){               
            network = networks[i];
            networkInfo = connectivityManager.getNetworkInfo(network);
            if ((networkInfo.getType() ==     ConnectivityManager.TYPE_WIFI) && (networkInfo.getState().equals(NetworkInfo.State.CONNECTED))) {
               ConnectivityManager.setProcessDefaultNetwork(network);
                break;
            }
        }
1
répondu Akshay 2015-08-31 11:06:45

Essayez cette

    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        Network[] networks=cm.getAllNetworks();
        if (cm != null) {
        for (Network netinfo : networks) {
            NetworkInfo ni = cm.getNetworkInfo(netinfo);
            if (ni.isConnected() && ni.isAvailable()) {
                    connected = true;
                }
            }
        }
1
répondu user8648969 2017-09-21 13:06:15

essayez celui-ci .C'est la manière la plus simple.

public static boolean isNetworkAvailable(Activity activity) {  
        ConnectivityManager connectivity = (ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE);  
        if (connectivity == null) {  
            return false;  
        } else {  
            NetworkInfo[] info = connectivity.getAllNetworkInfo();  
            if (info != null) {  
                for (int i = 0; i < info.length; i++) {  
                    if (info[i].getState() == NetworkInfo.State.CONNECTED) {  
                        return true;  
                    }  
                }  
            }  
        }  
        return false;  
    }  
}  
-1
répondu dev garg 2016-10-13 05:54:06