如何检查 Android 中的连接
How to check connection in Android
我必须实现一个控制互联网连接存在的功能,我需要准确地知道你是否可以浏览但不知道你是否连接到 wifi 或数据。
可能会出现连接到网络但无法浏览的情况,例如,当您连接到开放的 wifi 网络(例如麦当劳)但要导航时需要登录,连接可用但您无法浏览。
在那种情况下,我就足以利用设置的超时时间(但从未考虑过)。
我尝试实现不同的功能,但我无法得到想要的结果,例如:
public boolean checkConnection() {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
boolean response;
if (netInfo != null && netInfo.isConnected()) {
try {
URL url = new URL("http://www.google.it");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(1000);
conn.connect();
response = conn.getResponseCode() == 200;
conn.disconnect();
} catch (Exception e) {
response = false;
}
} else {
response = false;
}
return response;
}
另一个函数:
public boolean isInternetAvailable(String address, int port, int timeoutMs) {
try {
Socket sock = new Socket();
SocketAddress sockaddr = new InetSocketAddress(address, port);
sock.connect(sockaddr, timeoutMs);
sock.close();
return true;
} catch (IOException e) { return false; } }
此函数从不考虑超时。
我该如何解决我的问题??
****************** 编辑 1 ****************
我正在通过 wifi 连接到网络的平板电脑上测试代码,我通过防火墙阻止了所有连接,以模拟 ever question 中描述的情况。使用向我建议的代码,您会注意到超时值从未得到遵守,应用程序出现异常:
Exception: java.net.UnknownHostException: Unable to resolve host
"www.google.com": No address associated with hostname.
真正的问题是所有这些功能都花了太长时间才告诉我没有连接,我需要一个在 1/2 秒内响应的功能
你完全可以做其他事情。
在服务器上有一项始终 运行 的服务,并确保您拥有该服务的 url。
每次您要检查连接时,从您的应用程序调用该服务。检查该服务的响应代码,或者可能 return 给你一些东西。根据结果代码或服务 returns 的数据,您可以断定您是否有可用的互联网连接。
也许有更简单的方法来完成您的要求,但这个方法肯定有效。
1.public void checkOnlineState() {
ConnectivityManager CManager =
(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo NInfo = CManager.getActiveNetworkInfo();
if (NInfo != null && NInfo.isConnectedOrConnecting()) {
if (InetAddress.getByName("www.xy.com").isReachable(timeout))
{
// host reachable
}
else
{
// host not reachable
}
}
return;
}
you can check whether you can access url or not by this code
检查您是否有输出互联网连接的最简单方法是 ping 一些随机服务器(www.google.com
可能是一个很好的例子):
InetAddress.getByName("www.google.com").isReachable(5000)
我必须实现一个控制互联网连接存在的功能,我需要准确地知道你是否可以浏览但不知道你是否连接到 wifi 或数据。
可能会出现连接到网络但无法浏览的情况,例如,当您连接到开放的 wifi 网络(例如麦当劳)但要导航时需要登录,连接可用但您无法浏览。
在那种情况下,我就足以利用设置的超时时间(但从未考虑过)。
我尝试实现不同的功能,但我无法得到想要的结果,例如:
public boolean checkConnection() {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
boolean response;
if (netInfo != null && netInfo.isConnected()) {
try {
URL url = new URL("http://www.google.it");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(1000);
conn.connect();
response = conn.getResponseCode() == 200;
conn.disconnect();
} catch (Exception e) {
response = false;
}
} else {
response = false;
}
return response;
}
另一个函数:
public boolean isInternetAvailable(String address, int port, int timeoutMs) {
try {
Socket sock = new Socket();
SocketAddress sockaddr = new InetSocketAddress(address, port);
sock.connect(sockaddr, timeoutMs);
sock.close();
return true;
} catch (IOException e) { return false; } }
此函数从不考虑超时。
我该如何解决我的问题??
****************** 编辑 1 ****************
我正在通过 wifi 连接到网络的平板电脑上测试代码,我通过防火墙阻止了所有连接,以模拟 ever question 中描述的情况。使用向我建议的代码,您会注意到超时值从未得到遵守,应用程序出现异常:
Exception: java.net.UnknownHostException: Unable to resolve host "www.google.com": No address associated with hostname.
真正的问题是所有这些功能都花了太长时间才告诉我没有连接,我需要一个在 1/2 秒内响应的功能
你完全可以做其他事情。
在服务器上有一项始终 运行 的服务,并确保您拥有该服务的 url。
每次您要检查连接时,从您的应用程序调用该服务。检查该服务的响应代码,或者可能 return 给你一些东西。根据结果代码或服务 returns 的数据,您可以断定您是否有可用的互联网连接。
也许有更简单的方法来完成您的要求,但这个方法肯定有效。
1.public void checkOnlineState() {
ConnectivityManager CManager =
(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo NInfo = CManager.getActiveNetworkInfo();
if (NInfo != null && NInfo.isConnectedOrConnecting()) {
if (InetAddress.getByName("www.xy.com").isReachable(timeout))
{
// host reachable
}
else
{
// host not reachable
}
}
return;
}
you can check whether you can access url or not by this code
检查您是否有输出互联网连接的最简单方法是 ping 一些随机服务器(www.google.com
可能是一个很好的例子):
InetAddress.getByName("www.google.com").isReachable(5000)