通过android.net.NetworkCapabilities进行互联网检查不起作用

Tim*_*ähr 6 networking android wifi android-wifi

我有一个问题android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET。根据JavaDocs的说法,“表明该网络应该能够访问Internet”。

不幸的是,这似乎无法正常工作-否则我在这里做错了。我输出了三种不同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
Run Code Online (Sandbox Code Playgroud)

true当与某些Wi-Fi连接时,布尔值始终为。

如果相关,则我测试过的设备正在Android 5.0.1(API 21)下运行。我将应用程序编译为API级别23。

小智 6

对于具有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);
}
Run Code Online (Sandbox Code Playgroud)

我在其他设备上对其进行了检查,并且工作正常。除了小米Redmi 3S MIUI 8-它会返回NET_CAPABILITY_VALIDATED进行Wi-Fi,而无需访问互联网。

对于API <23,我使用ping。

  • 即使没有互联网连接,`capability.hasCapability(NetworkCapability.NET_CAPABILITY_VALIDATED)` 在 Android Wear API 26 模拟器上也会返回 true。有没有什么办法解决这一问题? (3认同)
  • 当您从 wifi 切换到移动数据连接时,这无法正常工作 (3认同)

bli*_*ker 6

不幸的是,您不能依赖 NET_CAPABILITY_INTERNET && NET_CAPABILITY_VALIDATED,您只需关闭 wifi 路由器上的互联网(通过电缆或编程方式)并检查 - 即使在很长的延迟后,这两个参数也将是正确的。