安卓信标库: 保持信标发射器运行"forever"



有没有办法让Beacon Transmitter实例永远发送?

问题:当我回家时,我想要一个独立于Wifi运行或RPi甚至可以访问互联网的RPi检测(例如,当它检测到手机时,它可以打开所有路由器等(。

我的安卓手机上有一个极简主义应用程序,它会发送一个正在运行的iBeacon,RPi上的beacontools库会检测到它。原则上,这运行得很好。(虽然我知道应该是相反的,但我再次希望RPi能够在不上网的情况下做"事情",而手机无法做到这一点(。

然而,安卓手机上的电源管理(?(似乎停止了传输,最近一次是在几个小时后(即使该应用程序没有针对电池使用进行"优化"(。我甚至不确定这是因为电池优化还是其他原因。

迄今为止的解决方案:我使用的是PeriodicWorkRequest,它每30分钟检查一次(我在某个地方读到这是最短时间(,如果信标仍在运行,并重新启动它,如果不是。

这也如预期的那样起作用,但当然,我会在信标传输停止时以及WorkManager再次启动之前的时间段回家。(

一种更清洁的方式是";"截距";当信标发射机被电源管理/电池管理器(??(或其他什么东西杀死时。这可能吗?这些新冠肺炎追踪应用程序正在使用某种东西(我希望(来确保持续传播,但我知道谷歌/苹果必须实现一些基本的东西才能让这些应用程序发挥作用,当然,我不能使用新冠病毒追踪本身,因为它在设计上是匿名的。

准确的答案会因手机制造商而异,因为许多OEM的分叉安卓系统会在后台杀死长期运行的应用程序。请参阅此处,了解OEM面临的挑战摘要。

对于普通的Android(Pixel手机、许多诺基亚Android Once设备(、摩托罗拉甚至大多数三星设备,只要保持前台服务处于活动状态并具有"位置始终运行"权限就足够了。我的BeaconScope应用程序使用这种前台服务技术,我通常会在Pixel或Samsung设备上看到发射器持续运行数周。确保您同意";总是";应用程序的位置权限。

您可以在Android Beacon Library的Kotlin参考应用程序中看到设置前台服务所需的代码。评论指出,前台服务对于连续信标扫描是有用的,但它对于长期信标传输也是有用的。

如果没有前台服务,在香草安卓上,应用程序被置于后台后,信标传输将只持续约10分钟,届时应用程序将被杀死。

定期工作请求或工作服务的问题是,它们在安卓系统上最多每15+/-10分钟运行一次。因此,如果发射器每10分钟就被杀死一次,那么在没有传输的情况下,你最终会有长达15分钟的间隙。在Android 8+上,您别无选择,只能使用前台服务。