AltBeaconLibrary в сервисе и отдельный процесс. Часть 2

Нужна помощь Спасибо Дэвиду за последний ответ на вопрос - сервис AltBeacon в отдельном андроид-процессе. Я пытаюсь реализовать на Android Xamarin - библиотеку AltBeacon в сервисе и в отдельном процессе. (Отдельный процесс нужен для того, чтобы сканирование работало постоянно, круглосуточно. Что бы андроид не обрезал сканирование через определенное время, после того как телефон перейдет в спящий режим). 1. Что я сделал после инструкций Дэвида - добавленные атрибуты в определении сервиса:   [Service (Name = SERVICE_NAME, Process = ": myProcess", Enabled = true, Exported = false, IsolatedProcess = false)]

  • Установлена ​​новая версия библиотеки - AltBeacon 2.11. На сегодняшний день Xamarin не имеет версии 2.11. Последняя версия 2.7 Я скачал собственную библиотеку AltBeacon v2.11 и обернул ее Managed Callable Wrappers (MCW). [( https://developer.xamarin.com/guides/android/advanced_topics/binding-a-java-library/)][1]. В результате я получил полную библиотеку на Xamarin.  - Подключил эту библиотеку к проекту. Для тестирования я удалил атрибут Process: myProcess и запустил приложение. В одном процессе все работает хорошо. Служба работает и находит биконы. В совершенстве! Но - как только я запустил службу в другом процессе, я перестал получать биконы. После другого метода, который запускает это OnBeaconServiceConnect ().

    public void OnBeaconServiceConnect ()

    {
                for (int i = 0; i < guids.Length; i++)
                {
                    var uuid = Identifier.Parse(guids[i]);
                    var region = new Region("R" + i, uuid, null, null);
                    beaconManager.StartRangingBeaconsInRegion(region);
                }
        } 
    

Оказывается, метод не работает в объекте Range Notifier =(

Примерный пример реализации сервиса:

  public class myService:Service
 {

 private BeaconWorker beaconWorker;

 public myService()
 {
    beaconWorker=new beaconWorker(DroidApplication.CurrentInstanceApp);
 }

 public void MainMethod()
 {
 var notification = ...Build();
  StartForeground(s_id, notification);

    while(true)
    {
     StartMainWork(guids)              
    }    
 }

 public void StartMainWork(string guid)
 {
    beaconWorker.GetResult();
 }

 }
 /////////////////////////////////////
 public class BeaconWorker:IBeaconConsumer
 {
 List<Beacon> Beacons;
 private Context context;
 private RangeNotifier rangeNotifier;
 private BeaconManager beaconManager;

 //This is main configuring scanning
 public BeaconWorker(Context context)
 {
      Context = context;
          this.guids = ...;
            rangeNotifier = new RangeNotifier();
             BeaconManager.SetDebug(true);
             beaconManager = 
           BeaconManager.GetInstanceForApplication(context);
          beaconManager.SetForegroundBetweenScanPeriod(1000);
         beaconManager.SetForegroundScanPeriod(1000);
        beaconManager.SetBackgroundMode(false);
         var beaconParser = new BeaconParser();
          beaconParser.SetBeaconLayout("...");
           beaconManager.BeaconParsers.Add(beaconParser);
            beaconManager.SetRangeNotifier(rangeNotifier);
            beaconManager.ApplySettings();    
 }

 //Method that do bind
public void GetResult()
{
beaconManager.Bind(this);
Task.Wait(3000);
beaconManager.UnBind(this);
}


 //Implement IBeaconConsumer BindService
  public bool BindService(Intent p0, IServiceConnection p1, int p2)
   {   
      return context.BindService(p0, p1, Bind.AutoCreate);         
   }

  public void OnBeaconServiceConnect()
    {
        for (int i = 0; i < guids.Length; i++)
         {
         var uuid = Identifier.Parse(guids[i]);
          var region = new Region("R" + i, uuid, null, null);
            beaconManager.StartRangingBeaconsInRegion(region);
         }
     }  


 private class RangeNotifier
 {

 //THIS METHOD DOES NOT INVOKE =(
  public void DidRangeBeaconsInRegion(ICollection<Beacon> beacons, Region region)
            {               
               this.Beacons = beacons;
            }
 }
 }

В логах телефона есть такая информация:

 Time   Device Name Type    PID Tag Message
01-18 18:52:25.370  AGM A8  Warning 17056   BeaconManager   Ranging/Monitoring may not be controlled from a separate BeaconScanner process.  To remove this warning, please wrap this call in: if (beaconManager.isMainProcess())
Time    Device Name Type    PID Tag Message
01-18 18:52:25.370  AGM A8  Debug   17056   BeaconManager   we have a connection to the service now
Time    Device Name Type    PID Tag Message
01-18 18:52:25.361  AGM A8  Debug   17056   BeaconManager   consumer count is now: 1
Time    Device Name Type    PID Tag Message
01-18 18:52:25.363  AGM A8  Info    17024   BeaconService   beaconService version 2.11 is starting up on the main process

Я знаю о проверке, которую Дэвид указал в ответе на метод IsMainProcess(). Но как я могу назвать эту проверку, если все это происходит в самом сервисе, а не в основном процессе приложения? Скажи мне, где я не прав. Что еще я могу добавить? В статье https://github.com/AltBeacon/android-beacon-library/pull/479 о том, насколько я понял, что бессмысленно указывать RangeNotifier в отдельном процессе. Это так? Буду благодарен за любую помощь! Спасибо!

0 ответов

Другие вопросы по тегам