Je souhaite utiliser la méthode ConnectivityManager
qui fournit la méthode getAllNetworkInfo()
pour vérifier la disponibilité du réseau dans Android. Cette méthode était obsolète au niveau de l'API 23. Et la documentation du développeur suggère d'utiliser à la place getAllNetworks()
. J'ai essayé mais je n'ai pas pu obtenir les fonctionnalités exactes que je retirais de mon ancien code. S'il vous plaît, quelqu'un pourrait me guider comment utiliser la méthode getAllNetworks()
?
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;
}
Lorsque je mets à jour mon code obsolète et que je souhaite toujours prendre en charge Api en arrière. 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é pour cela. 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;
}
}
J'ai créé des utilitaires qui peuvent vous aider à vérifier:
il utilise l'ancienne ou la nouvelle API selon la plate-forme en cours 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/421467https://developer.Android.com/reference/kotlin/androidx/annotation/RequiresApi
Pour quelqu'un a besoin de la version Kotlin, (ci-dessous est le même code que celui de 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 pour Context.
Notez ce code dans n'importe quel fichier kotlin (.kt), puis vous pouvez utiliser cette méthode dans n'importe quelle classe qui implémente Context (comme Activity).
Essaye ça
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;
}
}
}
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;
}
}