Почему BluetoothGattCallback продолжает отключаться через несколько секунд? - PullRequest
1 голос
/ 12 апреля 2019

Я пытаюсь подключиться к MiBand 2 и сохраняет соединение, но через несколько секунд происходит сбой и повторное подключение.

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

При подключении устройства я делаю это:

private void connectDevice(BluetoothDevice itemAtPosition) {
            itemAtPosition.createBond();
            Log.i("BOND","Created with device");
        bluetoothGatt = itemAtPosition.connectGatt(getApplicationContext(), true, miBandGattCallBack);

    }

А на GattCallBack следующее.

miBandGattCallBack = new BluetoothGattCallback() {
            @Override
            public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
                switch (newState) {
                    case BluetoothGatt.STATE_DISCONNECTED:
                        Log.d("Info", "Device disconnected");

                        break;
                    case BluetoothGatt.STATE_CONNECTED: {
                        Log.i("Infooo", "Connected with device");
                        Log.i("Infooo", "Discovering services");
                        gatt.discoverServices();
                    }
                    break;
                }
            }

            @Override
            public void onServicesDiscovered(BluetoothGatt gatt, int status) {

                if (!sharedPreferences.getBoolean("isAuthenticated", false)) {
                    authoriseMiBand();
                    SharedPreferences.Editor editor = sharedPreferences.edit();
                    editor.putBoolean("isAuthenticated", true);
                    editor.apply();
                } else
                    Log.i("Device", "Already authenticated");
            }

            @Override
            public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {

            }

            @Override
            public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
                super.onCharacteristicWrite(gatt, characteristic, status);
            }

            @Override
            public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {

            }

            @Override
            public void onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
                Log.d("Descriptor", descriptor.getUuid().toString() + " Read");
            }

            @Override
            public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
                Log.d("Descriptor", descriptor.getUuid().toString() + " Written");
            }
        };

    }

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

1 Ответ

2 голосов
/ 12 апреля 2019

Кажется, нет ничего плохого в том, что вы делаете, на самом деле, если вы хотите сохранить соединение как можно дольше, забывая об обработке переподключений, лучшая стратегия - использовать параметр autoConnect для true в методе connectGatt .Установка этого параметра скажет Android автоматически подключаться к MiBand 2, как только он станет доступным.Если он отключится, Android подключится к нему под капотом для вас.То, что, вероятно, происходит там, зависит не от вас, и, скорее всего, это связано либо с прошивкой устройства Bluetooth, либо со стеком Bluetooth мобильного устройства.Например, сама прошивка может вызвать отключение, чтобы сэкономить батареи через несколько секунд, если подключенное ведущее устройство не выполняет никаких действий.

Другими словами, если Bluetooth-чипсет вашего мобильного телефона исправенДостаточно, как и периферийного, а прошивка последнего сохраняет соединение неопределенно, вы не получите никакого отключения в вашем приложении.

[СОВЕТ]: Если вы хотите достичь этой целиЯ предлагаю использовать отдельную службу Android для обработки всех вещей Bluetooth там.В официальной документации у вас есть базовый пример для этого.

...