首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RxAndroidBle :定期广告扫描

RxAndroidBle :定期广告扫描
EN

Stack Overflow用户
提问于 2017-12-13 10:35:58
回答 1查看 1.4K关注 0票数 2

我需要永久扫描ble广告,而我没有连接到我的设备,以找到它,并知道何时连接到它(特定的产品)。此扫描是在前台服务中实现的,以符合8.0的前提条件。

为了保留一些电池,我希望定期扫描(同时尊重Android 7的启动量/时间限制)。我看到了两个不同的实现:

  • 开始扫描每X秒,并能够停止它在Y秒后,等待时间将是X-Y。

‌扫描‌等待‌扫描‌等待

|--------------|------|--------------|------|

  • 开始扫描X秒,等待Y秒,启动扫描X秒等等。

‌扫描‌等待‌扫描‌等待

|--------------|------|--------------|------|

我想做Rx风格,而不是简单的计时器(我不是一个RX专家)。我不知道哪种解决方案更好/更容易开发。这必须对客户端是透明的,并且必须保持原始的RxAndroidBle工作,订阅=启动流程和取消订阅=停止流程。

我想我必须使用Obersable.interval,但是我不知道如何管理这些代码片段/示例?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-13 12:30:30

最初的Android有BluetoothLeScanner类,它允许使用以下四种模式之一启动扫描:

  • SCAN_MODE_LOW_LATENCY-the扫描是连续的
  • SCAN_MODE_BALANCED-the扫描每5秒工作2秒
  • SCAN_MODE_LOW_POWER-the扫描每5秒工作0.5秒
  • 只有在不同的应用程序启动时,SCAN_MODE_OPPORTUNISTIC-the扫描才能工作。

时间测量由北欧半导体公司的员工完成,并以综合指南的形式发布给Android开发者。

RxAndroidBle库还有一个函数RxBleClient.scanBleDevices(ScanSettings, ScanFilter...),它在ScanSettings对象中接受相同的模式。

如果需要实现不同的扫描参数,就可以简单地使用Observable.takeUntil()Observable.repeatWhen()的组合。

代码语言:javascript
复制
Observable<ScanResult> lowLatencyScanObservable = rxBleClient.scanBleDevices(
  new ScanSettings.Builder()
    .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) // make sure that the scanning will be always on by default
    .build()
);

Observable<ScanResult> periodicalScan = lowLatencyScanObservable
  .takeUntil(Observable.timer(SCAN_TIME, SCAN_TIMEUNIT)) // scan for a specific amount of time and then unsubscribe to the upstream
  .repeatWhen(completionObservable -> completionObservable.delay(PAUSE_TIME, PAUSE_TIMEUNIT)); // when the upstream will complete because of `takeUntil()` wait for the pause time and resubscribe to the upstream

我们仍然需要记住API 24+的无文档“特性”,它防止在30秒内开始超过5次扫描。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47790910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档