ConnectivityManager.连接/断开VPN时缺少NetworkCallback呼叫



我的Android应用程序已注册ConnectivityManager onAvailable和onLost NetworkCallbacks,但当VPN(我正在使用OpenVPN应用程序进行测试(连接或断开连接时,不会调用它们。当蜂窝网络连接/断开时,他们确实会接到电话。

在我连接VPN之前,allNetworks显示一个网络:

11-17 16:16:22.719 23531 23531 I Baresip:发现网络106具有[Transports:CELLULAR Capabilities:SUPL&INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VPN&VALIDATED&aamp;NOT_ROAMING&FOREGROUND&NOT_CONGESTED&NOT_SUSPENDED Unwanted:LinkUpBandwidth>=51200Kbps LinkDnBandwidth>=102400Kbps指定符:<6>]

在我连接VPN后,有两个网络:

11-17 16:17:17.464 23531 23531 I Baresip:发现网络106具有[Transports:CELLULAR Capabilities:SUPL&INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VPN&VALIDATED&aamp;NOT_ROAMING&FOREGROUND&NOT_CONGESTED&NOT_SUSPENDED Unwanted:LinkUpBandwidth>=51200Kbps LinkDnBandwidth>=102400Kbps指定符:<6>]

11-17 16:17:17.466 23531 23531 I Baresip:发现网络225具有[Transports:VPN功能:INTERNET和NOT_RESTRECTED和TRUSTED和VALIDATED和NOT_ROAMING和FOREGROUNDED和NOT_CONGESTED和NOT_SUSPENDED Unwanted:]

但当VPN网络可用时,我的应用程序不会收到关于它的onAvailable(或任何其他(ConnectivityManager通知。当我断开VPN时,也会出现同样的问题。

这是安卓系统的错误吗?还是有其他方式可以获得有关VPN事件的通知?

编辑:我搜索了谷歌的问题跟踪器,发现了完全相同的问题:

https://issuetracker.google.com/issues/138035152

不幸的是,作者没有提供谷歌要求的所有信息,他们结束了这个问题。

我创建了一个新的错误报告,但很可能不会有任何结果:

https://issuetracker.google.com/issues/173534857

所以我们欢迎社区的帮助。

为了在VPN连接更改时也调用回调,NetworkCapabilities。需要从生成器中删除NET_CAPABILITY_NOT_VPN:

val builder = NetworkRequest.Builder()
.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)

默认情况下,包括该功能。

我照你说的做了,但仍然不起作用这是我的代码,除VPN 外,其他一切都正常

public void startMonitor(){
connectivityManager.registerNetworkCallback(networkRequest,networkCallback);
}
NetworkRequest networkRequest = new NetworkRequest.Builder()
.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
.build();
ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback(){
@Override
public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {
if(networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) {
if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
connectionStatusHelper.checkInternetConnection("蜂窝流量");
Log.d(TAG, "===当前在使用蜂窝流量上网===");
} else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
connectionStatusHelper.checkInternetConnection("WIFI");
Log.d(TAG, "====当前在使用WiFi上网===");
}  else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) {
connectionStatusHelper.checkInternetConnection("VPN");
Log.d(TAG, "===当前使用VPN上网====");
}
}
}

最新更新