Intereting Posts
Изменение цвета текста заголовка ActionBar с использованием темы Light.DarkActionBar в AppCompat 21 StateListDrawable для переключения цветных фильтров Как сделать специальные записи манифеста для плагина intel xdk android Предупреждение NullPointerException для getView () внутри метода onActivityCreated / onStart / onViewCreated RecyclerView внутри ScrollView, некоторые элементы не отображаются Spacing Issue при создании макета шины в режиме ресайклера Gridlayout manager Реализация Text Watcher для EditText Как выровнять центр растрового изображения внутри холста в android? «Службы Google Play обновляются» в API Карт Google. Действие метода ввода EditText не работает при установке imeActionLabel Какова типичная структура компоновки активности настроек Android? Метод ContentObserver onChange () вызывается много раз Как выровнять точки в середине другой точки зрения? Android – FirebaseApp / Firebase-Initialization не запускается Android: Как я могу назвать метод, существующий на другом уровне API?

Связывание устройств BLE автоматически удаляется в Android

Мы делаем ниже процесс, чтобы сделать пару с устройством BLE.

Connect () + DiscoverServices () + Сопряжение (Связывание).

Иногда ОС Android не вписалась в наше устройство BT странным образом, то есть:

  • Без отправки уведомления о том, что состояние связи изменилось
  • Даже системное приложение настроек Bluetooth считает, что устройство все еще сопряжено
  • Только перезагрузка bt (выключение и включение через приложение настроек) обновляет состояние и показывает, что устройство больше не спаривается

Когда устройство успешно соединено, ACTION_BOND_STATE изменяется, как показано ниже.

[6:19:28 PM] Himen Patel: 04-09 18: 18: 27.325: D / BluetoothGatt (8380): onCharacteristicWrite () – Устройство = C2: 69: E9: 57: 93: A4 UUID = 860b2c07-e3c5- 11e2-a28f-0800200c9a66 Состояние = 5 04-09 18: 18: 27.365: E / millisUntilFinished (8380): millisUntilFinished = 15 04-09 18: 18: 28.105: E / BelwithDeviceActor (8380): Состояние связи изменено для: C2: 69: E9: 57: 93: A4 новое состояние: 11 предыдущий: 10

04-09 18: 18: 28.105: E / millisUntilFinished (8380): millisUntilFinished = 20 04-09 18: 18: 29.135: E / millisUntilFinished (8380): millisUntilFinished = 18 04-09 18: 18: 30.135: E / millisUntilFinished (8380): millisUntilFinished = 17 04-09 18: 18: 31.145: E / millisUntilFinished (8380): millisUntilFinished = 16 04-09 18: 18: 32.145: E / millisUntilFinished (8380): millisUntilFinished = 15

04-09 18: 18: 33.105: D / BluetoothGatt (8380): onCharacteristicWrite () – Устройство = C2: 69: E9: 57: 93: A4 UUID = 032a0000-0000-0000-0000-000000000000 Статус = 137 04-09 18: 18: 33.115: E / BelwithDeviceActor (8380): Состояние облигаций изменено для: C2: 69: E9: 57: 93: A4 новое состояние: 12 предыдущее: 11

04-09 18: 18: 33.115: I / System.out (8380): unregisterReceiver true

Теперь, когда Pairing удаляется ОС по странному пути, ACTION_BOND_STATE изменяется, как показано ниже. , , , , Состояние облигации изменено для: C2: 69: E9: 57: 93: новое состояние A4: 10.

Мы также получаем немедленное событие act = android.bluetooth.device.action.ACL_DISCONNECTED flg = 0x4000010 в нашем APP.

Что важно здесь, на данный момент мы просто потеряли связь с устройством, а защищенные характеристики больше не работают для нас. Если мы перезагрузим bt с помощью приложения системных настроек или BluetoothAdapter :: disable () и enable (), мы увидим, что мы не спарены с устройством.

Что забавно, без перезагрузки bt, приложение системных настроек все еще думает и показывает, что мы спарены с устройством.

Протестировано с помощью 4-го уровня 4, работающего 4.4.2, nexus 5 с 4.4.2 и даже галактики Samsung s4 с 4.3.

Мы ожидаем, что:

  • В случае развязывания должно быть передано системное вещание
  • Приложение настроек системы должно показывать текущий статус парирования даже без перезагрузки bt

Мы также наблюдаем и получаем данные, которые были обнаружены, когда мы обнаружили, что наше шифрование установлено на 0x000000, когда наше соединение удаляется ОС по-настоящему.

Solutions Collecting From Web of "Связывание устройств BLE автоматически удаляется в Android"

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

Используя Nexus 7, я провел в основном те же тесты, что и вы, и пришел к такому же выводу: если планшет Android и удаленное устройство уже были связаны, существует высокая вероятность того, что вызов BluetoothGatt.discoverServices () будет отключать и отключать Планшет с удаленного устройства. Но некоторые части ОС Android казались совершенно забытыми для несвязанных; Хотя широковещательный приемник, который вы зарегистрировали для прослушивания изменений связи, был уведомлен о том, что связь между этими двумя устройствами была нарушена, остальная часть ОС Android считала, что облигация по-прежнему остается нетронутой. Поскольку ОС рассматривала планшет и удаленное устройство для соединения, планшет не мог записывать ни на один из зашифрованных дескрипторов на удаленном устройстве, предоставляя статус записи 15 (GATT_INSUFFICIENT_ENCRYPTION) всякий раз, когда была предпринята попытка записи дескриптора.

Решение

Ключ должен устранить Nexus и удаленное устройство, прежде чем у них будет возможность нести себя в этом странном виде. Что я делаю, это проверить, чтобы убедиться, что планшет и удаленное устройство подключены прямо перед тем, как начать сканирование с низкой энергией Bluetooth. Если они спарены, я удаляю связь, используя функцию ниже, а затем запускаю сканирование. Отказ от двух устройств программным образом гарантирует, что ОС Android осознает, что они больше не связаны и, следовательно, пройдут обычный процесс склейки.

Ниже приведен код, используемый для проверки возможности подключения удаленного устройства к планшету и его устранения, если это:

// Get the paired devices and put them in a Set BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices(); // Loop through the Set of paired devices, checking to see // if one of the devices is the device you need to unpair // from. I use the device name, but I'm sure you can find // another way to determine whether or not its your device // -- if you need to. :) for (BluetoothDevice bt : pairedDevices) { if (bt.getName().contains("String you know has to be in device name")) { unpairDevice(bt); } } // Function to unpair from passed in device private void unpairDevice(BluetoothDevice device) { try { Method m = device.getClass().getMethod("removeBond", (Class[]) null); m.invoke(device, (Object[]) null); } catch (Exception e) { Log.e(TAG, e.getMessage()); } } 

Зачем ждать ошибку, а затем решить ее, перезапустив Bluetooth – это плохая идея …

Как вы уже указали в своем вопросе, перезапуск Bluetooth после того, как планшет и удаленное устройство, таинственно не развязанные друг от друга, вынуждают ОС Android осознать, что он больше не связан с удаленным девайсом. Это было оригинальное обходное решение, которое я использовал, но вскоре стало ясно, что с этим «решением» были две серьезные проблемы:

  1. Включение и выключение Bluetooth приведет к отключению всех устройств, подключенных к планшету.
  2. Включение и выключение Bluetooth отнимает много времени.

Я бы только перезапустил Bluetooth как последнее средство. Например, если несвязанная ошибка все же чудесным образом произошла, единственным выбором будет перезапуск Bluetooth.