Intereting Posts
Проблемы с загрузкой плагинов в Android Studio Какое имя файла используется по умолчанию для общих настроек? Kotlin on android: Не удается найти основной объединенный манифест. Что вызывает эту ошибку? Android SharedPreferences putStringSet order / sort Android: получение списка приложений для устройств – очень медленно Как мы можем получить arraylist (как строку, так и целое число) из ресурсов xml Google Maps v2 Projection.toScreenLocation (…) чрезвычайно медленный Как написать многопользовательское приложение Android с очень глубокой навигацией Использовать XML-макет в качестве представления для подкласса View? Список файлов, сохраненных во внутреннем хранилище Как записать звук с помощью Bluetooth-гарнитуры Добавление «контекстного голосового меню« ok glass »в рамках погружения Java.lang.NullPointerException в файле android.support.v7.widget.RecyclerView.onMeasure Сводка обновления для PreferenceActivity Закругленный прогресс в пределах округленного шага выполнения

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

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

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

Прежде всего, я не мог решить проблему с сбоем 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-объекта на устройство.