我正在使用xamarin android中的信标。我希望扫描在60秒内完成,并在下一个扫描周期之间等待30秒。
public async void DetectAvailableBeacons()
{
_monitorNotifier = new MonitorNotifier();
_rangeNotifier = new RangeNotifier();
_tagRegion = new Region("Region",null, null, null);
_beaconManager.Bind(this);
_beaconManager.SetBackgroundScanPeriod(60000);
_beaconManager.SetForegroundScanPeriod(60000);
_beaconManager.SetBackgroundBetweenScanPeriod(30000);
_beaconManager.SetForegroundBetweenScanPeriod(30000);
_rangeNotifier.DidRangeBeaconsInRegionComplete += RangingBeaconsInRegionComplete;
}
方法RangingBeaconsInRegionComplete
填充我的列表foundBeacons
与检测到的信标。
另外,我有一个方法可以获得所有可用的检测到的信标,如下所示:
ObservableCollection<DetectedBeacon> BeaconLocator.GetAvailableBeacons()
{
return !_paused ? foundBeacons : null;
}
现在,我将方法GetAvailableBeacons()
称为如下:
public void PopulateBeacons() {
beaconsOnList = be.GetAvailableBeacons();
PopulateBeacons();
}
我的问题是,有时候它丢失了一些信标,就是有些信标没有被检测到。此外,扫描间隔似乎不正常。有人可以提出什么问题吗?
为了让您的扫描周期立即生效,最简单的解决方案是在调用bind
之前移动调用以设置它们,所以它看起来像这样:
_beaconManager.SetBackgroundScanPeriod(60000);
_beaconManager.SetForegroundScanPeriod(60000);
_beaconManager.SetBackgroundBetweenScanPeriod(30000);
_beaconManager.SetForegroundBetweenScanPeriod(30000);
_beaconManager.Bind(this);
默认情况下,扫描将每1.1秒进行一次,并为您提供该时段内所有信标的结果。如果没有上面的代码更改,这可能就是您所看到的。
对于较短的扫描间隔,具有低广告速率的信标(例如,每秒仅通告一次的信标)通常不会出现在单个扫描周期的检测列表中。您可以通过增加扫描周期的长度来解决这个问题,如您所说,通过提高信标的广告费率,或构建维护最近检测到的信标的完整列表的代码逻辑,即使它们未被发现最近的扫描周期。
简短回答:如果您成功增加扫描周期,我怀疑这个问题会消失。