扫描 Wifi 网络不会 return Xamarin 代码中的值
Scanning Wifi Network doesn't return values in Xamarin Code
我们研究了此 link 的实现代码:https://spin.atomicobject.com/2018/02/15/connecting-wifi-xamarin-forms/ 并根据我们的设置对其进行了修改。当我们调试代码时,我们没有得到 returns。
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 设备和华硕 phone.
设备上进行了测试
想通了。不妨post把答案也放在这里,以备日后参考。
我调查了 Permissions 的 Android Xamarin。尽管我们通过清单文件添加了权限,但这似乎还不够,因为我们还需要在应用程序要求用户明确授予权限的地方执行 运行 次权限。
此外,根据 WIFI scanning 的 Android 文档,我们必须满足这些条件才能成功:
但要注意一件事,在 Android 8.0 和 Android 8.1 上,如果关闭定位服务,它就无法工作。文档指出这仅在 Android 9.0 及更高版本上是必需的,但是当我在我的 Android 8.0 设备上测试它时它不起作用,除非打开位置服务。另外,我必须添加文档中未提及的 Access_WIFI_State 权限,否则会引发异常。您可以省略 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION 中的任何一个,它工作正常。
我们研究了此 link 的实现代码:https://spin.atomicobject.com/2018/02/15/connecting-wifi-xamarin-forms/ 并根据我们的设置对其进行了修改。当我们调试代码时,我们没有得到 returns。
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 设备和华硕 phone.
设备上进行了测试想通了。不妨post把答案也放在这里,以备日后参考。
我调查了 Permissions 的 Android Xamarin。尽管我们通过清单文件添加了权限,但这似乎还不够,因为我们还需要在应用程序要求用户明确授予权限的地方执行 运行 次权限。
此外,根据 WIFI scanning 的 Android 文档,我们必须满足这些条件才能成功:
但要注意一件事,在 Android 8.0 和 Android 8.1 上,如果关闭定位服务,它就无法工作。文档指出这仅在 Android 9.0 及更高版本上是必需的,但是当我在我的 Android 8.0 设备上测试它时它不起作用,除非打开位置服务。另外,我必须添加文档中未提及的 Access_WIFI_State 权限,否则会引发异常。您可以省略 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION 中的任何一个,它工作正常。