web-dev-qa-db-ja.com

BLEのconnectGattのautoConnectの正しいフラグはどれですか?

私の目標は、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が自動接続に使用することを意味します。しかし、私は here でAPIを見つけました、それはそれを言った

BluetoothGatt connectGatt(Context context、boolean autoConnect、BluetoothGattCallback callback、int transport)このデバイスがホストするGATTサーバーに接続します。

また、2つのフラグtruefalseも試しましたが、動作するのは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;
}
14
Jame

「直接接続」は「自動接続」の反対なので、autoConnectパラメータをfalseに設定すると、「直接接続」が取得されます。 「mBluetoothGatt.connect()」を実行すると、自動接続も使用されることに注意してください。

https://code.google.com/p/Android/issues/detail?id=69834 に注意してくださいAndroidの古いバージョンに影響するバグです代わりに自動接続を直接接続にしてください。これは反射で回避できます。

直接接続と自動接続の間には、文書化されていないいくつかの違いがあります。

直接接続とは、タイムアウトが30秒の接続試行です。直接接続の進行中は、現在の自動接続をすべて一時停止します。保留中の直接接続がすでにある場合、最後の直接接続はすぐには実行されず、キューに入れられ、前回の接続が終了したときに開始されます。

自動接続を使用すると、複数の保留中の接続を同時に持つことができ、タイムアウトすることはありません(明示的に中止されるか、Bluetoothがオフになるまで)。

自動接続を介して接続が確立された場合、Androidは、disconnect()またはclose()を手動で呼び出すまで、リモートデバイスが切断されると自動的に再接続を試みます。直接接続は切断され、リモートデバイスへの再接続は試行されません。

直接接続では、自動接続とは異なるスキャン間隔とスキャンウィンドウが使用されます。つまり、リモートデバイスの接続可能なアドバタイズをリッスンするために、より多くの無線時間を費やします。つまり、接続がより速く確立されます。

新しい変更点Android 10

Android 10なので、直接接続キューは削除され、一時的に自動接続を一時停止しなくなります。これは、直接接続が自動接続と同じようにホワイトリストを使用するようになったためです。スキャンウィンドウ/間隔は直接接続が進行している間は改善されます。

33
Emil