我的应用程序需要使用wifi网络(没有互联网,因此android默认情况下会避免使用它)。而且我希望它使用起来很简单(例如,奶奶不必手动更改设置)。这只是个人物联网设备,因此我想使用ConnectivityManager.BindProcessToNetwork(Android.Net.Network network)
。如何获取与当前连接的wifi网络关联的Android.Net.Network,以便可以使用BindProcessToNetwork
?
//c#(Xamarin)
//my rudimentary attempt to get the connected wifi network:
var networks = ConnectivityManager.GetAllNetworks();
foreach (Network network in networks) {
NetworkCapabilities networkCability =ConnectivityManager.GetNetworkCapabilities(network);
if (networkCability.HasTransport(TransportType.Wifi))
{
currentWifiNetwork = network; // this is never reached
}
}
ConnectivityManager.BindProcessToNetwork( currentWifiNetwork );
当前使用WiFi,蜂窝等网络的所有电话是否都没有单独的Network
对象?
此博客使我接近:https://android-developers.googleblog.com/2016/07/connecting-your-app-to-wi-fi-device.html。
绑定套接字方法也可以工作(除非选中了use network without internet box
,否则wifi网络才可用)。我只需要使用该应用程序即可通过wifi使用端口8080上的网址。
我想避免不得不手动告诉Android“在没有互联网的情况下使用网络”。
干杯
运行此命令时,ConnectivityManager.GetAllNetworks()
仅返回两个网络,并在调试器中查看它们,一个是具有Internet和mms的蜂窝网络,另一个是没有Internet和mms的另一个蜂窝网络。因此,没有ConnectivityManager.GetAllNetworks()
无法获得wifi网络,因为除非有互联网,否则android甚至不会添加wifi网络!如果手机数据被禁用,Android将切换并使用无互联网的wifi进行所有流量(而无需选中仍然使用网络复选框),因此它们必定是将WiFi网络绑定到应用程序的一种方式!或...
use network anyways
框!?我还没有解决的办法。网络上只有一堆未解决的问题。以这种速度,我可能只在物联网设备和欺骗性的Web服务器上使用dnsmasq,以使android认为它具有互联网。 我还看到API 29具有NetworkBuilder,您可以指定一个没有Internet功能的WiFi网络的请求...但是我需要较低的API支持。
答案 0 :(得分:1)
这是我想出的解决方案(针对Api 28)。不管通过NetworkRequest的互联网功能如何,它都会优先考虑4G(数据)之上的WiFi,然后允许4G(数据)之上的互联网和该应用使用其本地WiFi服务:
public bool ConnectToWifi(string ssid, string password, bool previouslyConnected = true)
{
if (!WifiManager.IsWifiEnabled)
WifiManager.SetWifiEnabled(true); //turn on wifi if not on
var formattedSsid = $"\"{ssid}\"";
var formattedPassword = $"\"{password}\"";
var wifiConfig = new WifiConfiguration
{
Ssid = formattedSsid,
PreSharedKey = formattedPassword,
Priority = 0
};
_NetworkId = WifiManager.AddNetwork(wifiConfig);
WifiManager.Disconnect();
bool enableNetwork = WifiManager.EnableNetwork(_NetworkId, true);
NetworkRequest.Builder builder = new NetworkRequest.Builder(); //request that WiFi be prioritized over the 4G internet capable network.
builder.AddTransportType(TransportType.Wifi);
ConnectivityManager.RequestNetwork(builder.Build(), new BindNetworkCallBack ());
return enableNetwork;
}
此回叫然后将适当的wifi网络绑定到该应用程序!允许用户既可以通过wifi将应用与本地服务器一起使用,也可以通过4G数据连接访问互联网!
public class BindNetworkCallBack : ConnectivityManager.NetworkCallback
{
public override void OnAvailable(Network network)
{
try
{
WifiConnect.ConnectivityManager.BindProcessToNetwork(network);
}
catch (Exception ex)
{
Debug.WriteLine(@"\tERROR Unable to Bind process to network {0}", ex.Message);
}
WifiConnect.ConnectivityManager.UnregisterNetworkCallback(this);
}
}