Android BLE GATT_ERROR (133) при подключении к устройству

Я пытаюсь подключиться к устройству BLE, используя MAC-адрес.

BluetoothDevice device = bluetoothAdapter.getRemoteDevice(rememberedDeviceAddress)
bluetoothDevice.connectGatt(context, false, bluetoothGattCallback);

Я получаю обратный вызов в BluetoothGattCallback.onConnectionStateChange с status = 133 и newState = 2 , даже когда мое устройство BLE выключено.

newState = 2 относится к BluetoothProfile.STATE_CONNECTED, что означает, что я подключен к устройству, а статус = 133 - GATT_ERROR (вместо состояния = 0 УСПЕХ)

Я не получаю ошибку Ошибка регистрации обратного вызова.

Устройство: один плюс один (Android 4.4)

Любые указатели на то, что может вызвать эту проблему, будут полезны.

Примечание. Проблема не возникает на всех устройствах. Все, кажется, отлично работает на Nexus 5 с Android 5.0

Ниже найдите трассировку стека:

03-06 13:00:11.994: D/BluetoothGatt(26771): registerApp()
03-06 13:00:11.994: D/BluetoothGatt(26771): registerApp() - UUID='uuid comes here'
03-06 13:00:12.004: D/BluetoothGatt(26771): onClientRegistered() - status=0 clientIf=5
03-06 13:00:42.004: D/BluetoothGatt(26771): onClientConnectionState() - status=133 clientIf=5 device='device id comes here'

Ответ 1

Для некоторых устройств требуется взаимодействие Bluetooth LE в потоке пользовательского интерфейса. Поэтому я бы рекомендовал попробовать что-то вроде этого:

// Create handler for main thread where mContext is application context
mHandler = new Handler(mContext.getMainLooper());
...
// Connect to BLE device from mHandler
mHandler.post(new Runnable() {
@Override
public void run() {
    mBTGatt = mBTDevice.connectGatt(mContext, false, mGattCallback);
}
});

Конечно, вы также можете использовать Activity.runOnUiThread. Источник: fooobar.com/info/497558/...