android - 连接到 VPN 时检查 WiFi 和蜂窝网络连接
问题描述
在我的 Android 应用程序中,我使用以下两种方法来检查设备是否连接到 WiFi 以及网络连接是否可用。我假设当设备连接到 WiFi 或移动网络时,互联网也可用。
public static boolean wifiConnected(Context context) {
boolean isWifiConn = false;
ConnectivityManager connMgr = (ConnectivityManager) context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
android.net.Network network = connMgr.getActiveNetwork();
if (network == null) return false;
NetworkCapabilities capabilities = connMgr.getNetworkCapabilities(network);
if(capabilities != null && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)){
isWifiConn = true;
}
} else {
for (android.net.Network network : connMgr.getAllNetworks()) {
NetworkInfo networkInfo = connMgr.getNetworkInfo(network);
if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI && networkInfo.isConnected()) {
isWifiConn = true;
break;
}
}
}
return isWifiConn;
}
public static boolean isNetworkAvailable(Context context) {
ConnectivityManager connectivityManager
= (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager != null) {
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(connectivityManager.getActiveNetwork());
if (capabilities != null) {
if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
return true;
} else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
return true;
} else return capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET);
}
} else {
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return (activeNetworkInfo != null) && activeNetworkInfo.isConnected();
}
}
return false;
}
如果设备通过 VPN 连接,则方法返回 false。是否可以扩展方法以使它们即使在设备连接到 VPN 时也返回 true?
解决方案
VPN 有一个特定的传输类型,因此您需要做的就是添加一个检查capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)
.
您还可以将 API 级别检查从 更改Build.VERSION_CODES.Q
为Build.VERSION_CODES.M
. 唯一有问题的行是connectivityManager.getActiveNetwork()
,但这在 M (API 23) 中可用。
推荐阅读
- flutter - Flutter Bloc - 小部件树无休止地生长
- python-3.x - Flask 应用程序结束时如何执行函数?
- imagemagick - 如何强制 imagemagick 保持图像的原始色彩空间
- garbage-collection - 为什么需要 gc,我们可以在没有内存安全的情况下编写语言吗?
- android - Spinner 不会显示字符串条目
- swift - Swift:在任务完成之前调用 DispatchGroup 通知
- regex - 寻找 0.1 到 24 之间的正则表达式模式。需要允许 2 个小数位
- java - 如何从 I/O 文件 Java 中编辑特定单词
- .net-core - log4net 在 .NET Core 3.1 上运行正常吗?
- swift - FileManager 会抛出什么错误?