21

私の目標は、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(Context context, boolean autoConnect, BluetoothGattCallback callback, int transport) このデバイスがホストする GATT サーバーに接続します。

そして、私は 2 つのフラグも試しました: trueand false, and のみが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;
}
4

2 に答える 2

43

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

https://code.google.com/p/android/issues/detail?id=69834に注意してください。これは古いバージョンの Android に影響を与えるバグであり、自動接続が代わりに直接接続になる可能性があります。これはリフレクションで回避できます。

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

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

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

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

直接接続は、自動接続よりも高い負荷でスキャン間隔とスキャン ウィンドウが異なります。つまり、リモート デバイスの接続可能なアドバタイズメントをリッスンするためにより多くの無線時間が割り当てられます。つまり、接続がより速く確立されます。

Android 10 の新しい変更点

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

于 2016-10-22T00:20:48.850 に答える