Intereting Posts
Модернизация Как распечатать ответ JSON Ctrl click class в Eclipse показывает двоичный / jar вместо источника Существуют ли какие-либо свободно доступные версии Roboto, дополненные эммиджи-глифами? Как показать заголовок ListView, когда его пустой Предотвращение блокирования фонового обслуживания из-за «обнаружения чрезмерного процессора на разветвленном процессе» Когда будут применяться MeasureSpec.UNSPECIFIED и MeasureSpec.AT_MOST? Как распечатать данные из приложения Android на WIFI-принтер? Как установить высоту recyclerview программно? Разница между Total Private Dirty, Total Pss, Total Shared Dirty в Android Как предотвратить удаление приложения? Закрыть Spinner на клике за пределами Spinner Android: меню переполнения стиля в панели действий Уведомления GCM push на Android 3.1: отключить широковещательный приемник Does / Will Google будет поддерживать NDK C ++ сбои в Firebase Crash Reporting? Ответ Входящий звонок в Android 6.0

Android перестает находить устройства BLE: onClientRegistered () – status = 133 clientIf = 0

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

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

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

а также

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

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

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

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

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

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

 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, но ничего не помогает. Как я могу это исправить?

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

Прежде всего, я не мог решить проблему с сбоем Bluetooth после mClientIf значение 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); } 

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

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