Сканирование библиотеки AltBeacon в BoundService не останавливается при отмене привязки () - Android O - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь найти маяк, а затем, как только я его обнаружу, запускаю рекламу сервера GATT со своего телефона.Проблема заключается в том, что сканирование, по-видимому, не останавливается должным образом, а затем прерывает мое соединение с устройствами, подключающимися к серверу GATT.

Первое, что я попробовал, - это остановка и открепление моего BeaconScannerService с помощью * 1003.*

beaconManager.unbind(this)

внутри onUnbind () и OnStopService ().

После того, как это не сработало, я попытался отсоединить сканер сразу после нахождения моего маяка:

override fun didRangeBeaconsInRegion(beacons: Collection<Beacon>, region: Region) {
        if (beacons.isNotEmpty()) {
            for (beacon in beacons) {
                if (!listOfBeacons.contains(beacon)) {
                    listOfBeacons.add(beacon)
                    sendNotificationFound()
                    localIntent.putExtra("BT_Address", beacon.bluetoothAddress)
                    localIntent.putExtra("Is_Connected", true)
                    LocalBroadcastManager.getInstance(this).sendBroadcast(localIntent)
                    Log.e("BEACON", "FOUND ONE " + beacon.bluetoothAddress)
                }
            }
            Log.e(TAG, "Stopping Service")
            beaconManager.stopRangingBeaconsInRegion(region)
            beaconManager.removeAllRangeNotifiers()
            beaconManager.stopMonitoringBeaconsInRegion(region)
            beaconManager.removeAllMonitorNotifiers()
            beaconManager.unbind(this)
            beaconManager.isBound(this)
            stopSelf()
        }
    }

Я также включил опцию отладки BeaconManager, но так много всего происходит, что я понятия не имею, что будет полезно.

В конце я просто хотел бы иметь возможность полностью избавиться от всего сканирования маяка после того, как я обнаружил свой маяк.

1 Ответ

0 голосов
/ 05 июля 2019

Несколько моментов, чтобы уточнить, что здесь происходит:

  • Существует два способа использовать библиотеку маяков Android для фоновых обнаружений на Android 8+: с сканированиями, инициированными JobScheduler (по умолчанию) и с IntentService (только если вы делаете вызов, чтобы отключить настройки по умолчанию - обычно это делается в соединение с услугой переднего плана).
  • При использовании JobScheduler сканирование выполняется в фоновом режиме примерно каждые 15 минут, как разрешено операционной системой, и выполняет сканирование BLE с низкой задержкой, чтобы найти все видимые маяки.
  • В промежутке между 15-минутными заданиями, если маяки не видны, библиотека также настроит сканирование на основе намерений, чтобы активировать библиотеку (и ваше приложение), чтобы выполнить дополнительное сканирование, если появятся какие-либо маяки. Это сканирование не запускается, если ни один регион не ранжирован или не отслеживается. Если запуск начался, он останавливается в начале следующего задания.
  • Строка журнала «Получил фоновое сканирование Android O через намерение» относится к получению результата от типа сканирования в точке выше.

Я подозреваю, что есть некоторые условия гонки библиотек, которые могут оставить это сканирование на основе намерений включенным в вашем конкретном случае. Это может решить проблему, чтобы не вызывать unbind(), а вместо этого просто прекратить измерения и мониторинг, как вы это сделали.

Если это не сработает, то, если вы приложите отрывок из журнала, когда пытаетесь остановить службу, до того момента, когда вы видите, что «получил фоновое сканирование Android O через намерение», я могу помочь отследить проблема. (Пожалуйста, также дайте мне знать номер версии библиотеки, которую вы используете.)

Наконец, я должен добавить, что был бы удивлен, если оставить это сканирование действительно «затем прерывает мое соединение с устройствами, подключающимися к серверу GATT». Вы можете обнаружить, что это не является основной причиной этой проблемы.

...