Как программно очистить Bluetooth-кеш с помощью GattServer

Я немного знаком с BLE и сталкиваюсь с некоторыми проблемами с унаследованным кодом. Поэтому приложение работает так:

  • С включенным BLE приложение сканирует устройства
  • Приложение отображает найденные устройства
  • Пользователь выбирает устройство для сопряжения с
  • Пара приложений с устройством

Проблема, с которой я столкнулся, заключается в том, что после пары несколько раз (она меняется) телефон не может обнаружить устройства, поэтому блокирует пользователя для сопряжения.

Я использую 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();
}

Перезагрузите телефон, выключите Bluetooth и снова включите его, а удаление и установка приложения не устранит проблему. Единственное решение - очистить кеш от приложения Bluetooth Share в менеджере приложений Android.

Этот пост Как программно заставить обнаружение услуг с низким энергопотреблением Bluetooth на Android без использования кеша ссылается на аналогичную проблему, но поскольку мы не используем BluetoothGatt, чтобы подключить его подходящее решение. Также не будет рефакторинг всего унаследованного кода.

Я спрашиваю вас, есть ли способ очистить кэш программно с помощью BluetoothGattServer.

Ответ 1

Одно из решений - решить эту проблему с помощью отражения.

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());
        }
    }

Примечание: я не рекомендую этот путь