AltBeaconLibrary在服务和单独的过程中。第2部分

时间:2018-01-18 18:15:28

标签: android xamarin altbeacon

需要帮助。感谢大卫对问题的最后答案 - AltBeacon service in separate android process。 我正在尝试在服务中和单独的进程中实现Xamarin Android - AltBeacon库。 (需要一个单独的过程来确保扫描不间断,全天候工作。 在手机进入睡眠模式后,Android在一段时间后不会切断扫描的内容)。 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属性并运行了应用程序。 在一个过程中,一切运作良好。该服务工作并找到bicons。完美! 但是 - 当我在另一个过程中启动服务时,我就停止了接收。 触发此操作的另一个方法是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

我知道David在IsMainProcess()方法的答案中指出的验证。但是,如果所有这些都发生在服务本身而不是主应用程序进程中,我如何调用此检查? 告诉我我哪里错了。我还能添加什么? 在文章https://github.com/AltBeacon/android-beacon-library/pull/479中 我多少意识到在单独的进程中指定RangeNotifier是没有意义的。是这样吗? 我将不胜感激任何帮助!谢谢!

0 个答案:

没有答案