关于如何在Android中检测网络连接,有很多问题。 https://stackoverflow.com/a/4239019/90236提供了非常详细的答案,https://stackoverflow.com/a/8548926/90236显示了识别网络连接的网络类型的方法。
我们使用类似于以下代码的代码检测网络连接:
private boolean isNetworkAvailable() {
ConnectivityManager connectivityManager
= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}
这使我们可以警告用户是否处于离线状态。但是,它无法帮助我们确定用户是否具有有限的连接。连接有限的条件导致用户抱怨。其中包括:
用户连接到家庭wifi网络,但有线调制解调器或Internet服务不可用。
用户在酒店或咖啡店成功连接到wifi网络,但网络要求他们在获得完全网络访问权限之前登录或同意服务条款。
在这两种情况下,我们的isNetworkAvailable()测试返回true。操作系统告诉我们我们已连接到网络。但是,用户没有可用的Internet连接。
有没有一种好方法可以确定用户是否具有完整功能的网络连接?
我正在考虑调用轻量级Web服务来验证其连接,并在应用程序未从服务获得有效返回时警告用户。这有点矫枉过正吗?还是让其他人不得不采用类似的技巧?
答案 0 :(得分:8)
是否有一种很好的方法可以确定用户是否具有完整功能的网络连接?
尝试从某个地方下载内容。理想情况下,“某处”是您自己的服务器,用于测试设备与服务器之间的连接。
唉,doesTehConnexionSuck()
上没有iCanHazBandwidth()
或ConnectivityManager
方法。 : - )
这是否过度?
本着“金发姑娘和三只熊”的精神,我将其描述为justrightkill。
答案 1 :(得分:3)
为了完整起见,让我发布一些我已添加的代码。我认为发出Http请求是相当通用的HttpClient代码,并在请求成功时返回true。我使用了HttpHead,因为我不关心响应中的实体,这应该让它更快。此方法位于名为ConnectivityHelper的类中,DefaultSettings是一个定义了一堆有用常量的类。
public static boolean isNetworkAvailable() {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo;
try {
netInfo = manager.getActiveNetworkInfo();
} catch (Exception e) {
netInfo = null;
}
return netInfo != null && netInfo.isConnected() && testConnection(DefaultSettings.TEST_CONNECTION_URL);
}
private static boolean testConnection(String url) {
HttpClient httpClient = null;
HttpHead request = null;
HttpResponse response = null;
int statusCode = 0;
try {
HttpParams myParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(myParams, DefaultSettings.CONNECTION_TIMEOUT);
HttpConnectionParams.setSoTimeout(myParams, DefaultSettings.SO_TIMEOUT);
httpClient = new DefaultHttpClient(myParams);
request = new HttpHead(url);
response = httpClient.execute(request);
statusCode = response.getStatusLine().getStatusCode();
if (statusCode != 200)
{
Log.e(ConnectivityHelper.class.getName(), String.format("testConnection not successful. For %s - Status code = %d", url, statusCode));
return false;
}
return true;
} catch(ClientProtocolException e) {
Log.e(ConnectivityHelper.class.getName(), String.format("testConnection failure. For %s - Exception: %s.", url, e.toString()));
if (request != null && !request.isAborted()) {
request.abort();
}
return false;
} catch(IOException e) {
if (statusCode == 401) {
Log.e(ConnectivityHelper.class.getName(), String.format("testConnection access denied. For %s - Status code = %d", url, statusCode));
} else {
Log.e(ConnectivityHelper.class.getName(), String.format("testConnection failure. For %s - Exception: %s.", url, e.toString()));
}
if (request != null && !request.isAborted()) {
request.abort();
}
return false;
} finally {
if (httpClient != null) {
httpClient.getConnectionManager().shutdown();
}
}
}