在C#Xamarin Android应用程序中,如何先连接本地网络而不是互联网?
我有一个Xamarin Android应用程序。它连接到一些物联网设备的“无互联网Wifi路由器”。但它也需要使用手机的手机数据在Dropbox上存储一些信息 现在这项工作如下:在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.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中工作
}
}
用法:
希望这对其他人有帮助。谢谢你的建议,但不幸的是,这没有帮助,因为我有时想强制使用蜂窝网络,而强制使用本地Wifi来实现其他功能。经过大量的研究,我在某种程度上实现了它。有关详细信息,请参阅下面的答案。谢谢,但这只是告诉您应用程序连接到了哪个连接。这不会有帮助,因为我有时想强制使用蜂窝网络,并强制使用本地Wifi来实现其他功能。经过大量的研究,我在某种程度上实现了它。有关详细信息,请参见下面的答案。