如何以编程方式检查Android中的互联网连接的可用性?

我想以编程方式检查在android手机/模拟器中是否有互联网连接。 所以,一旦我确定互联网连接存在,我就会打电话给互联网。

所以它就像“嗨模拟器!如果你有一个互联网连接,那么请打开此页面,否则doSomeThingElse();”

希望你明白了。 我非常感谢我很早就需要一个快速的回应。

Solutions Collecting From Web of "如何以编程方式检查Android中的互联网连接的可用性?"

我为自己实施的方法:

/* * isOnline - Check if there is a NetworkConnection * @return boolean */ protected boolean isOnline() { ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo netInfo = cm.getActiveNetworkInfo(); if (netInfo != null && netInfo.isConnected()) { return true; } else { return false; } } 

请注意这是一个NetworkConnection-Check。 如果有一个networking连接,它不必是一个Internet连接。

连接到networking不保证互联网连接。

你可能会连接到你家的wifi,但你可能没有互联网连接。 或者,你可能在一家餐馆,在那里你可以连接到无线networking,但仍然需要密码热点才能使用互联网。 在这种情况下,上述方法将返回true,但该设备不会有互联网,如果没有包围正确的尝试和捕获,应用程序可能会崩溃。

底线,networking连接,并不意味着互联网连接,它只是意味着你的设备的无线硬件可以连接到另一台主机,都可以build立连接。

下面是一个方法,可以检查设备是否可以连接到网站,并相应地返回一个答案。

 if (networkConnectivity()) { try { HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.anywebsiteyouthinkwillnotbedown.com").openConnection()); urlc.setRequestProperty("User-Agent", "Test"); urlc.setRequestProperty("Connection", "close"); urlc.setConnectTimeout(3000); //choose your own timeframe urlc.setReadTimeout(4000); //choose your own timeframe urlc.connect(); networkcode2 = urlc.getResponseCode(); return (urlc.getResponseCode() == 200); } catch (IOException e) { return (false); //connectivity exists, but no internet. } } else { return false; //no connectivity } 

至于问题标题,你想检查互联网接入,

所以最快的方法至less现在是有效率的,

thnx基于他的回答levit https://stackoverflow.com/a/27312494/3818437

如果你只想检查一个连接到任何networking – 不关心互联网是否可用 – 那么这里的大部分答案(包括被接受的),实现isConnectedOrConnecting()都将工作正常。 如果你想知道你是否有互联网连接(如问题标题所示),请阅读Ping主要的名称服务器

  public boolean isOnline() { Runtime runtime = Runtime.getRuntime(); try { Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8"); int exitValue = ipProcess.waitFor(); return (exitValue == 0); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } return false; } 

而已! 是的,这很快,不需要在后台运行,不需要root权限。

可能的问题

这真的够快吗?

是的,非常快!

是否真的没有可靠的方法来检查互联网是否可用,除了在互联网上testing的东西?

据我所知,但让我知道,我会编辑我的答案。

我不能只是ping我自己的网页,我想要求吗?

当然! 你甚至可以检查两者,如果你想区分“互联网连接可用”和你自己的服务器beeing可达

如果DNSclosures,该怎么办?

Google DNS(例如8.8.8.8)是全球最大的公共DNS服务。 截至2013年,它每天提供1300亿个请求。 让我们只是说,你的应用程序没有回应可能不是今天的谈话。

哪些权限是必需的?

只是互联网接入 – 什么惊喜^^(顺便说一句,你有没有想过,如何在这里build议的一些方法甚至可以有一个关于互联网的可用性的远程胶水,没有这种许可?)

我一直在使用这两种方法来检查互联网状态有时https协议不起作用尝试http协议

 // Check if network is available public static boolean isNetworkAvailable() { ConnectivityManager cm = (ConnectivityManager) AppGlobals.getContext().getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = cm.getActiveNetworkInfo(); return networkInfo != null && networkInfo.isConnected(); } // ping the google server to check if internet is really working or not public static 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; } 

尝试这个:

 ConnectivityManager connec = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); if(connec.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED || connec.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTING ) { text.setText("hey your online!!!") ; //Do something in here when we are connected } else if(connec.getNetworkInfo(0).getState() == NetworkInfo.State.DISCONNECTED || connec.getNetworkInfo(1).getState() == NetworkInfo.State.DISCONNECTED ) { text.setText("Look your not online"); } 

因为你连接到一个networking并不担心你有互联网,所以我已经去了一个try catch块的电话。 然后赶上UnknownHostException来处理没有互联网。

从我的老人在这里回答

试试这个

我已经应用了@Levit提供的解决scheme,并创build了不会调用额外的Http请求的函数。

它将解决Unable to Resolve Host的错误

 public static boolean isInternetAvailable(Context context) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); if (activeNetwork == null) return false; switch (activeNetwork.getType()) { case ConnectivityManager.TYPE_WIFI: if ((activeNetwork.getState() == NetworkInfo.State.CONNECTED || activeNetwork.getState() == NetworkInfo.State.CONNECTING) && isInternet()) return true; break; case ConnectivityManager.TYPE_MOBILE: if ((activeNetwork.getState() == NetworkInfo.State.CONNECTED || activeNetwork.getState() == NetworkInfo.State.CONNECTING) && isInternet()) return true; break; default: return false; } return false; } private static boolean isInternet() { Runtime runtime = Runtime.getRuntime(); try { Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8"); int exitValue = ipProcess.waitFor(); Debug.i(exitValue + ""); return (exitValue == 0); } catch (IOException | InterruptedException e) { e.printStackTrace(); } return false; } 

现在称之为,

 if (!isInternetAvailable(getActivity())) { //Show message } else { //Perfoem the api request }