簡體   English   中英

掃描 Wifi 網絡不會返回 Xamarin 代碼中的值

[英]Scanning Wifi Network doesn't return values in Xamarin Code

我們已經研究了此鏈接中的實現代碼: https : //spin.atomicobject.com/2018/02/15/connecting-wifi-xamarin-forms/並根據我們的設置對其進行了修改。 當我們調試代碼時,我們沒有得到任何回報。

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;
    }

    class WifiReceiver : BroadcastReceiver
    {
        private WifiManager wifi;
        private List<string> wifiNetworks;
        private AutoResetEvent receiverARE;
        private Timer tmr;
        private const int TIMEOUT_MILLIS = 20000; // 20 seconds timeout

        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();
        }
    }
}

我們還嘗試在 Android 清單上的所需權限上啟用 WIFI_ACCESS_STATE、ACCESS_FINE_LOCATION、ACCESS_COARSE_LOCATION、CHANGE_WIFI_STATE,但沒有效果。

我們正在尋求幫助以指出導致該錯誤的原因。 我們已經在 oneplus android 設備和 asus 手機上進行了嘗試。

弄清楚了。 不妨也在這里發布答案以供將來參考。

我查看了 Android Xamarin 的權限 雖然我們通過清單文件添加了權限,但這似乎還不夠,因為我們還需要在應用程序要求用戶明確授予權限的運行時權限。

此外,根據WIFI 掃描的 Android 文檔,我們必須滿足以下條件才能使其成功:

在此處輸入圖片說明

但需要注意的一件事是,在 Android 8.0 和 Android 8.1 上,如果位置服務關閉,則它不起作用。 文檔指出這僅在 Android 9.0 及更高版本上是必需的,但是當我在我的 Android 8.0 設備上測試它時,除非打開定位服務,否則它不起作用。 另外,我必須添加文檔中未提及的 Access_WIFI_State 權限,否則會引發異常。 您可以省略 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION 中的任何一個,它工作正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM