Android iBeacon 检测间歇性失败

问题描述 投票:0回答:0

我正在使用 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的问题

我试过使用旧版本,结果是一样的。使用多个信标进行测试,信标列表大多数时候会返回一个有效列表,但是检测到的信标数量会间歇性变化。

android xamarin bluetooth-lowenergy altbeacon ibeacon-android
© www.soinside.com 2019 - 2024. All rights reserved.