如何使用GattServer以编程方式清除蓝牙缓存

时间:2017-01-19 21:13:18

标签: android bluetooth bluetooth-lowenergy clear-cache bluetooth-peripheral

我对BLE略显熟悉,我在使用继承的代码时遇到了一些问题。因此应用程序的工作原理如下:

  1. 启用BLE后,应用会扫描设备
  2. 该应用程序显示找到的设备
  3. 用户选择要与
  4. 配对的设备
  5. 应用与设备配对
  6. 我面临的问题是,配对好几次后(会有所不同),手机无法发现设备,从而阻止用户配对。

    我使用GattServer连接客户端设备,我正在重置服务,如下所示:

    public void resetBluetoothGattServer() {
        Log.i(TAG," resetBluetoothGattServer: bluetoothGattServer: "+ bluetoothGattServer);
        if (bluetoothGattServer != null) {
            if(!bluetoothGattServer.getServices().isEmpty()){
                Log.i(TAG," resetBluetoothGattServer: clearing services on bluetooth Gatt Server");
                bluetoothGattServer.clearServices();
            }
            Log.i(TAG," resetBluetoothGattServer: closing bluetoothGattServer");
            bluetoothGattServer.close();
        }
        bluetoothGattServer = openGattServer();
    }
    

    重新启动手机,关闭蓝牙然后重新打开,卸载并安装应用程序无法解决问题。唯一的解决方案是从Android应用程序管理器上的蓝牙共享应用程序中清除缓存。

    这篇文章How to programmatically force bluetooth low energy service discovery on Android without using cache解决了类似的问题,但由于我们没有使用BluetoothGatt来连接它,因此没有合适的解决方案。也不会重构整个继承的代码。

    我问你是否有办法使用BluetoothGattServer以编程方式清除缓存。

1 个答案:

答案 0 :(得分:0)

一种解决方案-使用反射解决此问题。

private void refreshDeviceCache(BluetoothGatt gatt) {
        try {
            Method localMethod = gatt.getClass().getMethod("refresh");
            if(localMethod != null) {
                localMethod.invoke(gatt);
            }
        } catch(Exception localException) {
            Log.d("Exception", localException.toString());
        }
    }

注意:我不推荐这种方式