android - 调用 BindProcessToNetwork(network) 之后。 APP从不通过移动数据连接互联网

标签 android xamarin xamarin.android android-10.0

我的APP使用WifiNetworkSpecifier连接到路由器。

一旦连接到路由器。 APP调用

connection_manager.BindProcessToNetwork(network);

调用此函数后。即使我关掉WiFi。并打开移动数据。

该应用程序将无法再连接到互联网。

如果这个函数没有被调用。 APP将能够通过移动数据连接互联网。

BindProcessToNetwork()的机制是什么?

这是我的代码。 (引用 ref 1 ref 2 )

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,所有网络套接字都会在该应用程序的生命周期内绑定(bind)到该网络(这主要是一项安全功能,因此数据包不会“泄漏”另一个网络)。

您可以通过再次调用 BindProcessToNetwork 来清除该网络绑定(bind),但传入 null 作为您的网络类型。

connection_manager.BindProcessToNetwork(null);

关于android - 调用 BindProcessToNetwork(network) 之后。 APP从不通过移动数据连接互联网,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64913185/

相关文章:

android - Httpclient 替代方案

c# - Xamarin-Studio Android 窗体设计器 : Android Version not installed

xamarin - 在 Visual Studio 上找不到给定名称 Theme.AppCompat.Light.NoActionBar 的资源 - Xamarin

c# - 如何处理firebase短动态链接成功结果

android - 从 DialogFragment (Xamarin) 更新数据库中的记录时更新 ListView 和绘图

Android SDK 工具向导 : Detects JDK 1. 7 而不是 JDK 1.6

Android选项菜单是透明的

android - 在 Android 中访问内部存储

Xamarin 表格 : Toast Notification in Android & IOS

android - 如何将Android应用程序链接到服务器/计算机上的数据库?