2016-09-22 5 views
9

Я разрабатываю приложение, в котором я могу найти и настроить устройства BLE. Я использую стандартный Android BLE API, но в последнее время я столкнулся с некоторыми странными проблемами.Android перестает находить устройства BLE: onClientRegistered() - status = 133 clientIf = 0

Когда я включаю свое приложение, проверка BLE работает нормально. Я сканирование с помощью:

mBluetoothAdapter.startLeScan(mLeScanCallback); // for Kitkat and below 

и

mBluetoothAdapter.getBluetoothLeScanner().startScan(mScanCallback); // for Lollipop and above 

В LogCat я получаю следующее сообщение (я думаю, что это важно для этого вопроса):

D/BluetoothAdapter: onClientRegistered() - status=0 clientIf=5 

В моем приложении I также могут считывать определенные характеристики с моих устройств BLE (например, состояние батареи). Я подключаюсь к устройству для считывания этой характеристики в отдельном фрагменте, используя:

mBluetoothManager = (BluetoothManager) mContext.getSystemService(Context.BLUETOOTH_SERVICE); 
mBluetoothAdapter = mBluetoothManager.getAdapter(); 
mBluetoothDevice = mBluetoothAdapter.getRemoteDevice(mMacAddress); 
mBluetoothGatt = mBluetoothDevice.connectGatt(mContext, false, mGattCallback); 

Характеристики читаются правильно. В onCharacteristicRead обратного вызова Я также отключить и закрыть Гатт:

mBluetoothGatt.disconnect(); 
mBluetoothGatt.close(); 

Каждый раз, когда я открыть фрагмент, чтобы прочитать характеристику (независимо от того, является ли это то же устройство или нет) clientIf значение увеличивается. Я могу видеть в LogCat:

D/BluetoothGatt: onClientRegistered() - status=0 clientIf=6 
D/BluetoothGatt: onClientRegistered() - status=0 clientIf=7 
D/BluetoothGatt: onClientRegistered() - status=0 clientIf=8 
D/BluetoothGatt: onClientRegistered() - status=0 clientIf=9 
D/BluetoothGatt: onClientRegistered() - status=0 clientIf=10 

Все работает отлично, пока значение не станет равным clientIf 10. BLE сканирования останавливается найти какое-либо устройство, я не могу подключиться к любому из моих устройств читать любые характеристики и т.д., и LogCat бесконечно отображает эти сообщения:

D/BluetoothGatt: unregisterApp() - mClientIf=0 
D/BluetoothGatt: onClientRegistered() - status=133 clientIf=0 

единственный способ исправить это, чтобы убить приложение и перезапустить его или перезапустить Bluetooth, выключив его и вручную. Я столкнулся с этой проблемой только на некоторых устройствах, таких как Xperia Z1 (Android KitKat) и Galaxy S4 (Android Lollipop). Я не смог воспроизвести эту проблему на Xperia Z3 Compact под управлением Android Marshmallow ...

Есть ли что-нибудь, что я могу сделать? Я уже пробовал несколько «решений», таких как вызов всех методов BLE из потока пользовательского интерфейса и закрытие/отключение GATT, но ничего не помогает. Как я могу это исправить?

ответ

8

Я отвечу на свой вопрос, потому что, возможно, это поможет кому-то с той же проблемой.

Прежде всего, я не смог исправить проблему с сбоем Bluetooth после того, как значение mClientIf достигло значения 10. Однако я нашел обходное решение, которое помогло мне в моем случае.

Несмотря на то, что я остановил поиск маяковых в первом Fragment, и начальная характеристика, прочитанная в другом, BLE API, по-видимому, не остановила поиск немедленно, и после открытия следующего Fragment система создавала еще один «клиент».

Вот почему мне нужно подождать некоторое время после выхода из первого Fragment и перед тем, как начать читать характеристику в другом.

Этот метод вызывается в onCreateView «нового» Fragment (с помощью postDelayed помог мне решить эту проблему):

private void getBatteryCharacteristic() { 
     new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       mBeaconBatteryStateReader = new BeaconBatteryStateReader(
         BeaconDetailsActivity.this, 
         mBeacon.getMacAddress()); 
       mBeaconBatteryStateReader.readBatteryState(BeaconDetailsActivity.this); 
      } 
     }, 100); 
    } 
+1

у меня был подобный вопрос и для меня добавляя небольшую задержку между отключением и сканирование решена проблема тоже. Благодаря! – Tijn

+0

Я нашел то же самое решение, что и вы. Подробности: https://github.com/googlesamples/android-BluetoothLeGatt/issues/44 –

0

Закрытие gatt-объекта - это правильный способ освобождения ресурсов. Если он по-прежнему не работает, в Android на этом телефоне есть ошибка.

Чтобы свести к минимуму вероятность достижения предела, вы можете убедиться, что у вас никогда не было более одного gatt-объекта на устройство.