如何在前台和后台使用Android Beacon库检测信标?

时间:2019-10-24 12:47:52

标签: android xamarin beacon

我正在尝试在我的应用程序运行时检测到信标,并将它们放在列表中,还检测何时未运行并显示通知。我似乎无法在android上同时工作。

我的主要活动是...

[Activity(LaunchMode = LaunchMode.SingleInstance, Label = "MyApp", Icon = "@mipmap/icon", MainLauncher = true, Theme = "@style/MainTheme", ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity, IMonitorNotifier, IRangeNotifier, IBeaconConsumer, IBootstrapNotifier

protected override void OnCreate(Bundle savedInstanceState)
{
    set beacon parsers
    beaconmanager.bind(this)
    ...

public void OnBeaconServiceConnect()
{
    BeaconManager.AndroidBeaconManager.RemoveAllMonitorNotifiers();
    BeaconManager.AndroidBeaconManager.RemoveAllRangeNotifiers();

    BeaconManager.AndroidBeaconManager.AddMonitorNotifier(this);
    BeaconManager.AndroidBeaconManager.AddRangeNotifier(this);

    StartMonitoringBeacons...
    StartRangingBeacons...
}

然后我有一个单独的课程...

[Activity(LaunchMode=LaunchMode.SingleInstance, Label="MyApp", MainLauncher = true)]
public class LaunchApplication : Application, IBootstrapNotifier, IRangeNotifier, IBeaconConsumer
{
    private RegionBootstrap _bootstrap = null;

    public override void OnCreate()
    {
        base.OnCreate();

        var proximities = BeaconManager.Instance.GetServerProximitiesAsync().GetAwaiter().GetResult();
        var regions = proximities.Select(x => new Region(x.UUID, null, null, null)).ToList();

        BeaconManager.GetParsers().ForEach(x => BeaconManager.AndroidBeaconManager.BeaconParsers.Add(x));

        _bootstrap = new RegionBootstrap(this, regions);
    }
    public void DidEnterRegion(Region region)
    {
        add parsers
        beaconmanager.bind(this);
    }
    public void OnBeaconServiceConnect()
    {
        BeaconManager.AndroidBeaconManager.AddMonitorNotifier(this);
        BeaconManager.AndroidBeaconManager.AddRangeNotifier(this);

        start monitoring...
        start ranging...

我不会在清单中添加任何内容,因为我相信它会自动添加Activity属性。

我的问题是我应该有一个MainActivity和一个独立的类,该类从Application派生(创建区域引导程序)吗?

我绑定到其他实例(bind(this))吗?

当我调试LaunchApplication OnCreate时,永远不会调用它,那么它将如何创建区域引导程序?

我应该如何设置它以便仅在前景和后台运行时进行检测?

谢谢。

2 个答案:

答案 0 :(得分:1)

对于此特定问题,您无需在活动中调用bind()- RegionBootstrap已在内部完成它(只要您可以确认在自定义应用程序类中调用过onCreate)。

要使这两个地方都能正常工作,您只需要删除对bind()的调用,并删除删除活动中测距和监视区域的代码(如果删除所有监视器通知程序,则可以有效地禁用RegionBootstrap回调,因为您正在删除其通知程序)。只需将代码留在您的活动中,即可为该活动添加新的监视器和范围通知程序,并根据活动的需要开始进行范围和监视。

请注意,BeaconManager是单例。您对应用程序的所有组件(应用程序和活动类实例)都有一组范围和受监视区域。因此,您只需绑定一次(构造即可,并且您可以添加任意数量的通知程序。如果在一个类中删除通知程序,则也会从其他类中删除它们。

答案 1 :(得分:0)

这不能解决您的问题,但可以作为一个起点:

https://github.com/acaliaro/AltBeaconLibrarySample

这是@davidgyoung库的“ java绑定”

https://github.com/acaliaro/BeaconLibraryBindings

您还可以在这里找到一些内容:https://github.com/chrisriesgo/Android-AltBeacon-Library