为什么BluetoothGattCallback在几秒钟后仍保持断开状态?

时间:2019-04-12 17:17:38

标签: android bluetooth bluetooth-gatt

我尝试连接到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");
            }
        };

    }

我想保持尽可能长的连接,持续数小时,这意味着只要您有电池保持连接,就可以像通过蓝牙将智能手环连接到手机一样。

1 个答案:

答案 0 :(得分:2)

实际上,您所做的事情似乎没有什么错,实际上,如果您想保持连接尽可能长的时间而忘记处理重新连接,最好的策略是使用autoConnect参数到connectGatt方法中的true。设置此参数将通知Android在MiBand 2可用后立即自动连接。如果断开连接,Android将为您连接到它。可能发生的事情取决于您,它很可能与蓝牙设备的固件或移动设备的蓝牙堆栈有关。例如,如果连接的主设备不执行任何操作,则固件本身可能会触发断开连接,只是为了节省几秒钟后的电池电量。

换句话说,如果您的手机的蓝牙芯片组以及外设之一足够好,并且后者的固件不确定地保持连接,则您的应用程序不会断开连接。 / p>

[提示]:如果要实现此目的,我建议使用单独的Android服务来处理那里的所有Bluetooth内容。在官方文档中,您为此使用了basic example