我尝试连接到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");
}
};
}
我想保持尽可能长的连接,持续数小时,这意味着只要您有电池保持连接,就可以像通过蓝牙将智能手环连接到手机一样。
答案 0 :(得分:2)
实际上,您所做的事情似乎没有什么错,实际上,如果您想保持连接尽可能长的时间而忘记处理重新连接,最好的策略是使用autoConnect
参数到connectGatt方法中的true
。设置此参数将通知Android在MiBand 2可用后立即自动连接。如果断开连接,Android将为您连接到它。可能发生的事情取决于您,它很可能与蓝牙设备的固件或移动设备的蓝牙堆栈有关。例如,如果连接的主设备不执行任何操作,则固件本身可能会触发断开连接,只是为了节省几秒钟后的电池电量。
换句话说,如果您的手机的蓝牙芯片组以及外设之一足够好,并且后者的固件不确定地保持连接,则您的应用程序不会断开连接。 / p>
[提示]:如果要实现此目的,我建议使用单独的Android服务来处理那里的所有Bluetooth内容。在官方文档中,您为此使用了basic example。