Как обнаруживать маяки с помощью библиотеки Android 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 (который создает загрузочную область)?

привязать к разным экземплярам (привязать (это))?

Когда я отлаживаю LaunchApplication, OnCreate никогда не вызывается, так как же он вообще может создать загрузочную область?

как я должен настроить это, чтобы просто обнаруживать при работе на переднем плане и в фоновом режиме?

Спасибо.


person JackSojourn    schedule 24.10.2019    source источник
comment
Какую библиотеку Xamarin вы используете для этого? Есть ли примеры настройки RegionBootstrap? Я ведущий разработчик библиотеки Android Beacon и знаю, как она работает с собственными приложениями, но я не уверен, как обертка библиотеки Xamarin меняет это. Вы явно должны попасть на onCreate, чтобы вас как-то назвали. Нам нужен эксперт по Xamarin, чтобы помочь с этим.   -  person davidgyoung    schedule 24.10.2019
comment
Спасибо за помощь, Дэвид. Проблема в том, что я не вижу возможности для приложения сканировать маяки на переднем плане и сканировать их, когда они не работают. Как только вы вызываете RegionBootstrap, он избавляется от существующих мониторов и рейнджеров. Вы когда-нибудь писали приложение, которое поддерживает и то, и другое без Xamarin?   -  person JackSojourn    schedule 25.10.2019


Ответы (2)


Для этой конкретной проблемы вам не нужно вызывать bind () в действии - это уже было сделано внутри RegionBootstrap (при условии, что вы можете подтвердить, что onCreate вызывается в пользовательском классе приложения).

Чтобы это работало в обоих местах, вам просто нужно удалить вызов bind () и вынуть код, который удаляет регионы ранжирования и мониторинга в действии (если вы удалите все уведомляющие мониторы, вы фактически отключите обратные вызовы RegionBootstrap, потому что вы удаляете его уведомитель). Просто оставьте в своем действии код, который добавляет новые мониторы и уведомления о диапазоне для этого действия, и начните ранжирование и мониторинг по желанию для этого действия.

Имейте в виду, что BeaconManager - синглтон. У вас есть один набор ранжированных и отслеживаемых регионов для всех компонентов вашего приложения (как приложения, так и экземпляра класса активности). Из-за этого вам нужно выполнить привязку только один раз (построив, и вы можете добавить столько уведомителей, сколько захотите. Если вы удалите уведомители в одном классе, они также будут удалены из других классов.

person davidgyoung    schedule 28.10.2019
comment
Дэвид ... Я проверил, что если я использую BackgroundPowerSaver (this); тогда это работает. Без него я не получаю никаких событий на переднем плане во время работы, а также при использовании RegionBootstrap. ты знаешь причину этого? У меня сейчас все в основном занятии. - person JackSojourn; 02.11.2019

Это не ответ на вашу проблему, но может быть отправной точкой:

https://github.com/acaliaro/AltBeaconLibrarySample

это "привязка java" к библиотеке @davidgyoung

https://github.com/acaliaro/BeaconLibraryBindings

Вы также можете найти кое-что здесь: https://github.com/chrisriesgo/Android-AltBeacon-Library

person Alessandro Caliaro    schedule 24.10.2019