【问题标题】:Xamarin Gets WiFi List from AndroidXamarin 从 Android 获取 WiFi 列表
【发布时间】:2022-08-24 10:22:26
【问题描述】:
###################################
#    MainActivity.cs
###################################
using System;

using Android.App;
using Android.Content.PM;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using Android.Content;
using System.Collections.Generic;
using Android.Net.Wifi;
using System.Text;
using Java.Lang;
using Xamarin.Forms;
using StringBuilder = System.Text.StringBuilder;
using Menu = Android.Views.Menu;
using System.Threading.Tasks;
using System.Threading;

[assembly: Xamarin.Forms.Dependency(typeof(App1.Droid.Wifi))]
namespace App1.Droid
{
    [Activity(Label = \"App1\", Icon = \"@mipmap/icon\", Theme = \"@style/MainTheme\", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize )]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
            LoadApplication(new App());
        }
        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        {
            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        }

      
    }


   
    public class Wifi : IWifi
    {
        private Context context = null;

        public Wifi()
        {
            this.context = Android.App.Application.Context;
        }

        public async Task<IEnumerable<string>> GetAvailableNetworksAsync()
        {
            IEnumerable<string> availableNetworks = null;

            // Get a handle to the Wifi
            var wifiMgr = (WifiManager)context.GetSystemService(Context.WifiService);
            var wifiReceiver = new WifiReceiver(wifiMgr);

            await Task.Run(() =>
            {
                // Start a scan and register the Broadcast receiver to get the list of Wifi Networks
                context.RegisterReceiver(wifiReceiver, new IntentFilter(WifiManager.ScanResultsAvailableAction));
                availableNetworks = wifiReceiver.Scan();
            });

            return availableNetworks;
        }


        [BroadcastReceiver(Enabled = true, Exported = false)]
        class WifiReceiver : BroadcastReceiver
        {
            private WifiManager wifi;
            private List<string> wifiNetworks;
            private AutoResetEvent receiverARE;
            private Timer tmr;
            private const int TIMEOUT_MILLIS = 10000; // 20 seconds timeout

            public WifiReceiver()
            {

            }
            public WifiReceiver(WifiManager wifi)
            {
                this.wifi = wifi;
                wifiNetworks = new List<string>();
                receiverARE = new AutoResetEvent(false);
            }

            public IEnumerable<string> Scan()
            {
                tmr = new Timer(Timeout, null, TIMEOUT_MILLIS, System.Threading.Timeout.Infinite);
                wifi.StartScan();
                receiverARE.WaitOne();
                return wifiNetworks;
            }

            public override void OnReceive(Context context, Intent intent)
            {
                IList<ScanResult> scanwifinetworks = wifi.ScanResults;
                foreach (ScanResult wifinetwork in scanwifinetworks)
                {
                    wifiNetworks.Add(wifinetwork.Ssid);
                }

                receiverARE.Set();
            }

            private void Timeout(object sender)
            {
                // NOTE release scan, which we are using now, or we throw an error?
                receiverARE.Set();
            }
        }
    }
}

###################################
#    MainPage.xaml.cs
###################################
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;

namespace App1
{
    public interface IWifi
    {
        Task<IEnumerable<string>> GetAvailableNetworksAsync();
    }

    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
        }

        private async void btn1_Clicked(object sender, EventArgs e)
        {
            IEnumerable<string> _wifiService = null;
            _wifiService = await DependencyService.Get<IWifi>().GetAvailableNetworksAsync();

            txtlog.Text = _wifiService.Count().ToString();
            wifilist.ItemsSource = _wifiService;

            

            //Device.StartTimer(new TimeSpan(0, 0, 60), () =>
            //{
            //    // do something every 60 seconds
            //    Device.BeginInvokeOnMainThread(async () =>
            //    {
            //        IEnumerable<string> _wifiService = null;
            //        _wifiService = await DependencyService.Get<IWifi>().GetAvailableNetworksAsync();
            //        wifilist.ItemsSource = _wifiService;

            //        //txtlog.Text = _wifiService.Count<int>();
            //        //editLog.add
            //    });

            //    return true; // runs again, or false to stop
            //});




            //IEnumerable<string> test1 = new IEnumerable<string>;

            //wifilist.

            //ListView listview = FindViewByID<ListView>(Resources.Id)
            //listview.setAdapter(adapter);

            //List<string> lstItems;

            //for (int i = 0; i < 10; i ++)
            //{


            //}

            //wifilist.ItemsSource = lstItems;

        }
    }
}

###################################
#    MainPage.xaml.cs
###################################
<?xml version=\"1.0\" encoding=\"utf-8\"?>
<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\" android:versionCode=\"1\" android:versionName=\"1.0\" package=\"com.companyname.app1\" android:installLocation=\"auto\">
    <uses-sdk android:minSdkVersion=\"21\" android:targetSdkVersion=\"30\" />
    <application android:label=\"App1.Android\" android:theme=\"@style/MainTheme\"></application>
    <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />
    <uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" />
    <uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\" />
    <uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\" />
    <uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\" />
</manifest>

我尝试按照示例进行操作,但无法获取 wifi 列表。我究竟做错了什么? 这是我引用的示例的链接。

referenced example

我打算使用 Android 10 或更高版本。 我将通过在开发环境中将 Android OS 放在 Raspberry Pi 板上进行测试。

  • 请张贴相关的位代码。发帖一切只是让任何人不太可能阅读所有内容以提供帮助。您是否收到任何错误或异常?您是否已调试代码以缩小问题范围? \"I can\'t get the wifi list\" 对问题的描述不是很有帮助。

标签: xamarin.forms


【解决方案1】:

从代码中,我了解到您正在尝试获取可用 wifi 连接的列表。

我已经尝试了您的代码,并且能够获取 wifi 列表。

请检查您是否做过以下事情,如果没有请做

  • 启用设备定位
  • 为您的应用授予位置权限(来自您的代码或来自设备设置)

希望这可以帮助!

【讨论】:

  • 谢谢你的答案。它在Android 5.1版本中正常工作。如果您在 Android 10 或更高版本上运行该应用程序,则无法获取 Wi-Fi 列表。不同的版本可以有不同的功能行为吗?
猜你喜欢
  • 2021-12-17
  • 2018-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
  • 1970-01-01
  • 2011-09-27
相关资源
最近更新 更多