我有一个代码来确定是否有网络连接:
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnected())
{
// There is an internet connection
}
但是,如果有网络连接而且没有互联网,这是没用的。我必须ping一个网站并等待响应或超时以确定互联网连接:
URL sourceUrl;
try {
sourceUrl = new URL("http://www.google.com");
URLConnection Connection = sourceUrl.openConnection();
Connection.setConnectTimeout(500);
Connection.connect();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
// no Internet
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
// no Internet
}
但这是一个缓慢的检测。我应该学习一种快速的方法来检测它。
提前致谢。
答案 0 :(得分:2)
尝试以下方法来检测不同类型的连接:
private boolean haveNetworkConnection(Context context)
{
boolean haveConnectedWifi = false;
boolean haveConnectedMobile = false;
ConnectivityManager cm = (ConnectivityManager) Your_Activity_Name.this.getSystemService(Context.CONNECTIVITY_SERVICE);
// or if function is out side of your Activity then you need context of your Activity
// and code will be as following
// (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo[] netInfo = cm.getAllNetworkInfo();
for (NetworkInfo ni : netInfo)
{
if (ni.getTypeName().equalsIgnoreCase("WIFI"))
{
if (ni.isConnected())
{
haveConnectedWifi = true;
System.out.println("WIFI CONNECTION AVAILABLE");
} else
{
System.out.println("WIFI CONNECTION NOT AVAILABLE");
}
}
if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
{
if (ni.isConnected())
{
haveConnectedMobile = true;
System.out.println("MOBILE INTERNET CONNECTION AVAILABLE");
} else
{
System.out.println("MOBILE INTERNET CONNECTION NOT AVAILABLE");
}
}
}
return haveConnectedWifi || haveConnectedMobile;
}
答案 1 :(得分:1)
所有这些计划的问题在于“互联网”并不是一个实体。有一个原因导致连接尝试失败被报告为“无法访问”或“无法连接到blahblah服务器”。例子:
1)你没有信号。你连接到互联网了吗? PING会成功吗?你能连接到目标服务器吗?
2)您有信号,但已超出您的提供商数据限额。你连接到互联网了吗? PING会成功吗?你能连接到目标服务器吗?
3)您的提供商连接正常,但他们的骨干路由器已关闭。你连接到互联网了吗? PING会成功吗?你能连接到目标服务器吗?
4)您的提供商连接正常,他们的骨干路由器已启动但是服务器所在的国家X的光纤连接被一些醉酒的船长和他的船锚所打断。你连接到互联网了吗? PING会成功吗?你能连接到目标服务器吗?
5)目标国家的所有链接都已启动,但Fred和他挖掘的JCB已经切断了到服务器群的电源线。 Fred的其他工作之一是为备份生成器提供服务:(你是否已连接到互联网?PING会成功吗?你能连接到你的目标服务器吗?
6)所有的硬件都已启动,但是服务器代码是由Fred编写的,之后他因为无能而被降级为沟渠挖掘者,现在又崩溃了。你连接到互联网了吗? PING会成功吗?你能连接到目标服务器吗? 7)弗雷德休息了一天,但他的替代,称职的服务器管理员已阻止路由器中的ICMP ping以防止ping DOS攻击。你连接到互联网了吗? PING会成功吗?你能连接到目标服务器吗?因此,可靠的方法是尝试连接到目标服务器,看看会发生什么。
你肯定可以更快地发现一些负面情况 - 当然如果没有信号,你就无法获得连接:)过去,你应该尝试连接。告诉用户发生了什么,使用超时并为用户提供“取消”按钮。这是你能做的最好的事情。
答案 2 :(得分:1)
这个怎么样?
确保您拥有有效的WiFi连接,现在使用WifiManager.getConnectionInfo()
返回有关当前Wi-Fi连接的动态信息WifiInfo,您可以获得WifiInfo.getLinkSpeed()
,这样就可以获得当前的链接速度并检查一些最小值。