Как программно очистить кеш 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.


person Aldo López    schedule 19.01.2017    source источник
comment
Нашли на это ответ? Я столкнулся с аналогичной проблемой.   -  person IgorGanapolsky    schedule 05.04.2017
comment
@IgorGanapolsky выглядит так, будто его нет в сети. Вы нашли какое-нибудь решение? У меня похожая проблема.   -  person Alican Uzun    schedule 17.04.2017
comment
Мы также столкнулись с той же проблемой после выпуска Android 10.   -  person Sanjay Kakadiya    schedule 01.10.2019
comment
@SanjayKakadiya Вы нашли решение для вашего случая?   -  person Keselme    schedule 08.06.2020
comment
@Keselme Да, мы исправили проблему с подключением BLE. Сканируем устройство BLE перед подключением.   -  person Sanjay Kakadiya    schedule 08.06.2020


Ответы (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());
        }
    }

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

person Yogesh Rathi    schedule 01.02.2019
comment
Google добавил ограничения на интерфейсы без SDK. Взгляните здесь - person Sanjay Kakadiya; 01.10.2019