通过 android.net 进行互联网检查。网络功能不起作用

问题描述 投票:0回答:3

我有一个关于

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。

android network-programming wifi android-wifi
3个回答
16
投票

对于 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 I use ping.


7
投票

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


0
投票

试试这个。

boolean internetcheck(Context context){

    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    Network network = null;
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
        network = cm.getActiveNetwork();
    }

    NetworkCapabilities capabilities = cm.getNetworkCapabilities(network);

    if (capabilities != null && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) {
        // İnternet bağlantısı var
        Toast.makeText(context, "İnternet OK.", Toast.LENGTH_LONG).show();            
        return true;
    } else {
        // İnternet bağlantısı yok
        Toast.makeText(context, "OOPS!. internet problem", Toast.LENGTH_LONG).show();
        return false;
    }

}

© www.soinside.com 2019 - 2024. All rights reserved.