GetAllNetworkInfo () устарел. Как использовать getAllNetworks () для проверки сетевого соединения Android?

Я хочу использовать диспетчер Connectivity, который предоставляет метод getAllNetworkInfo () для проверки доступности сети в Android. Этот метод устарел на уровне API 23. И Developer doc предлагает вместо этого использовать getAllNetworks (). Я попробовал, но не получил точных функций, которые я выбрал из своего старого кода. Пожалуйста, кто-нибудь может посоветовать мне, как использовать метод 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; } 

Solutions Collecting From Web of "GetAllNetworkInfo () устарел. Как использовать getAllNetworks () для проверки сетевого соединения Android?"

Когда я обновляю устаревший код и все еще хочу поддерживать обратный Api. Я использую это:

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

Таким образом, каждое устройство использует для этого соответствующий код. Пример:

 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; } } 

Я сделал утилит, которые могут помочь вам проверить:

  • Если сеть подключена.
  • Если Wi-Fi подключен.
  • Если мобильные данные подключены.

Он использует старый или новый API в зависимости от запущенной платформы:

 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; } } 

Попробуйте следующий код:

 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; } } 

Для кого-то нужна версия Kotlin, (Ниже такой же код с Maor Hadad's)

 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 } 

Этот код является расширением для Context.

Запишите этот код в любом файле kotlin (.kt), затем вы можете использовать этот метод в любом классе, который реализует контекст (например, Activity).

Попробуйте это. Это самый простой способ.

 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; } }