web-dev-qa-db-fra.com

Quel drapeau correct d'autoConnect dans connectGatt de BLE?

mon objectif est d'établir une connexion automatique entre l'appareil Bluetooth Low Energy et le téléphone. J'ai suivi l'exemple de code et j'ai trouvé la ligne

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

Le code ci-dessus signifie que false utilise la connexion automatique. Cependant, j'ai trouvé l'API à ici , il a dit que

BluetoothGatt connectGatt (contexte contextuel, booléen autoConnect, rappel BluetoothGattCallback, transport int) Connectez-vous au serveur GATT hébergé par cet appareil.

Et j'ai également essayé deux drapeaux: true et false, et seul true fonctionne. J'utilise la version> = Android 5.0. Quelque chose est-il incohérent entre le code et l'API? Quel indicateur est correct? Ai-je besoin de noter quelque chose si je veux établir la connexion automatique?

C'est mon code

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;
}
14
Jame

"Connexion directe" est l'opposé de "connexion automatique", donc si vous définissez le paramètre autoConnect sur false, vous obtenez une "connexion directe". Notez que faire un "mBluetoothGatt.connect ()" utilisera également la connexion automatique.

Méfiez-vous de https://code.google.com/p/Android/issues/detail?id=69834 qui est un bogue affectant les anciennes versions de Android qui pourrait faites plutôt de vos connexions automatiques des connexions directes. Cela peut être contourné avec la réflexion.

Il existe quelques différences non documentées entre la connexion directe et la connexion automatique:

La connexion directe est une tentative de connexion avec un délai d'expiration de 30 secondes. Il suspendra toutes les connexions automatiques actuelles pendant la connexion directe. S'il y a déjà une connexion directe en attente, la dernière connexion directe ne sera pas exécutée immédiatement mais sera plutôt mise en file d'attente et démarrera lorsque la précédente sera terminée.

Avec la connexion automatique, vous pouvez avoir plusieurs connexions en attente en même temps et elles n'expireront jamais (jusqu'à ce qu'elles soient explicitement abandonnées ou jusqu'à ce que Bluetooth soit désactivé).

Si la connexion a été établie via une connexion automatique, Android essaiera automatiquement de se reconnecter à l'appareil distant lorsqu'il sera déconnecté jusqu'à ce que vous appeliez manuellement déconnecter () ou fermer (). Une fois la connexion établie via la connexion directe se déconnecte, aucune tentative n'est effectuée pour se reconnecter à l'appareil distant.

La connexion directe a un intervalle de scan et une fenêtre de scan différents à un taux plus élevé que la connexion automatique, ce qui signifie qu'elle consacrera plus de temps à la radio pour écouter les publicités connectables pour le périphérique distant, c'est-à-dire que la connexion sera établie plus rapidement.

NOUVEAU CHANGEMENT DANS Android 10

Depuis Android 10, la file d'attente de connexion directe est supprimée et ne suspendra plus temporairement les connexions automatiques. En effet, la connexion directe utilise désormais la liste blanche comme les connexions automatiques. La fenêtre/l'intervalle d'analyse est améliorée tandis qu'une connexion directe est en cours.

33
Emil