需要帮助。感谢大卫对问题的最后答案 - 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是没有意义的。是这样吗? 我将不胜感激任何帮助!谢谢!