2015-12-16 2 views
0

У меня есть TextViews, которые отображают информацию iBeacon (например, uuid, major, minor и т. Д.) И кнопку Detect/Stop для запуска/остановки сканирования BLE. Когда я нажимаю кнопку, чтобы начать сканирование, когда iBeacon выключен, приложение не отображает ничего, как ожидалось. Однако, когда я запускаю сканирование при включении iBeacon, а затем я выключаю iBeacon во время сканирования, приложение по-прежнему отображает информацию, как будто она все еще обнаруживает iBeacon. Когда приложение сканирует BLE в то время как маяк включен, он даеткак вы обнаруживаете, когда передатчик iBeonon выключен? Android

D/BluetoothAdapter: onScanResult() - Device = (мой номер устройства) RSSI = -49

в LogCat. Когда я выключаю маяк во время сканирования, это дает

D/BluetoothAdapter: startLeScan(): нулевой

и

D/BluetoothAdapter: onClientRegistered() - состояние = 0 clientIf = 4.

Есть ли способ определить, отключен ли iBeonon с помощью LeScanCallback или что-нибудь еще? Я попытался узнать, как это сделать из Android iBeacon Library, но я до сих пор не знаю.

Заранее спасибо.

ответ

2

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

Это может звучать как академическое различие, но это не так: скорости обнаружения в параллельном сравнении между двумя телефонами для одного и того же маяка в одном и том же диапазоне могут очень дико, от многих секунд между обнаружениями до нескольких обнаружений в секунду.

Независимо от того, что вы не используете, убедитесь, что вы проверили его на разных телефонах.

Излишне говорить, что, учитывая отсутствие какого-либо универсального определения того, что означает «выключено», для него нет обратного вызова события.

+0

Это правильно. И при использовании библиотеки Android Beacon обратный вызов 'didExitRegion' - это то, что вы получаете, когда маяк не был обнаружен в течение разумного периода времени (около 6 секунд по умолчанию.) – davidgyoung

+0

Я проверил, когда был получен последний обратный вызов, и сравнивали его с текущим временем. Он работает очень хорошо. Спасибо огромное! – user31534513

0

Какой уровень API для Android вы используете? Если вы используете Android Marshmallow и выше, вы можете использовать ScanSettings.CALLBACK_TYPE_MATCH_LOST. Это отправит вам обратный вызов ScanCallback#onScanResult(int callbackType, ScanResult result), если устройство, обнаруженное вами в соответствии с вашим фильтром соответствия, больше не находится в зоне действия. В другой поговорке, потерянной.

В противном случае вы можете указать поле HashMap<String,Timer> (String для адреса Mac) в своем классе. Обновляйте флаг соответственно каждый раз, когда вы получаете рекламный пакет, чтобы при достижении времени он проверял, находится ли устройство в зоне действия. Если в диапазоне, запустите другой таймер. В противном случае он будет потерян.

+0

«targetAPI» моего приложения - 23, но я тестирую свое приложение по телефону с API 18. Когда я объявляю 'scanCallback' как' private' в классе MainActivity, возникает «NoClassDefFoundError». Я думаю, что это происходит из-за более низкого уровня API в телефоне, который не поддерживает функцию scanCallback. Итак, я попытался реализовать 'scanCallback' в' OnCreate', но это не сработало. В любом случае, ваше решение HashMap отлично работало. Большое спасибо! – user31534513

+0

Я рад, что вы успешно внедрили решение HashMap. Вы можете щелкнуть, чтобы принять этот ответ в качестве решения вашего вопроса. – ulusoyca

Смежные вопросы