Android Internet连接检查更好的方法

根据Android开发者网站“ 确定和监控连接状态” ,我们可以检查是否存在活动的Internet连接。 但即使只连接了Wi-Fi而没有互联网可用(它通知有互联网连接),这也无效。

现在我ping一个网站,检查互联网连接是否可用。 而且这种方法需要更多的处理时间。 是否有更好的方法来检查Internet连接,以避免ping地址的时间延迟?

尝试这个:

它非常简单快速:

public boolean isInternetAvailable(String address, int port, int timeoutMs) { try { Socket sock = new Socket(); SocketAddress sockaddr = new InetSocketAddress(address, port); sock.connect(sockaddr, timeoutMs); // This will block no more than timeoutMs sock.close(); return true; } catch (IOException e) { return false; } } 

然后,无论你想检查哪一个,只需使用:

 if (isInternetAvailable("8.8.8.8", 53, 1000)) { // Internet available, do something } else { // Internet not available } 

请尝试以下方法:

 public boolean checkOnlineState() { ConnectivityManager CManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo NInfo = CManager.getActiveNetworkInfo(); if (NInfo != null && NInfo.isConnectedOrConnecting()) { return true; } return false; } 

不要忘记访问:

   

其他:

 if (InetAddress.getByName("www.google.com").isReachable(timeout)) { } else { } 

您应该明确的第一个问题是,您whether internet is available什么意思?

  • 未连接到wifi或蜂窝网络;
  • 连接到有限的无线网络:例如,在学校网络中,如果您连接到学校wifi,您可以直接访问内部网。 但您必须使用学校帐户登录才能访问外联网。 在这种情况下,如果您ping外网网站,您可能会收到响应,因为某些内部网自动重定向到登录页面;
  • 连接无限wifi:您可以免费访问大多数网站;

第二个问题是你想要实现什么?

据我了解你的描述,你似乎想测试网络的连接,并提醒用户是否失败。 所以我建议你只需ping你的服务器,如果你想与它交换数据,这总是很好。


您想知道是否有更好的方法来测试连接性,答案是否定的。

当前的TCP / IP网络是虚拟电路,分组交换网络,这意味着没有固定的“路径”来运行数据,即不像电话,我们在两个用户之间有真正的连接,我们可以知道电路断开后,连接立即丢失。 我们必须发送一个数据包到目的地,并找不到响应,然后我们知道,我们失去了连接(这是ping – ICMP协议 – 做的)。

总之,除了ping之外,我们没有更好的方法来测试与主机的连接,这就是为什么在服务管理中使用心跳的原因。

在检查此问题时,它发现我们无法使用开发人员站点中指定的方法确定是否存在活动的Internet连接: https : //developer.android.com/training/monitoring-device-state/connectivity-monitoring。 HTML

这只会检查其他wifi的有效连接。

所以我find了两种方法来检查是否存在活动的互联网连接

1.使用以下方法建立网站

 URL url = new URL(myUrl); HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); // 30 second time out. httpURLConnection.setConnectTimeout(30000); httpURLConnection.connect(); if (httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK) { isAvailable = true; } 

2.使用套接字检查Google DNS的可用性

  try { Socket sock = new Socket(); SocketAddress sockaddr = new InetSocketAddress("8.8.8.8", 53); sock.connect(sockaddr, 1000); // this will block no more than timeoutMs sock.close(); return true; } 

第二种方法比第二种方法快一点(适合我的要求)

谢谢大家的答案和支持。

如果您在WIFI上有活动连接,ConnectivityManager将无法告诉您。

检查我们是否具有活动Internet连接的唯一选项是ping URL。 但是,您不需要对从应用程序发出的每个HTTP请求执行此操作。

你可以做什么:

  1. 使用以下代码检查连接

     private boolean checkInternetConnection() { ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); // test for connection if (cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isAvailable() && cm.getActiveNetworkInfo().isConnected()) { return true; } else { return false; } } 
  2. 而使用HTTP客户端设置rest时间设置为10秒。 如果您在10秒内没有得到响应,则意味着您没有活动的互联网连接并且将抛出exception(大多数情况下您会在10秒内得到响应)。 无需每次都通过ping来检查活动连接(如果您没有制作聊天或VOIP应用程序)

也许这可以帮助你:

 private boolean checkInternetConnection() { ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); // Test for connection if (cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isAvailable() && cm.getActiveNetworkInfo().isConnected()) { return true; } else { return false; } } 

试试这个方法,这会对你有所帮助:

 public static boolean isNetworkConnected(Context context) { ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (connectivityManager != null) { NetworkInfo netInfo = connectivityManager.getActiveNetworkInfo(); if (netInfo != null && netInfo.isConnected()) { return true; } } return false; } 

您可以尝试此操作来检查Internet连接:

 /** * Check Connectivity of network. */ public static boolean isOnline(Context context) { try { if (context == null) return false; ConnectivityManager cm = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); if (cm != null) { if (cm.getActiveNetworkInfo() != null) { return cm.getActiveNetworkInfo().isConnected(); } else { return false; } } else { return false; } } catch (Exception e) { Log.error("Exception", e); return false; } } 

在您的活动中,您可以像这样调用此函数。

 if(YourClass.isOnline(context)) { // Do your stuff here. } else { // Show alert, no Internet connection. } 

不要忘记添加ACCESS_NETWORK_STATE PERMISSION:

  

如果您只想pingurl,请尝试此操作:

 public static boolean isPingAvailable(String myUrl) { boolean isAvailable = false; try { URL url = new URL(myUrl); HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); // 30 second time out. httpURLConnection.setConnectTimeout(30000); httpURLConnection.connect(); if (httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK) { isAvailable = true; } } catch (Exception e) { isAvailable = false; e.printStackTrace(); } return isAvailable; } 

我想评论,但声誉不够:/

无论如何,接受的答案的一个问题是它没有捕获SocketTimeoutException,我在野外(Android)中看到导致崩溃。

 public boolean isInternetAvailable(String address, int port, int timeoutMs) { try { Socket sock = new Socket(); SocketAddress sockaddr = new InetSocketAddress(address, port); sock.connect(sockaddr, timeoutMs); // This will block no more than timeoutMs sock.close(); return true; } catch (IOException e) { return false; } catch (SocketTimeoutException e) { return false; } }