如何检查Wifi网络是否可以访问互联网?

时间:2019-06-11 14:42:42

标签: android wifimanager

如何以编程方式检查电话所连接的Wifi网络是否可以访问互联网?

我无法使用“ ping google.com”类型的解决方案,因为它不能在某些设备上使用,例如Honor 10。

3 个答案:

答案 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);
}