Android中使用android.net.NetworkCapabilities进行互联网检查无法工作

25

我对android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET有一个问题。根据JavaDocs,这表示“表明此网络应该能够连接到互联网”。

不幸的是,这似乎无法正常工作 - 或者我在这里做错了什么。我输出了三个不同Wi-Fi网络的功能值:

  1. 有互联网访问权限的Wi-Fi。

  2. 没有互联网访问权限的Wi-Fi(我手动禁用了互联网)。

  3. 公共热点("Telekom"热点)

在这三种情况下,功能值为[Transports:WIFI Capabilities:INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VPN LinkUpBandwidth>=1048576Kbps LinkDnBandwidth>=1048576Kbps]

这是我的代码:

ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(network);
boolean capability = capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET

当连接到某个Wi-Fi时,布尔值始终为true

如果相关的话,我测试的设备运行在Android 5.0.1 (API 21)下。我将应用编译到API级别23。


为什么这个值会是 false? - MidasLefko
我本以为如果 Wi-Fi 不能连接网络,就会出现“NO_INTERNET”能力。但是即使没有提供网络,INTERNET 能力也会被设置。 - Timo Bähr
你想知道WiFi网络是否连接到互联网了吗? - MidasLefko
是的,但我不想为此进行ping测试。我想使用Android内置的检查功能。 - Timo Bähr
你找到了 NetworkCapabilities.NET_CAPABILITY_INTERNET 不工作的解决方案了吗? - Vinodh
7
很遗憾,三年后这仍然无法正常工作,有人有解决方案吗?除了ping以外的其他方法。 - behelit
2个回答

14

对于API 23+的设备,您可以检查标志NET_CAPABILITY_VALIDATED


@RequiresApi(api = Build.VERSION_CODES.M)
private static boolean hasInternetConnectionM(final Context context) {
    final ConnectivityManager connectivityManager = (ConnectivityManager)context.
            getSystemService(Context.CONNECTIVITY_SERVICE);

    final Network network = connectivityManager.getActiveNetwork();
    final NetworkCapabilities capabilities = connectivityManager
            .getNetworkCapabilities(network);

    return capabilities != null
            && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
}

我在不同的设备上检查了它,它运行正确。除了小米红米3S MIUI 8 - 它在没有互联网访问的Wi-Fi情况下返回NET_CAPABILITY_VALIDATED。

对于API <23,我使用ping。


3
在 Android Wear API 26 模拟器上,即使没有网络连接,capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) 仍然返回 true。有没有办法修复这个问题? - Felipe Ribeiro R. Magalhaes
5
当你从Wi-Fi切换到移动数据连接时,这个东西不能正常工作。 - Ultimo_m
@Ultimo_m 我正在使用 NetworkCapabilities.TRANSPORT_CELLULAR 类型检查,然后它就可以工作了。 - Andris
这种方法似乎在模拟器上可靠运行,即使在公司代理后面也是如此。如果代理需要新的登录,则此代码将检测到该问题并返回false。但是当发生这种情况时,我观察到了一些延迟。因此,在系统认为有互联网连接但实际上没有连接的情况下,会有一个小的时间窗口。据我所知,如果您需要尽快了解互联网连接情况,那么尝试检查是否可以与给定IP(例如8.8.8.8)建立套接字连接将是我的建议,根据我观察到的情况。 - narko
已在 Pixel 3 上进行了检查,并且具有 NET_CAPABILITY_VALIDATED,但在网络请求中失败。 - Vadim Eksler

6

不幸的是,您不能依赖NET_CAPABILITY_INTERNET和NET_CAPABILITY_VALIDATED,您只能关闭无线路由器上的互联网(通过有线或程序方式)并检查-即使经过长时间延迟,这两个参数仍将为真。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接