我正在不断扫描BLE设备。现在在android oreo中操作系统会自动关闭服务,即使应用程序被杀死,还有办法扫描吗?
我已经探索过了
1.)带有通知的前台服务[糟糕的用户体验]
2.)定期工作时间表[低效]
3.)使用辅助功能服务[android扫描使用它的应用程序而不帮助残疾人]或者有没有办法事先得到批准?
如果我遗失了某些内容,请告诉我
答案 0 :(得分:1)
对于全功率扫描,您对这些选项的摘要是准确的。我写了blog post关于这一点,它衡量了不同选项的优缺点。
在Android Beacon Library我们默认选择使用JobScheduler。这可以在后台运行最多每15分钟一次。 IMO,时机是这种方法的真正缺点。如果工作启动仅每15分钟发生一次,那么它的重量和效率会更高,这一事实并不重要。
该图书馆最近还添加了支持,可选择配置foreground service以更频繁地启用扫描。对于许多用例,持久性通知是可以接受的,尽管这对其他用户来说是一个真正的缺点。
不幸的是, Android没有白名单或特殊审批流程来帮助您解决此限制。您唯一的选择是,如果您是设备制造商,并且可以在您自己的自定义Android版本中自定义规则实施
您未提及的另一个选择 Android Beacon Library使用的是使用新的Android O API,您可以通过意图将扫描结果传送到BroadcastReceiver
。如果检测到特定感兴趣的BLE数据包,这适用于扫描过滤器以唤醒您的应用程序。但是一旦检测到一个。在进行此扫描时,您的进程未运行,但在进行此类检测后,它可以在Android 8上运行常规10分钟限制的后台服务。以下示例将结果传递给MyBroadcastReceiver
。
Intent intent = new Intent(mContext, MyBroadcastReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
int result = bluetoothAdapter.getBluetoothLeScanner().startScan(filters, settings, pendingIntent);
通过结合使用上述技术,大多数蓝牙扫描应用程序仍可在Android 8 +上正常运行。