Какой правильный флаг autoConnect в connectGatt BLE?

Моя цель - установить автоматическое соединение между устройством Bluetooth Low Energy и телефоном. Я следовал примеру кода и нашел строку

// We want to directly connect to the device, so we are setting the autoConnect parameter to false.
mBluetoothGatt = device.connectGatt(this, false, mGattCallback);

Приведенный выше код означает, что false использует для автоматического подключения. Тем не менее, я нашел API на здесь, там говорилось, что

BluetoothGatt connectGatt (контекстный контекст, логическое автоконнект, обратный вызов BluetoothGattCallback, int транспорт) Подключитесь к серверу GATT, размещенному на этом устройстве.

И я также попробовал два флага: true и false, и только true работает. Я использую версию> = Android 5.0. Есть что-то несовместимое между кодом и API? Какой флаг правильный? Нужно ли что-то записывать, если я хочу установить автоматическое соединение?

Это мой код

public boolean connect(final String address) {
    if (mBluetoothAdapter == null || address == null) {
        Log.w(TAG, "BluetoothAdapter not initialized or unspecified address.");
        return false;
    }

    // Previously connected device.  Try to reconnect.
    if (mBluetoothDeviceAddress != null && address.equals(mBluetoothDeviceAddress)
            && mBluetoothGatt != null) {
        Log.d(TAG, "Trying to use an existing mBluetoothGatt for connection.");
        if (mBluetoothGatt.connect()) {
            mConnectionState = STATE_CONNECTING;
            return true;
        } else {
            return false;
        }
    }

    final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
    if (device == null) {
        Log.w(TAG, "Device not found.  Unable to connect.");
        return false;
    }
    // We want to directly connect to the device, so we are setting the autoConnect
    // parameter to false.
    mBluetoothGatt = device.connectGatt(this, true, mGattCallback);
    Log.d(TAG, "Trying to create a new connection.");
    mBluetoothDeviceAddress = address;
    mConnectionState = STATE_CONNECTING;
    return true;
}

Ответы

Ответ 1

"Прямое подключение" противоположно "автоматическому подключению", поэтому, если для параметра autoConnect установлено значение false, вы получите "прямое подключение". Обратите внимание, что для выполнения mBluetoothGatt.connect() также будет использоваться автоматическое подключение.

Остерегайтесь https://code.google.com/p/android/issues/detail?id=69834, которая является ошибкой, затрагивающей более старые версии Android, которые вместо этого могут сделать ваши автоматические подключения прямыми. Это можно обойти с помощью отражения.

Существует несколько недокументированных различий между прямым и автоматическим подключением:

Прямое подключение - это попытка подключения с тайм-аутом 30 секунд. Он приостановит все текущие автоматические подключения, пока идет прямое подключение. Если прямое подключение уже находится в состоянии ожидания, последнее прямое подключение не будет выполнено немедленно, а будет поставлено в очередь и начнется после завершения предыдущего.

При автоматическом подключении вы можете иметь несколько ожидающих подключений одновременно, и они никогда не истечут (до явного прерывания или до отключения Bluetooth).

Если соединение было установлено с помощью автоматического подключения, Android будет автоматически пытаться повторно подключиться к удаленному устройству, когда оно будет отключено, до тех пор, пока вы не вызовете вручную Disnect() или close(). После того как соединение, установленное через прямое соединение, отключается, не предпринимается никаких попыток повторно подключиться к удаленному устройству.

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

НОВОЕ ИЗМЕНЕНИЕ В АНДРОИДЕ 10

Начиная с Android 10, очередь прямого подключения удаляется и больше не приостанавливает автоматическое подключение. Это связано с тем, что прямое подключение теперь использует белый список точно так же, как автоматическое подключение. Окно сканирования/интервал улучшается, пока идет прямое соединение.