如何刷新服务/清除缓存?

8
在某些安卓设备上(不管是哪个操作系统版本或蓝牙版本),BLE设备连接后会出现问题。服务/特征没有更新到最新状态。这通常发生在周边设备更改了服务(而应用程序未连接的情况下)。
在这种状态下,无法使用设备。要验证此问题,您可以检索所有特征并发现已过时(从缓存中加载的特征不存在)。
当前解决方案(非编程) 在安卓OS系统设置中重置蓝牙启用状态即可。(关闭并打开蓝牙状态)
此外,在nRF Connect应用程序中有一个名为“Refresh services”的功能
(忽略“Parse known characteristics”这不是问题) 该项目(nRF Connect)未开源。我不知道如何“刷新服务”/“清除缓存”,以避免在连接时加载错误的服务/特征。
如何在安卓(java)中实现此功能?
背景:我正在使用带有本机ble插件的ionic。我可以直接在插件中实现原生代码。
1个回答

13
通常情况下,Android不应缓存未绑定的设备。但是它忽略了这个规则。要刷新缓存,请使用反射调用一个隐藏的方法。
import java.lang.reflect.Method;

使用方法执行此操作:

try {
  // BluetoothGatt gatt
  final Method refresh = gatt.getClass().getMethod("refresh");
  if (refresh != null) {
    refresh.invoke(gatt);
  }
} catch (Exception e) {
  // Log it
}

用法示例:

如果您遇到特征缓存问题。

  1. 调用清除缓存的方法。(等待几秒钟)
  2. 重新连接(断开连接 -> 连接)。

现在应该已经解决了。

注意:刷新方法没有完整的回调。


1
这在Android 9+上不起作用 https://developer.android.com/distribute/best-practices/develop/restrictions-non-sdk-interfaces - Alix
谢谢提供这些信息,我会去查看一下的。你在安卓9上还有缓存问题吗?我还没测试过这个版本。 - Domske
3
经过一些调查,我们得出结论,我们的问题是BLE外设导致了缓存问题。根据BLE规范,一个没有静态GATT服务集合的设备应该声明一个名为“Service Changed”的服务:https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.characteristic.gatt.service_changed.xml - Alix
1
我现在进行了调查,并得出结论,这适用于Android 9和10。 显然,refresh()是“未受限制的灰名单”(注释@UnsupportedAppUsage),这意味着它应该可以工作。 - Alix
请注意refresh()方法上的注释:https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/bluetooth/BluetoothGatt.java - Alix
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接