我有一个关于
android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET
的问题。根据 JavaDocs,这“表明该网络应该能够访问互联网”。
不幸的是,这似乎无法正常工作 - 或者我在这里做错了什么。我输出了三种不同 Wi-Fi 网络的能力值:
可访问互联网的 Wi-Fi。
没有互联网接入的Wi-Fi(我在这里手动禁用了互联网)。
公共热点(“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。
对于 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.
不幸的是,您不能依赖 NET_CAPABILITY_INTERNET && NET_CAPABILITY_VALIDATED,您只需关闭 wifi 路由器上的互联网(通过电缆或以编程方式)并检查 - 即使在很长的延迟后,这两个参数也将是正确的。
试试这个。
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;
}
}