首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在没有互联网的情况下通过编程连接到Wifi Android (Xamarin)

如何在没有互联网的情况下通过编程连接到Wifi Android (Xamarin)
EN

Stack Overflow用户
提问于 2020-06-10 17:50:54
回答 1查看 1.1K关注 0票数 1

我的应用程序需要使用wifi网络(没有互联网,因此android默认会避开它)。我希望它简单易用(就像奶奶不需要手动更改设置一样)。这只是一个个人IoT设备,所以我想使用ConnectivityManager.BindProcessToNetwork(Android.Net.Network network)。如何获得与当前连接的wifi网络相关联的Android.Net.Network,以便可以使用BindProcessToNetwork

代码语言:javascript
运行
复制
//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网络不是可用的网络)。我只需要应用程序使用的网址是在端口8080通过wifi。我想避免手动告诉Android“使用没有互联网的网络”。干杯

更新

当我运行这个程序时,ConnectivityManager.GetAllNetworks()只返回了两个网络,在调试器中查看它们,一个是有互联网和彩信的蜂窝网络,另一个是没有互联网和彩信的蜂窝网络。所以,没有ConnectivityManager.GetAllNetworks()没有wifi网络,因为看起来安卓甚至不会添加wifi网络,除非它有互联网!如果手机数据被禁用,安卓将切换并对所有流量使用无互联网wifi (而不必勾选use the network anyways框),他们必须是一种将WiFi网络绑定到应用程序的方法!或者..。

如何以编程方式检查use network anyways框!?

我还没有看到解决这个问题的办法。只是网上到处都是一些未解决的问题。按照这种速度,我可能只会在物联网设备上使用dnsmasq和一个欺骗web服务器,让android认为它可以连接到互联网。我还看到API 29有NetworkBuilder,你可以指定一个没有互联网capabilities...but的WiFi网络请求,我需要更低的API支持。

EN

回答 1

Stack Overflow用户

发布于 2020-06-13 16:30:12

这是我提出的解决方案(针对Api 28 )。它将WiFi优先于4G (数据),而不考虑通过NetworkRequest的互联网能力,然后允许4G (数据)和应用程序使用其本地WiFi服务:

代码语言:javascript
运行
复制
public static WifiManager WifiManager { get; } = (WifiManager)Android.App.Application.Context.GetSystemService(Context.WifiService);
public static ConnectivityManager ConnectivityManager { get; set; } = (ConnectivityManager)Android.App.Application.Context.GetSystemService(Context.ConnectivityService);

 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数据连接访问互联网!

代码语言:javascript
运行
复制
 public class BindNetworkCallBack : ConnectivityManager.NetworkCallback
    {
      public override void OnAvailable(Network network)
        {
            if (WifiManager.ConnectionInfo.BSSID == NetworkBSSID) /* 
The only way on Android (API 28+) to check if the acquired network is
the one you want is to use the BSSID (MAC address) of the network. 
You can omit the if statement if you want to presume the acquired network is correct/ 
cannot know the MAC address...
*/
            {
                try
                {
                    ConnectivityManager.BindProcessToNetwork(network);
                }
                catch (Exception ex)
                {
                    Debug.WriteLine(@"\tERROR Unable to Bind process to network {0}", ex.Message);
                }

            }

        }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62300642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档