Мне нужно узнать, есть ли у моего устройства подключение к Интернету или нет. Я нашел много ответов вроде:
private boolean isNetworkAvailable() {
ConnectivityManager connectivityManager
= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null;
}
(Взято из Обнаружения, есть ли доступ к Интернету на Android .)
Но это неправильно, например, если я подключен к беспроводной сети, в которой нет доступа в Интернет , этот метод вернет истину ... Есть ли способ узнать, есть ли у устройства подключение к Интернету, а не только ли оно подключено? к чему-то?
android
internet-connection
android-internet
Буда Гаврил
источник
источник
isNetworkConnected
Функциональный блок содержит код устаревшее для всехBuild.VERSION.SDK_INT >= Build.VERSION_CODES.M
. Более подробное обсуждение этого вопроса и того, как его исправить, можно найти здесь stackoverflow.com/questions/53532406/…Ответы:
Ты прав. Предоставленный вами код проверяет только наличие сетевого подключения. Лучший способ проверить, есть ли активное подключение к Интернету, - это попытаться подключиться к известному серверу через http.
public static boolean hasActiveInternetConnection(Context context) { if (isNetworkAvailable(context)) { try { HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection()); urlc.setRequestProperty("User-Agent", "Test"); urlc.setRequestProperty("Connection", "close"); urlc.setConnectTimeout(1500); urlc.connect(); return (urlc.getResponseCode() == 200); } catch (IOException e) { Log.e(LOG_TAG, "Error checking internet connection", e); } } else { Log.d(LOG_TAG, "No network available!"); } return false; }
Конечно, вы можете заменить
http://www.google.com
URL-адрес любым другим сервером, к которому хотите подключиться, или сервером, который, как вы знаете, имеет хорошее время безотказной работы.Как Тони Чо также указал в этом комментарии ниже , убедитесь, что вы не запускаете этот код в основном потоке, иначе вы получите исключение NetworkOnMainThread (в Android 3.0 или новее). Вместо этого используйте AsyncTask или Runnable.
Если вы хотите использовать google.com, вам следует взглянуть на модификацию Jeshurun. В своем ответе он изменил мой код и сделал его более эффективным. Если вы подключитесь к
HttpURLConnection urlc = (HttpURLConnection) (new URL("http://clients3.google.com/generate_204") .openConnection());
а затем проверьте код ответа на 204
return (urlc.getResponseCode() == 204 && urlc.getContentLength() == 0);
тогда вам не нужно сначала загружать всю домашнюю страницу Google.
источник
ConnectivityManager
этого не требует). В противном случае на устройствах Android 4.x + вы получитеNetworkOnMainThread
исключение.Я немного изменил ответ THelper, чтобы использовать известный взлом, который Android уже использует, чтобы проверить, есть ли в подключенной сети Wi-Fi доступ в Интернет. Это намного эффективнее, чем захват всей домашней страницы Google. См. Здесь и здесь для получения дополнительной информации.
public static boolean hasInternetAccess(Context context) { if (isNetworkAvailable(context)) { try { HttpURLConnection urlc = (HttpURLConnection) (new URL("http://clients3.google.com/generate_204") .openConnection()); urlc.setRequestProperty("User-Agent", "Android"); urlc.setRequestProperty("Connection", "close"); urlc.setConnectTimeout(1500); urlc.connect(); return (urlc.getResponseCode() == 204 && urlc.getContentLength() == 0); } catch (IOException e) { Log.e(TAG, "Error checking internet connection", e); } } else { Log.d(TAG, "No network available!"); } return false; }
источник
public boolean isInternetWorking() { boolean success = false; try { URL url = new URL("https://google.com"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setConnectTimeout(10000); connection.connect(); success = connection.getResponseCode() == 200; } catch (IOException e) { e.printStackTrace(); } return success; }
верните истину, если интернет действительно доступен
Убедитесь, что у вас есть эти два разрешения
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
если http не работает, это из-за новой безопасности Android, теперь они не разрешают текстовое общение. пока просто обойти это.
источник
Если вы ориентируетесь на Lollipop или выше, можно использовать новый класс NetworkCapabilities, то есть:
public static boolean hasInternetConnection(final Context context) { final ConnectivityManager connectivityManager = (ConnectivityManager)context. getSystemService(Context.CONNECTIVITY_SERVICE); final Network network = connectivityManager.getActiveNetwork(); final NetworkCapabilities capabilities = connectivityManager .getNetworkCapabilities(network); return capabilities != null && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED); }
источник
connectivityManager.getActiveNetwork();
требуется API lvl23, который является Marshmallow, а не Lollipop.capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
похоже, помог мне!Вам не обязательно устанавливать полное HTTP-соединение. Вы можете попробовать просто открыть TCP-соединение с известным хостом, и в случае успеха у вас будет подключение к Интернету.
public boolean hostAvailable(String host, int port) { try (Socket socket = new Socket()) { socket.connect(new InetSocketAddress(host, port), 2000); return true; } catch (IOException e) { // Either we have a timeout or unreachable host or failed DNS lookup System.out.println(e); return false; } }
Тогда просто проверьте:
boolean online = hostAvailable("www.google.com", 80);
источник
AsyncTask
Основываясь на принятых ответах, я создал этот класс со слушателем, чтобы вы могли использовать его в основном потоке:
Во-первых : класс InterntCheck, который проверяет подключение к Интернету в фоновом режиме, а затем вызывает метод слушателя с результатом.
public class InternetCheck extends AsyncTask<Void, Void, Void> { private Activity activity; private InternetCheckListener listener; public InternetCheck(Activity x){ activity= x; } @Override protected Void doInBackground(Void... params) { boolean b = hasInternetAccess(); listener.onComplete(b); return null; } public void isInternetConnectionAvailable(InternetCheckListener x){ listener=x; execute(); } private boolean isNetworkAvailable() { ConnectivityManager connectivityManager = (ConnectivityManager) activity.getSystemService(CONNECTIVITY_SERVICE); NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); return activeNetworkInfo != null; } private boolean hasInternetAccess() { if (isNetworkAvailable()) { try { HttpURLConnection urlc = (HttpURLConnection) (new URL("http://clients3.google.com/generate_204").openConnection()); urlc.setRequestProperty("User-Agent", "Android"); urlc.setRequestProperty("Connection", "close"); urlc.setConnectTimeout(1500); urlc.connect(); return (urlc.getResponseCode() == 204 && urlc.getContentLength() == 0); } catch (IOException e) { e.printStackTrace(); } } else { Log.d("TAG", "No network available!"); } return false; } public interface InternetCheckListener{ void onComplete(boolean connected); } }
Во-вторых : создайте экземпляр класса в основном потоке и дождитесь ответа (если вы работали с Firebase api для Android, прежде чем это должно быть вам знакомо!).
new InternetCheck(activity).isInternetConnectionAvailable(new InternetCheck.InternetCheckListener() { @Override public void onComplete(boolean connected) { //proceed! } });
Теперь внутри метода onComplete вы узнаете, подключено ли устройство к Интернету или нет.
источник
Попробуй это
public class ConnectionDetector { private Context _context; public ConnectionDetector(Context context) { this._context = context; } public boolean isConnectingToInternet() { if (networkConnectivity()) { try { HttpURLConnection urlc = (HttpURLConnection) (new URL( "http://www.google.com").openConnection()); urlc.setRequestProperty("User-Agent", "Test"); urlc.setRequestProperty("Connection", "close"); urlc.setConnectTimeout(3000); urlc.setReadTimeout(4000); urlc.connect(); // networkcode2 = urlc.getResponseCode(); return (urlc.getResponseCode() == 200); } catch (IOException e) { return (false); } } else return false; } private boolean networkConnectivity() { ConnectivityManager cm = (ConnectivityManager) _context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = cm.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.isConnected()) { return true; } return false; } }
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" />
if((new ConnectionDetector(MyService.this)).isConnectingToInternet()){ Log.d("internet status","Internet Access"); }else{ Log.d("internet status","no Internet Access"); }
источник
Сделать это можно с помощью
ConnectivityManager
API для android. Это позволяет вам проверить, подключены ли вы к Интернету, и тип подключения к Интернету, к которому вы подключены. В основном, с учетом или без учета.Чтобы проверить подключение к Интернету.
ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting();
Ссылка на документацию: https://developer.android.com/training/monitoring-device-state/connectivity-status-type
источник
private static NetworkUtil mInstance; private volatile boolean mIsOnline; private NetworkUtil() { ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor(); exec.scheduleAtFixedRate(new Runnable() { @Override public void run() { boolean reachable = false; try { Process process = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com"); int returnVal = process.waitFor(); reachable = (returnVal==0); } catch (Exception e) { e.printStackTrace(); } mIsOnline = reachable; } }, 0, 5, TimeUnit.SECONDS); } public static NetworkUtil getInstance() { if (mInstance == null) { synchronized (NetworkUtil.class) { if (mInstance == null) { mInstance = new NetworkUtil(); } } } return mInstance; } public boolean isOnline() { return mIsOnline; }
Надеюсь, что приведенный выше код поможет вам, также убедитесь, что у вас есть доступ в Интернет в приложении ur.
источник
Последний способ сделать это из документации - использовать
ConnectivityManager
для запроса активной сети и определить, есть ли у нее подключение к Интернету.public boolean hasInternetConnectivity() { ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); return (activeNetwork != null && activeNetwork.isConnectedOrConnecting()); }
Добавьте эти два разрешения в свой файл AndroidManifest.xml:
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
источник
Проверьте тип Wi-Fi в диспетчере подключения:
//check network connection ConnectivityManager cm = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); boolean hasNetworkConnection = activeNetwork != null && activeNetwork.isConnectedOrConnecting(); System.out.println("Connection ? : " + hasNetworkConnection); //check wifi boolean hasWifiConnection = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI; System.out.println("Wifi ? : " + hasWifiConnection);
В документации Android «TYPE_WIFI» описывается как «соединение для передачи данных WIFI. Устройства могут поддерживать более одного.
источник
Хорошее решение для проверки наличия подключения к Интернету в активной сети:
public boolean isNetworkAvailable(Context context) { ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (connectivityManager != null) { Network network = connectivityManager.getActiveNetwork(); NetworkCapabilities networkCapabilities = connectivityManager.getNetworkCapabilities(network); return networkCapabilities != null && networkCapabilities .hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); } return false; }
источник
Вы можете использовать ConnectivityManager.
val cm = getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val activeNetwork: NetworkInfo? = cm.activeNetworkInfo val dialogBuilder = AlertDialog.Builder(this) if (activeNetwork!=null) // Some network is available { if (activeNetwork.isConnected) { // Network is connected to internet }else{ // Network is NOT connected to internet }
Проверить это и это
источник
Используйте следующий класс , обновленный до последнего уровня API: 29.
// License: MIT // http://opensource.org/licenses/MIT package net.i2p.android.router.util; import android.content.Context; import android.net.ConnectivityManager; import android.net.Network; import android.net.NetworkCapabilities; import android.net.NetworkInfo; import android.os.AsyncTask; import android.os.Build; import android.telephony.TelephonyManager; import java.io.IOException; import java.net.InetSocketAddress; import java.net.Socket; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.concurrent.CancellationException; /** * Check device's network connectivity and speed. * * @author emil http://stackoverflow.com/users/220710/emil * @author str4d * @author rodrigo https://stackoverflow.com/users/5520417/rodrigo */ public class ConnectivityAndInternetAccessCheck { private static ArrayList < String > hosts = new ArrayList < String > () { { add("google.com"); add("facebook.com"); add("apple.com"); add("amazon.com"); add("twitter.com"); add("linkedin.com"); add("microsoft.com"); } }; /** * Get the network info. * * @param context the Context. * @return the active NetworkInfo. */ private static NetworkInfo getNetworkInfo(Context context) { NetworkInfo networkInfo = null; ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (cm != null) { networkInfo = cm.getActiveNetworkInfo(); } return networkInfo; } /** * Gets the info of all networks * @param context The context * @return an array of @code{{@link NetworkInfo}} */ private static NetworkInfo[] getAllNetworkInfo(Context context) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); return cm.getAllNetworkInfo(); } /** * Gives the connectivity manager * @param context The context * @return the @code{{@link ConnectivityManager}} */ private static ConnectivityManager getConnectivityManager(Context context) { return (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); } /** * Check if there is any connectivity at all. * * @param context the Context. * @return true if we are connected to a network, false otherwise. */ public static boolean isConnected(Context context) { boolean isConnected = false; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { ConnectivityManager connectivityManager = ConnectivityAndInternetAccessCheck.getConnectivityManager(context); Network[] networks = connectivityManager.getAllNetworks(); networksloop: for (Network network: networks) { if (network == null) { isConnected = false; } else { NetworkCapabilities networkCapabilities = connectivityManager.getNetworkCapabilities(network); if(networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)){ isConnected = true; break networksloop; } else { isConnected = false; } } } } else { NetworkInfo[] networkInfos = ConnectivityAndInternetAccessCheck.getAllNetworkInfo(context); networkinfosloop: for (NetworkInfo info: networkInfos) { // Works on emulator and devices. // Note the use of isAvailable() - without this, isConnected() can // return true when Wifi is disabled. // http://stackoverflow.com/a/2937915 isConnected = info != null && info.isAvailable() && info.isConnected(); if (isConnected) { break networkinfosloop; } } } return isConnected; } /** * Check if there is any connectivity to a Wifi network. * * @param context the Context. * @return true if we are connected to a Wifi network, false otherwise. */ public static boolean isConnectedWifi(Context context) { boolean isConnectedWifi = false; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { ConnectivityManager connectivityManager = ConnectivityAndInternetAccessCheck.getConnectivityManager(context); Network[] networks = connectivityManager.getAllNetworks(); networksloop: for (Network network: networks) { if (network == null) { isConnectedWifi = false; } else { NetworkCapabilities networkCapabilities = connectivityManager.getNetworkCapabilities(network); if(networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)){ if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { isConnectedWifi = true; break networksloop; } else { isConnectedWifi = false; } } } } } else { NetworkInfo[] networkInfos = ConnectivityAndInternetAccessCheck.getAllNetworkInfo(context); networkinfosloop: for (NetworkInfo n: networkInfos) { isConnectedWifi = n != null && n.isAvailable() && n.isConnected() && n.getType() == ConnectivityManager.TYPE_WIFI; if (isConnectedWifi) { break networkinfosloop; } } } return isConnectedWifi; } /** * Check if there is any connectivity to a mobile network. * * @param context the Context. * @return true if we are connected to a mobile network, false otherwise. */ public static boolean isConnectedMobile(Context context) { boolean isConnectedMobile = false; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { ConnectivityManager connectivityManager = ConnectivityAndInternetAccessCheck.getConnectivityManager(context); Network[] allNetworks = connectivityManager.getAllNetworks(); networksloop: for (Network network: allNetworks) { if (network == null) { isConnectedMobile = false; } else { NetworkCapabilities networkCapabilities = connectivityManager.getNetworkCapabilities(network); if(networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)){ if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) { isConnectedMobile = true; break networksloop; } else { isConnectedMobile = false; } } } } } else { NetworkInfo[] networkInfos = ConnectivityAndInternetAccessCheck.getAllNetworkInfo(context); networkinfosloop: for (NetworkInfo networkInfo: networkInfos) { isConnectedMobile = networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected() && networkInfo.getType() == ConnectivityManager.TYPE_MOBILE; if (isConnectedMobile) { break networkinfosloop; } } } return isConnectedMobile; } /** * Check if there is fast connectivity. * * @param context the Context. * @return true if we have "fast" connectivity, false otherwise. */ public static boolean isConnectedFast(Context context) { boolean isConnectedFast = false; if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { NetworkInfo[] networkInfos = ConnectivityAndInternetAccessCheck.getAllNetworkInfo(context); networkInfosloop: for (NetworkInfo networkInfo: networkInfos) { isConnectedFast = networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected() && isConnectionFast(networkInfo.getType(), networkInfo.getSubtype()); if (isConnectedFast) { break networkInfosloop; } } } else { throw new UnsupportedOperationException(); } return isConnectedFast; } /** * Check if the connection is fast. * * @param type the network type. * @param subType the network subtype. * @return true if the provided type/subtype combination is classified as fast. */ private static boolean isConnectionFast(int type, int subType) { if (type == ConnectivityManager.TYPE_WIFI) { return true; } else if (type == ConnectivityManager.TYPE_MOBILE) { switch (subType) { case TelephonyManager.NETWORK_TYPE_1xRTT: return false; // ~ 50-100 kbps case TelephonyManager.NETWORK_TYPE_CDMA: return false; // ~ 14-64 kbps case TelephonyManager.NETWORK_TYPE_EDGE: return false; // ~ 50-100 kbps case TelephonyManager.NETWORK_TYPE_EVDO_0: return true; // ~ 400-1000 kbps case TelephonyManager.NETWORK_TYPE_EVDO_A: return true; // ~ 600-1400 kbps case TelephonyManager.NETWORK_TYPE_GPRS: return false; // ~ 100 kbps case TelephonyManager.NETWORK_TYPE_HSDPA: return true; // ~ 2-14 Mbps case TelephonyManager.NETWORK_TYPE_HSPA: return true; // ~ 700-1700 kbps case TelephonyManager.NETWORK_TYPE_HSUPA: return true; // ~ 1-23 Mbps case TelephonyManager.NETWORK_TYPE_UMTS: return true; // ~ 400-7000 kbps /* * Above API level 7, make sure to set android:targetSdkVersion * to appropriate level to use these */ case TelephonyManager.NETWORK_TYPE_EHRPD: // API level 11 return true; // ~ 1-2 Mbps case TelephonyManager.NETWORK_TYPE_EVDO_B: // API level 9 return true; // ~ 5 Mbps case TelephonyManager.NETWORK_TYPE_HSPAP: // API level 13 return true; // ~ 10-20 Mbps case TelephonyManager.NETWORK_TYPE_IDEN: // API level 8 return false; // ~25 kbps case TelephonyManager.NETWORK_TYPE_LTE: // API level 11 return true; // ~ 10+ Mbps // Unknown case TelephonyManager.NETWORK_TYPE_UNKNOWN: default: return false; } } else { return false; } } public ArrayList < String > getHosts() { return hosts; } public void setHosts(ArrayList < String > hosts) { this.hosts = hosts; } //TODO Debug on devices /** * Checks that Internet is available by pinging DNS servers. */ private static class InternetConnectionCheckAsync extends AsyncTask < Void, Void, Boolean > { private Context context; /** * Creates an instance of this class * @param context The context */ public InternetConnectionCheckAsync(Context context) { this.setContext(context); } /** * Cancels the activity if the device is not connected to a network. */ @Override protected void onPreExecute() { if (!ConnectivityAndInternetAccessCheck.isConnected(getContext())) { cancel(true); } } /** * Tells whether there is Internet access * @param voids The list of arguments * @return True if Internet can be accessed */ @Override protected Boolean doInBackground(Void...voids) { return isConnectedToInternet(getContext()); } @Override protected void onPostExecute(Boolean aBoolean) { super.onPostExecute(aBoolean); } /** * The context */ public Context getContext() { return context; } public void setContext(Context context) { this.context = context; } } //network calls shouldn't be called from main thread otherwise it will throw //NetworkOnMainThreadException /** * Tells whether Internet is reachable * @return true if Internet is reachable, false otherwise * @param context The context */ public static boolean isInternetReachable(Context context) { try { return new InternetConnectionCheckAsync(context).execute().get(); } catch (CancellationException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return false; } /** * Tells whether there is Internet connection * @param context The context * @return @code {true} if there is Internet connection */ private static boolean isConnectedToInternet(Context context) { boolean isAvailable = false; if (!ConnectivityAndInternetAccessCheck.isConnected(context)) { isAvailable = false; } else { try { foreachloop: for (String h: new ConnectivityAndInternetAccessCheck().getHosts()) { if (isHostAvailable(h)) { isAvailable = true; break foreachloop; } } } catch (IOException e) { e.printStackTrace(); } } return isAvailable; } /** * Checks if the host is available * @param hostName * @return * @throws IOException */ private static boolean isHostAvailable(String hostName) throws IOException { try (Socket socket = new Socket()) { int port = 80; InetSocketAddress socketAddress = new InetSocketAddress(hostName, port); socket.connect(socketAddress, 3000); return true; } catch (UnknownHostException unknownHost) { return false; } } }
источник
Вы можете сделать это с помощью очень простого класса.
class CheckInternet { fun isNetworkAvailable(context: Context): Boolean { val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager? val activeNetworkInfo = connectivityManager!!.activeNetworkInfo return activeNetworkInfo != null && activeNetworkInfo.isConnected } }
Теперь вы можете проверить это в любом классе.
if (CheckInternet().isNetworkAvailable(this)) { //connected with internet }else{ //Not connected with internet }
источник