Internet check over android.net.NetworkCapabilities not working

Timo Bähr picture Timo Bähr · Apr 1, 2016 · Viewed 7.5k times · Source

I have a question about android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET. According to the JavaDocs this "indicates that this network should be able to reach the internet".

Unfortunately this seems not to work properly - or I do something wrong here. I outputed the value of capabilities for three different Wi-Fi networks:

  1. A Wi-Fi with internet access.

  2. A Wi-Fi without internet access (I manually disabled the internet here).

  3. A public hotspot (the "Telekom" hotspot)

In all three cases the capabilities value is [ Transports: WIFI Capabilities: INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VPN LinkUpBandwidth>=1048576Kbps LinkDnBandwidth>=1048576Kbps].

This is my code:

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

The boolean value is always true when connected with some Wi-Fi.

If it is relevant, the device I've tested is running under Android 5.0.1 (API 21). I compiled the app to API level 23.

Answer

EVIL SnaKe picture EVIL SnaKe · Dec 9, 2016

For devices with API 23+ you can check flag 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);
}

I check it on different devices and it works right. Except Xiaomi Redmi 3S MIUI 8 - it returns NET_CAPABILITY_VALIDATED for Wi-Fi without internet access.

For API < 23 I use ping.