我使用此代码检查互联网是否可用..
ConnectivityManager connectivity = (ConnectivityManager) _context
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity != null) {
NetworkInfo[] info = connectivity.getAllNetworkInfo();
if (info != null)
for (int i = 0; i < info.length; i++)
if (info[i].getState() == NetworkInfo.State.CONNECTED && info[i].isAvailable())
{
return true;
}
}
return false;
但我想要的是:
假设wifi已连接,但wifi没有互联网...如何检查互联网数据是否可用wifi即可连接Wifi已连接..如果我使用abouve代码,它只检查wifi是连接还是断开..这将是感恩的如果有人给我一个解决方案......
答案 0 :(得分:3)
最简单的方法是发送http请求,如果您的http请求超时,那么您没有互联网连接,或者您可以检查更多响应代码。当您连接到WiFi但WiFi路由器没有与ISP的活动连接时,会出现您提到的情况。最好的事情是依赖http请求imo。
以下是示例代码:
try
{
HttpGet request = new HttpGet(url));
HttpParams httpParameters = new BasicHttpParams();
// Set the timeout in milliseconds until a connection is established.
// The default value is zero, that means the timeout is not used.
int timeoutConnection = 60000;
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
// Set the default socket timeout (SO_TIMEOUT)
// in milliseconds which is the timeout for waiting for data.
int timeoutSocket = 60000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
// create object of DefaultHttpClient
DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
request.addHeader("Content-Type", "application/json");
HttpResponse response = httpClient.execute(request);
// get response entity
HttpEntity entity = response.getEntity();
// convert entity response to string
if (entity != null)
{
result = EntityUtils.toString(entity);
}
}
catch (SocketException e)
{
return "-222" + e.toString();
}
catch (Exception e)
{
return "-333" + e.toString();
}
答案 1 :(得分:1)
是VendettaDroid是对的。
此处还有检查WIFI互联网的代码并检查航班模式是否为ON / OFF,如果您正在制作Web应用程序,则必须处理航班模式
// Check Flight mode ON/OFF
if (Settings.System.getInt(context.getContentResolver(),
Settings.System.AIRPLANE_MODE_ON, 0) == 0) {
// Flight mode ON not able to access internet
}
检查wifi和互联网可用性
ConnectivityManager cm;
cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
if (cm.getActiveNetworkInfo() != null
&& cm.getActiveNetworkInfo().isAvailable()
&& cm.getActiveNetworkInfo().isConnected()) {
// Internet is availble.
}
答案 2 :(得分:1)
刚刚在Play商店中获得了最新的“Mobile Free”标题 https://play.google.com/store/apps/details?id=com.mobilefree
NetworkInfo.isAvailable()只是告诉您是否有可用于连接的物理网络。 NetworkInfo.isConnected()只是告诉您已连接到物理网络。
物理网络可以是WIFI,MOBILE,ETHER等......传输层。
仅仅因为您连接到网络并不意味着网络具有互联网(应用层)。
网络可以拥有各种应用程序协议。 TCP,DNS和HTTP不是唯一的。
在Android中检查实际的互联网可用性实际上非常困难。 要做到这一点,有许多限制需要克服。
isReachable()方法使用ICMP ping主机。这可能很难设置。
同样,根据设备,权限,API,操作系统版本等,调用网址可能会受到同等限制。
如果你不必这样做,不要。没有强大的方法可以在所有设备上运行。
这不是“移动免费”的核心用例,它只管理移动计费(开/关)。
有趣的是,您实际上可以使用移动设备,但没有互联网且仍然可以收费。
答案 3 :(得分:0)
非常感谢你的建议......
我实际上找到了一些解决方案:
我用过try \ catch:
try{
//calling url
}
catch(UnknownHostException e){
e.printStackTrace();
Connection_error();
}
catch (ConnectException e) {
e.printStackTrace();
Connection_error();
}
感谢All ...
答案 4 :(得分:0)
您可以阅读wifi current state..
SupplicantState supState;
wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
supState = wifiInfo.getSupplicantState();
另请查看this approach。
答案 5 :(得分:-1)
尝试以下代码: -
public static boolean netConnect(Context ctx) {
ConnectivityManager cm;
NetworkInfo info = null;
try {
cm = (ConnectivityManager) ctx
.getSystemService(Context.CONNECTIVITY_SERVICE);
info = cm.getActiveNetworkInfo();
} catch (Exception e) {
e.printStackTrace();
}
if (info != null) {
return true;
} else {
return false;
}
}