Проблема в обнаружении подключения к Интернету в Android

Я создал приложение Android с помощью Google Maps. Теперь я хочу проверить, доступно ли подключение к Интернету или нет. Я ищу в Google, и, наконец, я получил решение через Stackoverflow:

boolean HaveConnectedWifi = false; boolean HaveConnectedMobile = false; ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo[] netInfo = cm.getAllNetworkInfo(); for (NetworkInfo ni : netInfo) { if (ni.getTypeName().equalsIgnoreCase("WIFI")) if (ni.isConnected()) HaveConnectedWifi = true; if (ni.getTypeName().equalsIgnoreCase("MOBILE")) if (ni.isConnected()) HaveConnectedMobile = true; } <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

Я написал свой онлайн-код карты Google, если он вернет истинный и автономный код, если он вернет false.

Моя проблема заключается в том, что он показывает, что подключение к Интернету доступно, даже если это не так. Где я совершил ошибку?

Попробуйте использовать NetworkInfo ni = cm.getActiveNetworkInfo(); Вместо NetworkInfo ni = cm.getAllNetworkInfo(); , В каждый момент времени должна быть только одна активная сеть передачи данных, так как Android будет использовать наилучшее доступное и выключить другие, чтобы сохранить батарею.

Кроме того, я склонен использовать ni.isConnectedOrConnecting(); Вместо ni.isConnected(); Потому что он может лучше поймать переходные состояния.

Я также использую ni.getType() == ConnectivityManager.TYPE_WIFI вместо ni.getTypeName().equalsIgnoreCase("WIFI") потому что гораздо эффективнее сравнивать два значения int чем сравнивать две строки.

Для меня работает следующий код:

 boolean HaveConnectedWifi = false; boolean HaveConnectedMobile = false; ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo ni = cm.getActiveNetworkInfo(); if ( ni != null ) { if (ni.getType() == ConnectivityManager.TYPE_WIFI) if (ni.isConnectedOrConnecting()) HaveConnectedWifi = true; if (ni.getType() == ConnectivityManager.TYPE_MOBILE) if (ni.isConnectedOrConnecting()) HaveConnectedMobile = true; } 
 /** * Checking whether net connection is available or not. * * @param nContext * @return true if net connection is avaible otherwise false */ public static boolean isNetworkAvailable(Context nContext) { boolean isNetAvailable = false; if (nContext != null) { ConnectivityManager mConnectivityManager = (ConnectivityManager) nContext .getSystemService(Context.CONNECTIVITY_SERVICE); if (mConnectivityManager != null) { boolean mobileNetwork = false; boolean wifiNetwork = false; boolean mobileNetworkConnecetd = false; boolean wifiNetworkConnecetd = false; NetworkInfo mobileInfo = mConnectivityManager .getNetworkInfo(ConnectivityManager.TYPE_MOBILE); NetworkInfo wifiInfo = mConnectivityManager .getNetworkInfo(ConnectivityManager.TYPE_WIFI); if (mobileInfo != null) mobileNetwork = mobileInfo.isAvailable(); if (wifiInfo != null) wifiNetwork = wifiInfo.isAvailable(); if (wifiNetwork == true || mobileNetwork == true) { if (mobileInfo != null) mobileNetworkConnecetd = mobileInfo .isConnectedOrConnecting(); wifiNetworkConnecetd = wifiInfo.isConnectedOrConnecting(); } isNetAvailable = (mobileNetworkConnecetd || wifiNetworkConnecetd); } } return isNetAvailable; } 

Также добавьте тег ниже в разрешении манифеста:

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