我正在使用 Altbeacon 库 2.17.1(Xamarin 表单)在应用程序位于前台时检测 ibeacon。我面临的问题是 DidRangeBeaconsInRegion 方法被间歇性地用一个空的信标列表调用。然而,大多数情况下检测到信标时,它会每隔 4 - 5 秒返回一个空列表,持续几个周期。我还注意到,如果我增加 ForegroundScanPeriod 和 ForegroundBetweenScanPeriod,获取空列表的频率会降低,但仍然会发生。在 iOS 上,使用 CLLocationManager,检测到相同的信标,我从来没有失败过。
这是我用于信标检测的代码。
\`
public class BluetoothBeaconService: Java.Lang.Object, IBeaconConsumer, IRangeNotifier
{
public Context ApplicationContext = context;
private Context context;
public class BluetoothBeaconService : Java.Lang.Object, IBeaconConsumer, IRangeNotifier
{
private BeaconManager beaconMgr;
private Region rangingRegion;
private bool _didRanageBeaconsCalled = false;
private bool _beaconServiceConnected = false;
public BluetoothBeaconService(Context context)
{
this.context = context;
beaconMgr = BeaconManager.GetInstanceForApplication(context);
var iBeaconParser = new BeaconParser();
iBeaconParser.SetBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24");
beaconMgr.BeaconParsers.Add(iBeaconParser);
rangingRegion = new
Region("id",Identifier.Parse(AppEnvVariables.BluetootheBeaconUUID),null, null);
beaconMgr.BackgroundMode = false;
beaconMgr.Bind(this);
}
public void OnBeaconServiceConnect()
{
if (!App.Instance.UISettings.ShowAccessTab)
return;
beaconMgr.ForegroundScanPeriod = 1000;
beaconMgr.ForegroundBetweenScanPeriod = 0;
beaconMgr.UpdateScanPeriods();
beaconMgr.AddRangeNotifier(this);
beaconMgr.StartRangingBeaconsInRegion(rangingRegion);
_beaconServiceConnected = true;
}
public void PauseBeaconService()
{
if (_beaconServiceConnected)
{
beaconMgr.StopRangingBeaconsInRegion(rangingRegion);
beaconMgr.Unbind(this);
}
}
public void ResumeBeaconService()
{
if (_beaconServiceConnected)
{
beaconMgr.Bind(this);
beaconMgr.StartRangingBeaconsInRegion(rangingRegion);
}
}
public void DidRangeBeaconsInRegion(ICollection<AltBeaconOrg.BoundBeacon.Beacon> beacons,
Region region)
{
Xamarin.Forms.Device.BeginInvokeOnMainThread(() =>
{
if (_didRanageBeaconsCalled
|| beacons == null || !beacons.Any()
|| !App.Instance.IsLoggedIn
|| App.Instance.AccessStatusListener == null)
return;
_didRanageBeaconsCalled = true;
try
{
var models = new List<UbiParkApp.Core.Models.Beacon>();
foreach (var beacon in beacons)
{
models.Add(beacon.ToModel());
}
if (!App.Instance.IsInBackground)
{
_ = App.Instance.AccessStatusListener.HandleRangedBeacons(models);
}
}
catch (Exception ex)
{
var logger = App.Container.Resolve<ILogger>();
logger?.TrackError(ex, nameof(BluetoothBeaconService),
nameof(DidRangeBeaconsInRegion), DeviceHelper.UUID);
}
finally
{
_didRanageBeaconsCalled = false;
}
});
}
public bool BindService(Intent intent, IServiceConnection connection, Bind bind)
{
return context.BindService(intent, connection, bind);
}
public void UnbindService(IServiceConnection connection)
{
context.UnbindService(connection);
}
}`
我还使用了 Beacon Scope 应用程序来检测信标,它显示了 68% 的检测率。
应用目前使用的是Xamarin Forms (4.8),由于一些依赖的nuget包,目前无法更新到最新版本。这可能是间歇性空信标列表的原因。
第二个问题是有另一个可用的 nuget 版本(支持 .NetFranework 的 2.7 除外)可以用 Android 12 或更高版本编译。目前的2.17.1有Andoird.Exported not being defined的问题
我试过使用旧版本,结果是一样的。使用多个信标进行测试,信标列表大多数时候会返回一个有效列表,但是检测到的信标数量会间歇性变化。