在C#Xamarin Android应用程序中,如何先连接本地网络而不是互联网?

在C#Xamarin Android应用程序中,如何先连接本地网络而不是互联网?,c#,android,xamarin,networking,cellular-network,C#,Android,Xamarin,Networking,Cellular Network,我有一个Xamarin Android应用程序。它连接到一些物联网设备的“无互联网Wifi路由器”。但它也需要使用手机的手机数据在Dropbox上存储一些信息 现在这项工作如下: 我可以通过编程方式打开/关闭Wifi连接 我无法打开/关闭手机数据(因为Android L)。它不允许在非根设备上使用 当我的手机连接到这个本地Wifi路由器并且手机数据也打开时,Android默认的工作方式是,它通过手机连接使用互联网,我打给Dropbox的所有电话都可以正常工作 但当本地Wifi“没有互联网”时,这

我有一个Xamarin Android应用程序。它连接到一些物联网设备的“无互联网Wifi路由器”。但它也需要使用手机的手机数据在Dropbox上存储一些信息

现在这项工作如下:

  • 我可以通过编程方式打开/关闭Wifi连接
  • 我无法打开/关闭手机数据(因为Android L)。它不允许在非根设备上使用
  • 当我的手机连接到这个本地Wifi路由器并且手机数据也打开时,Android默认的工作方式是,它通过手机连接使用互联网,我打给Dropbox的所有电话都可以正常工作
  • 但当本地Wifi“没有互联网”时,这种对手机的偏好导致我的应用程序永远无法连接到本地设备。假设我的一台设备正在端口9000上侦听IP 192.168.2.3,当我尝试连接到它时,我的代码通过蜂窝数据搜索它并返回主机未找到
  • 在这种情况下,有没有办法连接到本地设备
  • 作为一种解决方法,我手动提供了模式弹出窗口,以指示用户在需要连接物联网设备等“非”Dropbox呼叫时禁用手机。但这不是一个好的用户体验,因为用户必须不断手动更改网络。我希望代码以更透明的方式处理这个问题
    请告知

    我能想到的解决方案是,您可以尝试使用Xamarin.Essentials并检查连接的配置文件,然后使用它强制请求到您的Wifi,以及其他通过蜂窝数据的请求

    var profiles = Connectivity.ConnectionProfiles;
    if (profiles.Contains(ConnectionProfile.WiFi))
    {
        // Active Wi-Fi connection.
    }
    
    可以找到文档。

    使用Plugin.Essentials(需要NetStandard项目)并参考以下链接:


    尝试本地访问,而不是网络。

    经过多次尝试和失败后,我能够实现这里提供的方法:

    我将这段代码从Java改为Xamarin C#,并能够通过编程强制将蜂窝或Wifi作为首选网络

    我的实施:

    using Android.Net;
    public SomeClass{
        public static Context _context = Android.App.Application.Context;
    
        ....
    
        /// <summary>
        /// Forces the wifi over cellular.
        /// </summary>
        public static void ForceWifiOverCellular()
        {
            ConnectivityManager connection_manager = (ConnectivityManager)_context.GetSystemService(Context.ConnectivityService);
    
            NetworkRequest.Builder request = new NetworkRequest.Builder();
            request.AddTransportType(TransportType.Wifi);
    
            var callback = new ConnectivityManager.NetworkCallback();
            connection_manager.RegisterNetworkCallback(request.Build(), new CustomNetworkAvailableCallBack());
    
        }
    
        /// <summary>
        /// Forces the cellular over wifi.
        /// </summary>
        public static void ForceCellularOverWifi()
        {
            ConnectivityManager connection_manager = (ConnectivityManager)_context.GetSystemService(Context.ConnectivityService);
    
            NetworkRequest.Builder request = new NetworkRequest.Builder();
            request.AddTransportType(TransportType.Cellular);
    
            connection_manager.RegisterNetworkCallback(request.Build(), new CustomNetworkAvailableCallBack());
        }
    }
    
    
    /// <summary>
    /// Custom network available call back.
    /// </summary>
    public class CustomNetworkAvailableCallBack : ConnectivityManager.NetworkCallback
    {
        public static Context _context = Android.App.Application.Context;
    
        ConnectivityManager connection_manager = (ConnectivityManager)_context.GetSystemService(Context.ConnectivityService);
    
        public override void OnAvailable(Network network)
        {
            //ConnectivityManager.SetProcessDefaultNetwork(network);    //deprecated (but works even in Android P)
            connection_manager.BindProcessToNetwork(network);           //this works in Android P
        }
    }
    
    使用Android.Net;
    公共课{
    公共静态上下文_Context=Android.App.Application.Context;
    ....
    /// 
    ///强制通过蜂窝网络连接wifi。
    /// 
    公共静态无效力wifiovercellular()
    {
    ConnectivityManager connection_manager=(ConnectivityManager)_context.GetSystemService(context.ConnectivityService);
    NetworkRequest.Builder request=新建NetworkRequest.Builder();
    request.AddTransportType(TransportType.Wifi);
    var callback=new ConnectivityManager.NetworkCallback();
    connection_manager.RegisterNetworkCallback(request.Build(),new CustomNetworkAvailableCallBack());
    }
    /// 
    ///通过wifi强制移动电话。
    /// 
    公共静态无效强制CellularOverWiFi()
    {
    ConnectivityManager connection_manager=(ConnectivityManager)_context.GetSystemService(context.ConnectivityService);
    NetworkRequest.Builder request=新建NetworkRequest.Builder();
    request.AddTransportType(TransportType.Cellular);
    connection_manager.RegisterNetworkCallback(request.Build(),new CustomNetworkAvailableCallBack());
    }
    }
    /// 
    ///自定义网络可用回拨。
    /// 
    公共类CustomNetworkAvailableCallBack:ConnectivityManager.NetworkCallback
    {
    公共静态上下文_Context=Android.App.Application.Context;
    ConnectivityManager connection_manager=(ConnectivityManager)_context.GetSystemService(context.ConnectivityService);
    公共覆盖无效OnAvailable(网络)
    {
    //ConnectionManager.SetProcessDefaultNetwork(网络);//已弃用(但即使在Android P中也能工作)
    connection_manager.BindProcessToNetwork(网络);//这在Android P中工作
    }
    }
    
    用法:

  • 如果我需要强制移动电话,只需拨打:
  • SomeClass.ForceCellularOverWifi()

  • 如果我需要强制使用Wifi,请拨打:
  • SomeClass.ForceWifiOverCellular()


    希望这对其他人有帮助。

    谢谢你的建议,但不幸的是,这没有帮助,因为我有时想强制使用蜂窝网络,而强制使用本地Wifi来实现其他功能。经过大量的研究,我在某种程度上实现了它。有关详细信息,请参阅下面的答案。谢谢,但这只是告诉您应用程序连接到了哪个连接。这不会有帮助,因为我有时想强制使用蜂窝网络,并强制使用本地Wifi来实现其他功能。经过大量的研究,我在某种程度上实现了它。有关详细信息,请参见下面的答案。