startLeScan () имеет время ожидания? - PullRequest
0 голосов
/ 11 сентября 2018

Я хочу разработать приложение для Android, которое всегда слушает хорошую рекламу, полезную для маяков.Приложение имеет активность и фоновый сервис.Все операции BLE выполняются в сервисе, и этот сервис выполняет сообщение REST, когда находит конкретный mac:

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

public void onLeScan (конечное устройство BluetoothDevice, final int rssi, byte [] scanRecord) ...

Если я запускаю приложение и отключаю смартфон, экран выключается, ноприложение продолжает работать, потому что я вижу в журнале службы REST, что был звонок.Тем не менее, примерно через 3 часа приложение для Android перестает звонить в службу отдыха.

Так как для службы Android установлено приложение Sticky, приложение снова разглядывают и закрывают приложение.Через 3 секунды служба запускается, и я вижу, что остальные звонки завершены.Однако через 15 минут служба перестает вызывать сервер отдыха.

Вся логика находится внутри обратного вызова onLeScan ().Таким образом, я могу сделать вывод, что этот обратный вызов перестает быть вызванным, даже несмотря на то, что существует множество устройств BLE, которые постоянно рекламируют ...

Пожалуйста, какие-либо советы по этому поводу?

Большое спасибо

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

Меня не беспокоит, если приложение убито или пользователь даже убивает приложение!Нет проблем, так как сервис продолжает работать хорошо

0 голосов
/ 24 сентября 2018

В моем понимании процесс сканирования не имеет временных рамок.Разработчики должны вызвать stopScan (), чтобы остановить процесс сканирования.Некоторым устройствам BLE необходим фон процесса scan () для получения уведомлений устройства.Я думаю, ваши маяки в этой категории.Три общих предложения, которыми я могу поделиться с вами

  1. Если вам требуется продолжить процесс сканирования, лучше выполнить процесс сканирования в рабочем потоке.

  2. В Android 6 и далее сервисы претерпели радикальные изменения.Поэтому вместо использования службы используйте Job Service или WorkManager.

  3. Метод сканирования BLE устарел.Вы можете использовать этот метод только в Android OS 4.8.В Android OS 5 и более поздних версиях вам нужно использовать метод startScan ().

Ниже приведена реализация My Scanning (версия Kotlin)

     /**
         * 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

0 голосов
/ 11 сентября 2018

Во-первых, не используйте старый API сканирования.Используйте новое, введенное в Lollipop.Причина в том, что вам нужно выполнить отфильтрованное сканирование, чтобы оно продолжалось вечно.Фильтр должен быть установлен в соответствии с тем, что содержится в данных рекламы.

Во-вторых, используйте службу Foreground, чтобы убедиться, что процесс вашего приложения через некоторое время не прерывается.ИЛИ используйте новый API, где вы устанавливаете PendingIntent, который выполняется при совпадении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...