Сканирование сети Wi-Fi не возвращает значения в коде Xamarin - PullRequest
1 голос
/ 08 марта 2019

Мы рассмотрели реализацию кода по этой ссылке: 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();
        }
    }
}

Мы также пытались включить WIFI_ACCESS_STATE, ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION, CHANGE_WIFI_STATE для требуемых разрешений в манифесте Android, но безрезультатно.

Мы ищем справкучто вызывает ошибку.Мы попробовали это на устройстве Android OnePlus и телефоне ASUS.

1 Ответ

1 голос
/ 08 марта 2019

Разобрался. Также можно опубликовать ответ здесь и для дальнейшего использования.

Я посмотрел в Разрешения для Android Xamarin. Несмотря на то, что мы добавили разрешения через файл манифеста, кажется, что этого недостаточно, поскольку нам также необходимо сделать разрешения во время выполнения, когда приложение просит пользователя явно предоставить разрешения.

Кроме того, основываясь на документации Android для сканирования WIFI , мы должны соответствовать этим критериям, чтобы он был успешным:

enter image description here

Следует отметить одну вещь: на Android 8.0 и Android 8.1 он не работает, если службы определения местоположения отключены. В документации говорится, что это требуется только в Android 9.0 и более поздних версиях, но когда я тестировал его на своем устройстве Android 8.0, он не работает, если не включены службы определения местоположения. Кроме того, я должен был добавить разрешение Access_WIFI_State, которое также не упомянуто в документе, иначе это вызовет исключение. Вы можете не указывать ACCESS_FINE_LOCATION или ACCESS_COARSE_LOCATION, и это прекрасно работает.

...