我的android应用(名为“ myApp”的本地本机应用)正在循环扫描BLE 10秒钟(开始-等待10秒钟-停止) 我注意到一段时间(大约7个小时)后,我的应用程序找不到任何设备(尽管周围有设备)。
保存并检查了logcat后,我发现每次尝试扫描后,“ myApp”都会尝试运行registerClient()
,并且在从GATT扫描unregisterClient()
之后
在问题开始之前,我可以看到以下内容:
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()
进入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客户端),直到在未从GATT取消注册“ myApp”时尝试注册-这样它就有可用的位置,然后“ myApp”无法注册不再存在,因为“ com.google.android.gms.persistent”不会取消注册。
解决该问题的唯一方法是切换蓝牙,然后“ myApp”可以重新注册。
有人遇到此问题并找到任何解决方案吗?也许如何清除所有注册到GATT服务的客户?
编辑:
我正在使用“ LegacyScanManager”和“ react native ble manager”软件包。 它的扫描功能(正在调用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回调函数
谢谢!