startLeScan()是否超时?

时间:2018-09-11 18:09:33

标签: android bluetooth-lowenergy

我想开发一个始终收听ble广告的Android应用程序,对信标很有用。该应用程序具有活动和后台服务。所有BLE操作均在服务中完成,并且该服务在找到特定的mac时执行REST帖子:

... mBluetoothAdapter.startLeScan(this); ...

LeScan上的public void(最终的BluetoothDevice设备,最终的int rssi,byte [] scanRecord) ...

如果我运行应用程序并放开智能手机,则屏幕会关闭,但应用程序仍会继续工作,因为我在REST服务日志中可以看到有一个电话。但是,大约3小时后,Android应用程序停止调用其余服务。

由于android服务为Sticky,因此再次盯着该应用并关闭该应用。 3秒钟后,服务启动,我看到休息电话响了。但是,在15分钟后,该服务停止了调用剩余服务器。

所有逻辑都在onLeScan()回调内部。因此,我可以推断,即使有很多BLE设备不断进行广告宣传,该回调也会停止调用beeing。

请问对此有什么提示吗?

非常感谢

3 个答案:

答案 0 :(得分:0)

首先,不要使用旧的扫描API。使用Lollipop中引入的新功能。这样做的原因是您需要执行过滤扫描以使其永远持续下去。需要根据广告数据包含的内容来设置过滤器。

第二,使用前台服务来确保您的应用程序进程不会在一段时间后被杀死。或者使用新的API,您可以在其中设置在发生匹配时执行的PendingIntent。

答案 1 :(得分:0)

据我了解,扫描过程没有时间表。开发人员需要调用stopScan()来停止扫描过程。某些BLE设备需要scan()进程背景来获取设备通知。我认为,您的信标属于该类别。我可以与您分享的三个常见建议

  1. 如果需要继续扫描过程,最好在辅助线程中进行扫描过程。

  2. 在Android 6及更高版本中,服务发生了翻天覆地的变化。因此,不要使用服务,而要使用Job Service或WorkManager。

  3. BLE扫描方法已被弃用。您只能在Android OS 4.8中使用此方法。从Android OS 5开始,您需要使用startScan()方法。

下面给出了我的扫描实现(科林版)

     /**
         * Scan The BLE Device
         * Check the available BLE devices in the Surrounding
         * If the device is Already scanning then stop Scanning
         * Else start Scanning and check 10 seconds
         * Send the available devices as a callback to the system
         * Finish Scanning after 10 Seconds
         */
        fun scanBLEDevice(isContinuesScan: Boolean) {
            try {
                mIsContinuesScan = isContinuesScan

                if (mScanThread != null) {
                    /**
                     * Already Running - No need to rescan
                     */
                    return
                }

                mScanThread = Thread(mScanRunnable)
                mScanThread.start()

                /**
                 * Stop Scanning after a Period of Time
                 * Set a 10 Sec delay time and Stop Scanning
                 * collect all the available devices in the 10 Second
                 */
                if (!isContinuesScan) {
                    mHandler?.postDelayed({
                        // Set a delay time to Scanning
                        stopScan(mDeviceObject)
                    }, BLEConstants.SCAN_PERIOD) // Delay Period
                }
            } catch (e: Exception) {
                Log.e(TAG, e.message)
            }

        }

   private val mScanRunnable = Runnable {
        if (mBluetoothAdapter != null && mBluetoothAdapter!!.isEnabled) {
            scan()
        }
    }

    private fun scan() {
        if (isLollyPopOrAbove()) {// Start Scanning For Lollipop devices
            mBluetoothAdapter?.bluetoothLeScanner?.startScan(/*scanFilters(),
            scanSettings(),*/scanCallback) // Start BLE device Scanning in a separate thread
        } else {
            mBluetoothAdapter?.startLeScan(mLeScanCallback) // Start Scanning for Below Lollipop device
        }
    }

如果您需要更多信息,可以访问我的博客

https://medium.com/@nithinjith.p/ble-in-android-kotlin-c485f0e83c16

答案 2 :(得分:-2)

如果应用程序被杀死,或者用户甚至杀死了该应用程序,也不会打扰我!没问题,因为服务继续正常运行