【问题标题】:How to check if Wifi network has internet access?如何检查Wifi网络是否可以上网?
【发布时间】:2019-06-11 14:42:42
【问题描述】:

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

我无法使用“ping google.com”类型的解决方案,因为它不适用于某些设备,例如荣耀 10

【问题讨论】:

  • 我想避免“ping google.com”类型的解决方案没有其他办法。要检查您是否可以访问 Internet 上的某些资源,您必须尝试访问它
  • Ping 站点,返回响应将为您提供所有信息。如果没有......那么你没有互联网连接。
  • @Tim Castelijns ping 在荣耀 10 等设备上不起作用:stackoverflow.com/questions/32749462/…
  • @matdev 我不是说直接使用 ping。我指的是“ping类型的解决方案”,例如尝试连接到服务器以查看它是否可以访问

标签: android wifimanager


【解决方案1】:

好吧,为了确定设备是否连接到互联网,我们必须定义“连接到互联网”的实际含义。据我所知,Android SDK 没有提供任何检查方法,我认为这是因为您毕竟必须 ping 特定地址才能查看它是否可以访问。

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

我认为最好的方法不是 ping Google,而是 ping 您在应用中使用的特定地址,例如,如果您使用 Last.fm API,则 ping 该地址,因为您可能会遇到 Google服务器可访问,但 Last.fm API 已关闭。这只是一个一般示例,但解决方案取决于您的目标。


【讨论】:

  • 谢谢。我认为 Android SDK 没有提供任何方法来检查 wifi 网络是否可以访问互联网是一种耻辱,因为操作系统知道这些信息。它会将 ping 保存到服务器。
【解决方案2】:

只需尝试连接到您需要与之交谈的任何事物,并以优雅的方式处理故障。

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

Ping 一些“众所周知”的东西(例如 Google 在 8.8.8.8 上的名称服务器)并不可靠,因为它只告诉您 已启动,不一定告诉您可以访问您的服务器想谈谈。 (或者,甚至可能是“众所周知的”实体已关闭或无法访问,但您的服务器工作正常)。

做一些其他的事情,而不是仅仅尝试连接到你想要的东西,可能会引入TOCTOU(检查时间到使用时间)错误。

【讨论】:

  • 操作系统用交叉的 Wifi 符号显示此信息,但 Android API 不提供它:(
  • 操作系统会,我很确定,会检查那里的 something(可能是某种 Google 服务器)是否响应。这可以指示你是否能够与你需要的资源交谈,但不是确定的。无论您尝试 提前 实际 需要 与您的服务器交谈,到您实际 try 与您的服务器交谈时,都可能是错误的,所以它是在那个“真实”的过程中,我认为你应该努力优雅地处理失败。
  • 我明白你的意思,但我需要的信息是“有 wifi 网络上网吗?”​​,而不是特定服务器是否可以 ping 通
  • 但是正如另一个答案所说,没有“可以访问互联网”的(精确定义的)状态...... WiFi可以连接或不连接(到路由器)。除此之外,它是“此主机(电话)能否与另一个[特定]主机通话”。所以你必须选择一个特定的主机(几乎可以保证它是“up”的),看看你是否可以以某种方式连接。我很确定这就是您在其他答案方式的评论中留下的所有短语“因为操作系统知道此信息”。
【解决方案3】:

我找到了一个快速的解决方案,不需要使用 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    相关资源
    最近更新 更多