如何以编程方式检查电话所连接的Wifi网络是否可以访问互联网?
我无法使用“ ping google.com”类型的解决方案,因为它不能在某些设备上使用,例如Honor 10。
答案 0 :(得分:1)
好吧,为了确定设备是否已连接到互联网,我们必须定义“连接到互联网”的实际含义。据我所知,Android SDK并没有提供任何检查方法,我认为这是因为您毕竟必须ping一个特定的地址,以查看它是否可以访问。
在我的Android设备上,每当我连接到WiFi网络但互联网连接断开时,状态栏中的WiFi指示器就会显示一个感叹号。我不确定,但是我认为它会在幕后ping一个Google服务器(例如8.8.8.8
)以找出原因。
我认为最好的方法不是对Google进行ping操作,而是对您在应用程序中使用的特定地址进行ping操作,例如,如果您使用Last.fm API,请对其进行ping操作,因为这样可能会导致Google服务器可以访问,但Last.fm API已关闭。这只是一个一般示例,但是解决方案取决于您的目标。
答案 1 :(得分:1)
只需尝试连接到您需要交谈的所有内容,并以优雅的方式处理故障。
Ping某些东西(甚至是您想与之交谈的服务器)也不可靠,因为服务器或网络的某些部分可能会阻止PING。
Ping某些“知名”的内容(例如8.8.8.8
上的Google的名称服务器)是不可靠的,因为它只会告诉您它已启动,而不一定能达到您要交谈的服务器。 (或者,甚至可能是“知名”实体已关闭或无法访问,但是您的服务器工作正常)。
做一些其他事情,而不仅仅是尝试连接到您想要的东西,否则可能会引入TOCTOU(检查时间到使用时间)错误。
答案 2 :(得分:0)
我找到了一种快速解决方案,不需要使用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()的活动或片段必须提供实现 InternetAccessListener 的参数,该参数将接收响应
public interface InternetAccessListener {
void hasInternet(Boolean result);
}