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

Android 如何检查Wifi网络是否可以访问互联网?,android,wifimanager,Android,Wifimanager,如何以编程方式检查手机连接的Wifi网络是否可以访问互联网 我不能使用“ping google.com”类型的解决方案,因为它在某些设备上不起作用,例如荣誉10。为了确定设备是否连接到互联网,我们必须定义“连接到互联网”的实际含义。据我所知,Android SDK没有提供任何检查方法,我认为这是因为你必须ping一个特定的地址,以查看它是否可以访问 在我的Android设备上,每当我连接到WiFi网络但互联网连接断开时,状态栏中的WiFi指示灯都会显示一个感叹号。我不确定,但我认为它会在后台pi

如何以编程方式检查手机连接的Wifi网络是否可以访问互联网


我不能使用“ping google.com”类型的解决方案,因为它在某些设备上不起作用,例如荣誉10。为了确定设备是否连接到互联网,我们必须定义“连接到互联网”的实际含义。据我所知,Android SDK没有提供任何检查方法,我认为这是因为你必须ping一个特定的地址,以查看它是否可以访问

在我的Android设备上,每当我连接到WiFi网络但互联网连接断开时,状态栏中的WiFi指示灯都会显示一个感叹号。我不确定,但我认为它会在后台ping一个谷歌服务器(比如
8.8.8.8
)来找出答案

我认为最好的方法不是ping Google,而是ping你在应用程序中使用的特定地址,例如,如果你使用Last.fm API,那么就ping它,因为你可能会遇到这样的情况:可以访问谷歌服务器,但Last.fm API关闭。这只是一个一般的例子,但解决方案取决于您的目标



只要试着连接到任何你需要交谈的地方,并以优雅的方式处理失败

PING某些东西(甚至是您想与之交谈的服务器)不可靠,因为服务器或网络的某些部分可能会阻止PING

ping一些“众所周知”的东西(比如
8.8.8.8
上的谷歌名称服务器)是不可靠的,因为它只会告诉你它已经启动了,而不一定你能找到你想要交谈的服务器。(或者,甚至可能是“已知”实体已关闭或无法访问,但您的服务器工作正常)


除了尝试连接到所需内容之外,执行其他操作可能会导致(从检查时间到使用时间)错误。

我找到了一种快速的解决方案,不需要使用ping命令或加载页面

该解决方案使用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);
}

我想避免使用“ping google.com”类型的解决方案,因为没有其他方法。要检查您是否可以访问internet上的某些资源,您必须尝试访问一个站点,并且返回的响应将为您提供所有信息。如果不是。。那么你就没有互联网连接了。@Tim Castelijns ping不能通过诸如Honor 10:@matdev之类的设备工作。我不是说直接使用ping。我指的是“ping类型的解决方案”,例如,尝试连接到服务器以查看是否可以访问。谢谢。我认为Android SDK没有提供任何方法来检查wifi网络是否可以访问互联网,这是一个遗憾,因为操作系统知道这些信息。这将节省对服务器的ping。操作系统显示带有交叉Wifi符号的信息,但安卓API没有提供它:(我很确定,操作系统将检查是否有什么东西(可能是某种谷歌服务器)是否有响应。这可以指示您是否能够与所需的资源对话,但不能确定。无论您在实际需要与服务器对话之前尝试了什么,都可能在您实际尝试与服务器对话时出错,因此这是“真实的”我认为您应该努力优雅地处理故障的过程。我理解您的观点,但我仍然需要的信息是“是否具有wifi网络internet访问权限?”,而不是特定服务器是否可Pingable,但正如另一个答案所说,不存在(精确定义的)“具有internet访问权限”的状态…WiFi可以连接或不连接(到路由器)。除此之外,还有“此主机(电话)是否可以与另一个[特定]主机通信”。因此,你必须选择一个特定的主机(几乎可以保证是“启动”)并查看你是否可以以某种方式连接。我很确定这就是“因为操作系统知道此信息”的全部含义你在评论中留下了另一种回答方式。
public interface InternetAccessListener {
    void hasInternet(Boolean result);
}