在调用 BindProcessToNetwork(network) 之后。 APP从不通过移动数据连接到互联网
after called BindProcessToNetwork(network). APP never connect to internet through mobile data
我的应用程序使用 WifiNetworkSpecifier 连接到路由器。
然后连接到路由器。已调用APP
connection_manager.BindProcessToNetwork(network);
调用此函数后。即使我关闭WiFi。并开启移动数据。
APP将无法连接网络
如果不调用这个函数。 APP将可以通过移动数据连接到互联网。
BindProcessToNetwork()的机制是什么?
这是我的代码。 (参考来自 ref 1 )
private void RequestNetwork()
{
var specifier = new WifiNetworkSpecifier.Builder()
.SetSsid(_ssid.Text)
.SetWpa2Passphrase(_passphrase.Text)
.Build();
var request = new NetworkRequest.Builder()
.AddTransportType(TransportType.Wifi)
.RemoveCapability(NetCapability.Internet)
.SetNetworkSpecifier(specifier)
.Build();
var connectivityManager = GetSystemService(ConnectivityService) as ConnectivityManager;
if (_requested)
{
connectivityManager.UnregisterNetworkCallback(_callback);
}
connectivityManager.RequestNetwork(request, _callback);
_requested = true;
}
private class NetworkCallback : ConnectivityManager.NetworkCallback
{
public Action<Network> NetworkAvailable { get; set; }
public Action NetworkUnavailable { get; set; }
public static Context _context = Android.App.Application.Context;
ConnectivityManager connection_manager = (ConnectivityManager)_context.GetSystemService(Context.ConnectivityService);
public override void OnAvailable(Network network)
{
base.OnAvailable(network);
NetworkAvailable?.Invoke(network);
connection_manager.BindProcessToNetwork(network);
}
public override void OnUnavailable()
{
base.OnUnavailable();
NetworkUnavailable?.Invoke();
}
}
一旦 BindProcessToNetwork
被调用,所有网络套接字在该应用程序的生命周期内都绑定到该网络(这主要是一项安全功能,因此数据包不会“泄漏”另一个网络)。
您可以通过再次调用 BindProcessToNetwork
清除该网络绑定,但传入 null
作为您的网络类型。
connection_manager.BindProcessToNetwork(null);
我的应用程序使用 WifiNetworkSpecifier 连接到路由器。
然后连接到路由器。已调用APP
connection_manager.BindProcessToNetwork(network);
调用此函数后。即使我关闭WiFi。并开启移动数据。
APP将无法连接网络
如果不调用这个函数。 APP将可以通过移动数据连接到互联网。
BindProcessToNetwork()的机制是什么?
这是我的代码。 (参考来自 ref 1
private void RequestNetwork()
{
var specifier = new WifiNetworkSpecifier.Builder()
.SetSsid(_ssid.Text)
.SetWpa2Passphrase(_passphrase.Text)
.Build();
var request = new NetworkRequest.Builder()
.AddTransportType(TransportType.Wifi)
.RemoveCapability(NetCapability.Internet)
.SetNetworkSpecifier(specifier)
.Build();
var connectivityManager = GetSystemService(ConnectivityService) as ConnectivityManager;
if (_requested)
{
connectivityManager.UnregisterNetworkCallback(_callback);
}
connectivityManager.RequestNetwork(request, _callback);
_requested = true;
}
private class NetworkCallback : ConnectivityManager.NetworkCallback
{
public Action<Network> NetworkAvailable { get; set; }
public Action NetworkUnavailable { get; set; }
public static Context _context = Android.App.Application.Context;
ConnectivityManager connection_manager = (ConnectivityManager)_context.GetSystemService(Context.ConnectivityService);
public override void OnAvailable(Network network)
{
base.OnAvailable(network);
NetworkAvailable?.Invoke(network);
connection_manager.BindProcessToNetwork(network);
}
public override void OnUnavailable()
{
base.OnUnavailable();
NetworkUnavailable?.Invoke();
}
}
一旦 BindProcessToNetwork
被调用,所有网络套接字在该应用程序的生命周期内都绑定到该网络(这主要是一项安全功能,因此数据包不会“泄漏”另一个网络)。
您可以通过再次调用 BindProcessToNetwork
清除该网络绑定,但传入 null
作为您的网络类型。
connection_manager.BindProcessToNetwork(null);