如何检查Wifi网络是否可以上网?
How to check if Wifi network has internet access?
如何以编程方式检查 phone 连接的 Wifi 网络是否可以访问互联网?
我无法使用 "ping google.com" 类型的解决方案,因为它不适用于某些设备,例如 Honor 10
嗯,为了确定设备是否连接到互联网,我们必须定义 "connected to the internet" 的实际含义。据我所知,Android SDK 没有提供任何方法来检查它,我认为这是因为你毕竟必须 ping 一个特定的地址,以查看它是否可以访问。
在我的 Android 设备上,每当我连接到 WiFi 网络但互联网连接断开时,状态栏中的 WiFi 指示器会显示一个感叹号。我不确定,但我认为它会在幕后对 google 服务器(如 8.8.8.8
)执行 ping 操作以找出答案。
我认为最好的方法不是 ping Google,而是 ping 您在应用程序中使用的特定地址,例如,如果您使用 Last.fm API,则 ping相反,因为您可能会遇到 Google 服务器可以访问但 Last.fm API 服务器已关闭的情况。这只是一个一般示例,但解决方案取决于您的目标。
只需尝试连接到任何您需要与之交谈的对象,并以优雅的方式处理故障。
Ping 某些东西(即使是你想与之交谈的服务器)并不可靠,因为服务器或网络的某些部分可能会阻止 PING。
Ping 某些东西 "well known"(比如 Google 在 8.8.8.8
上的 name-server)是不可靠的,因为它只会告诉你 它 已启动,不一定是您可以连接到您要与之通话的服务器。 (或者,甚至可能是 "well known" 实体已关闭或无法访问,但 您的 服务器工作正常)。
做一些 其他 而不是仅仅尝试连接到你想要的东西可能会引入 TOCTOU(Time-of-check 到 time-of-use)错误。
我找到了一个快速且不需要使用 ping 命令或加载页面的解决方案。
解决方案使用Volley、Android的HTTP库:
public static void isInternetAccessWorking(Context context, final InternetAccessListener listener) {
StringRequest stringRequest = new StringRequest(Request.Method.GET, "https://www.google.com",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
listener.hasInternet(true);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
listener.hasInternet(false);
}
});
Volley.newRequestQueue(context).add(stringRequest);
}
此方法不阻塞:调用 isInternetAccessWorking() 的 activity 或片段必须提供实现 InternetAccessListener 的参数将收到响应
public interface InternetAccessListener {
void hasInternet(Boolean result);
}
如何以编程方式检查 phone 连接的 Wifi 网络是否可以访问互联网?
我无法使用 "ping google.com" 类型的解决方案,因为它不适用于某些设备,例如 Honor 10
嗯,为了确定设备是否连接到互联网,我们必须定义 "connected to the internet" 的实际含义。据我所知,Android SDK 没有提供任何方法来检查它,我认为这是因为你毕竟必须 ping 一个特定的地址,以查看它是否可以访问。
在我的 Android 设备上,每当我连接到 WiFi 网络但互联网连接断开时,状态栏中的 WiFi 指示器会显示一个感叹号。我不确定,但我认为它会在幕后对 google 服务器(如 8.8.8.8
)执行 ping 操作以找出答案。
我认为最好的方法不是 ping Google,而是 ping 您在应用程序中使用的特定地址,例如,如果您使用 Last.fm API,则 ping相反,因为您可能会遇到 Google 服务器可以访问但 Last.fm API 服务器已关闭的情况。这只是一个一般示例,但解决方案取决于您的目标。
只需尝试连接到任何您需要与之交谈的对象,并以优雅的方式处理故障。
Ping 某些东西(即使是你想与之交谈的服务器)并不可靠,因为服务器或网络的某些部分可能会阻止 PING。
Ping 某些东西 "well known"(比如 Google 在 8.8.8.8
上的 name-server)是不可靠的,因为它只会告诉你 它 已启动,不一定是您可以连接到您要与之通话的服务器。 (或者,甚至可能是 "well known" 实体已关闭或无法访问,但 您的 服务器工作正常)。
做一些 其他 而不是仅仅尝试连接到你想要的东西可能会引入 TOCTOU(Time-of-check 到 time-of-use)错误。
我找到了一个快速且不需要使用 ping 命令或加载页面的解决方案。
解决方案使用Volley、Android的HTTP库:
public static void isInternetAccessWorking(Context context, final InternetAccessListener listener) {
StringRequest stringRequest = new StringRequest(Request.Method.GET, "https://www.google.com",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
listener.hasInternet(true);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
listener.hasInternet(false);
}
});
Volley.newRequestQueue(context).add(stringRequest);
}
此方法不阻塞:调用 isInternetAccessWorking() 的 activity 或片段必须提供实现 InternetAccessListener 的参数将收到响应
public interface InternetAccessListener {
void hasInternet(Boolean result);
}