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

Я немного знаком с BLE и столкнулся с некоторой проблемой с унаследованным кодом. Итак, приложение работает так:

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

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

Я использую 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.

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

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

Другие вопросы по тегам