Мое приложение для Android (реагирует на собственное приложение с именем «myApp») сканирует BLE в течение 10 секунд в цикле (запуск - ожидание 10 секунд - остановка). Я заметил, что через некоторое время (около 7 часов) мое приложениене удается найти какое-либо устройство (хотя устройства вокруг него).
Когда я сохранил и проверил logcat, я увидел, что после каждой попытки сканирования «myApp» пытается запустить registerClient()
и после сканированияunregisterClient()
из GATT
Прямо перед началом проблемы я вижу следующее:
BtGatt.GattService: registerClient() - UUID=c4de3a02-66c8-41ac-bf9d-f42d8f9d160f, pid=2097, name=com.myApp
E bt_att : GATT_Register: can't Register GATT client, MAX client reached!
E bt_btif : Register with GATT stack failed.
bt_att : GATT_Register: can't Register GATT client, MAX client reached!
После еще большей копки в logcat я увидел, что есть еще один клиент, который пытается registerClient()
to GATT:
BtGatt.GattService: registerClient() - UUID=9aa64bcd-402a-4474-ab5d-250e14bd77a1, pid=1311, name=com.google.android.gms.persistent
После поиска "com.google.android.gms.persistent" я обнаружил, что это сервис Google Play.
Этот сервис пытается зарегистрироваться в GATT, нотакже получает ту же проблему (клиент MAX достиг), пока он не попытается зарегистрироваться, когда «myApp» незарегистрирован в GATT - поэтому у него есть доступное место, и затем «myApp» больше не может регистрироваться как «com.google.android.gms.постоянный "не будет нерегулярнымster.
Единственное, что его решает, - это переключение Bluetooth, и затем «myApp» может зарегистрироваться снова.
Кто-то сталкивался с этой проблемой и нашел какое-либо решение?Может быть, как очистить всех клиентов, которые зарегистрированы в службе GATT?
РЕДАКТИРОВАТЬ:
Я использую пакет "LegacyScanManager" и "реагировать на родной менеджер ble".Это функция сканирования (которая вызывает функцию «сканирования» LegacyScanManager):
@ReactMethod
public void scan(ReadableArray serviceUUIDs, final int scanSeconds, boolean allowDuplicates, ReadableMap options, Callback callback) {
Log.d(LOG_TAG, "scan");
if (getBluetoothAdapter() == null) {
Log.d(LOG_TAG, "No bluetooth support");
callback.invoke("No bluetooth support");
return;
}
if (!getBluetoothAdapter().isEnabled()) {
return;
}
synchronized (peripherals) {
Iterator<Map.Entry<String, Peripheral>> iterator = peripherals.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, Peripheral> entry = iterator.next();
if (!entry.getValue().isConnected()) {
iterator.remove();
}
}
}
if (scanManager != null) scanManager.scan(serviceUUIDs, scanSeconds, options, callback);
}
Параметры, которые я передаю:
serviceUUIDs = none (пустой список),
scanSeconds = 10,
allowDuplicates = false,
options = "numberOfMatches = 3, matchMode = 1, scanMode = 0",
callback = мой обратный вызовфункция от JS
Спасибо!