Не могу отключить устройство BLEAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Не могу отключить устройство BLE

Сообщение Anonymous »


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

Вот мой код:

публичный класс BLEConnectionService расширяет сервис { частный Bluetooth-адаптер mBluetoothAdapter; Контекст mContext; частный BluetoothDevice mmDevice; частный BluetoothGattCallback mBLECallback; BluetoothGattCharacteristic пробная характеристика; BluetoothGattCharacteristic aqiCharacteristic; общедоступный BluetoothGatt mBluetoothGatt; ArrayList gattInstances = новый ArrayList(); частный строковый адрес; public BLEConnectionService (контекст контекста, строковый адрес, int num) { мКонтекст = контекст; этот.адрес = адрес; mBLECallback = новый BluetoothGattCallback () { @Override public void onConnectionStateChange (BluetoothGatt gatt, int status, int newState) { mBluetoothGatt = gatt; если (newState == BluetoothProfile.STATE_CONNECTED) { // успешно подключено к серверу GATT BroadcastUpdate (ACTION_GATT_CONNECTED); gattInstances.add(mBluetoothGatt); DiscoverGattServices (Гатт); } Еще если (newState == BluetoothProfile.STATE_DISCONNECTED) { // отключен от сервера ГАТТ BroadcastUpdate (ACTION_GATT_DISCONNECTED); Log.d("BLEService", "GATT ОТКЛЮЧЕН!"); if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.BLUETOOTH_CONNECT}, 100); } mBluetoothGatt.close(); мBluetoothGatt = ноль; } } // Другие методы обратного вызова... // Определить метод onServicesDiscovered напрямую public void onServicesDiscovered (BluetoothGatt gatt, int status) { если (статус == BluetoothGatt.GATT_SUCCESS) { printGattTable(Гатт); if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.BLUETOOTH_CONNECT}, 100); } mBluetoothGatt.setCharacteristicNotification(probCharacteristic, true); mBluetoothGatt.setCharacteristicNotification(aqiCharacteristic, true); BroadcastUpdate (ACTION_GATT_SERVICES_DISCOVERED); } еще { // Не удалось обнаружить службы if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.BLUETOOTH_CONNECT}, 100); } гатт.отключить(); } } @Override public void onCharacteristicRead (BluetoothGatt gatt, характеристика BluetoothGattCharacteristic, значение byte [], int status) { если (статус == BluetoothGatt.GATT_SUCCESS) { int intValue = ByteBuffer.wrap(value).order(ByteOrder.LITTLE_ENDIAN).getInt(); updateViewModel (характеристика, intValue); BroadcastUpdate (ACTION_DATA_AVAILABLE, характеристика, intValue); } еще { Log.d("BLEService", "Не удалось обнаружить характеристики"); } } @Override public void onCharacteristicChanged (BluetoothGatt gatt, характеристика BluetoothGattCharacteristic) { Log.d("BLEService", "характеристика изменена!"); if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.BLUETOOTH_CONNECT}, 100); } mBluetoothGatt.readCharacteristic(характеристика); } }; } частная пустота DiscoverGattServices (BluetoothGatt gatt) { если (гатт != ноль) { if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.BLUETOOTH_CONNECT}, 100); } gatt.discoverServices(); } } публичная логическая инициализация () { mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); если (mBluetoothAdapter == ноль) { вернуть ложь; } вернуть истину; } public boolean Connect (конечный адрес строки) { if (mBluetoothAdapter == null || адрес == null) { вернуть ложь; } пытаться { mmDevice = mBluetoothAdapter.getRemoteDevice(адрес); если (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.BLUETOOTH_CONNECT}, 100); } mmDevice.connectGatt(mContext, false, mBLECallback, BluetoothDevice.TRANSPORT_LE); } catch (исключение IllegalArgumentException) { Log.w("BLEService", "Устройство по указанному адресу не найдено."); вернуть ложь; } // подключаемся к серверу GATT на устройстве вернуть истину; } общественная недействительность close () { если (mBluetoothGatt == ноль) { возвращаться; } if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.BLUETOOTH_CONNECT}, 100); } mBluetoothGatt.disconnect(); BroadcastUpdate (ACTION_GATT_DISCONNECTED); while (!gattInstances.isEmpty()) { BluetoothGatt btg = gattInstances.remove(0); БТГ.отключить(); BroadcastUpdate (ACTION_GATT_DISCONNECTED); } } Private void BroadcastUpdate (последнее действие строки) { окончательное намерение намерение = новое намерение (действие); mContext.sendBroadcast(намерение); } } Вот две важные части:

mBLECallback = новый BluetoothGattCallback() { @Override public void onConnectionStateChange (BluetoothGatt gatt, int status, int newState) { mBluetoothGatt = gatt; если (newState == BluetoothProfile.STATE_CONNECTED) { // успешно подключено к серверу GATT BroadcastUpdate (ACTION_GATT_CONNECTED); gattInstances.add(mBluetoothGatt); DiscoverGattServices (Гатт); } Еще если (newState == BluetoothProfile.STATE_DISCONNECTED) { // отключен от сервера ГАТТ BroadcastUpdate (ACTION_GATT_DISCONNECTED); Log.d("BLEService", "GATT ОТКЛЮЧЕН!"); if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.BLUETOOTH_CONNECT}, 100); } mBluetoothGatt.close(); мBluetoothGatt = ноль; } } // Другие методы обратного вызова... // Определить метод onServicesDiscovered напрямую public void onServicesDiscovered (BluetoothGatt gatt, int status) { если (статус == BluetoothGatt.GATT_SUCCESS) { printGattTable(Гатт); if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.BLUETOOTH_CONNECT}, 100); } mBluetoothGatt.setCharacteristicNotification(probCharacteristic, true); mBluetoothGatt.setCharacteristicNotification(aqiCharacteristic, true); BroadcastUpdate (ACTION_GATT_SERVICES_DISCOVERED); } еще { // Не удалось обнаружить службы if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.BLUETOOTH_CONNECT}, 100); } гатт.отключить(); } } и

public void close() { если (mBluetoothGatt == ноль) { возвращаться; } if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.BLUETOOTH_CONNECT}, 100); } mBluetoothGatt.disconnect(); BroadcastUpdate (ACTION_GATT_DISCONNECTED); while (!gattInstances.isEmpty()) { BluetoothGatt btg = gattInstances.remove(0); БТГ.отключить(); BroadcastUpdate (ACTION_GATT_DISCONNECTED); } } Я отключаюсь, вызывая функцию close. функция onConnectionStateChange вызывается после того, как я вызываю disconnect(). У меня есть список массивов gattInstances, чтобы избежать повторного подключения. Но этого не произошло, я поменял и каждый раз gattInstance только один.

Я также читал что-то о том, что Гатту нужно собирать мусор, но я не уверен, что это так.

Любая помощь/предложения очень ценятся :D
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»