gpt4 book ai didi

android - BLE 的 connectGatt 中 autoConnect 的哪个正确标志?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:33:23 27 4
gpt4 key购买 nike

我的目标是在低功耗蓝牙设备和手机之间建立自动连接。我按照示例代码进行操作,找到了这一行

// 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)Connect to GATT Server hosted by this device.

而且我还尝试了两个标志: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;
}

最佳答案

“直接连接”与“自动连接”相反,因此如果您将 autoConnect 参数设置为 false,您将获得“直接连接”。请注意,执行“mBluetoothGatt.connect()”也会使用自动连接。

当心https://code.google.com/p/android/issues/detail?id=69834这是一个影响旧版本 Android 的错误,可能会使您的自动连接成为直接连接。这可以通过反射来解决。

直接连接和自动连接之间存在一些未记录的差异:

直接连接是一种有 30 秒超时的连接尝试。当直接连接正在进行时,它将暂停所有当前的自动连接。如果已经有一个直接连接挂起,最后一个直接连接将不会立即执行,而是排队等候并在前一个完成时开始。

通过自动连接,您可以同时拥有多个挂起的连接,并且它们永远不会超时(直到明确中止或直到蓝牙关闭)。

如果连接是通过自动连接建立的,Android 将在断开连接时自动尝试重新连接到远程设备,直到您手动调用 disconnect() 或 close()。一旦通过直接连接建立的连接断开,就不会尝试重新连接到远程设备。

与自动连接相比,直接连接具有不同的扫描间隔和扫描窗口,这意味着它将投入更多的 radio 时间来监听远程设备的可连接广告,即连接将更快建立。

Android 10 的新变化

从 Android 10 开始,直接连接队列被删除,不会再暂时暂停自动连接。这是因为直接连接现在像自动连接一样使用白名单。在进行直接连接时,扫描窗口/间隔得到改善。

关于android - BLE 的 connectGatt 中 autoConnect 的哪个正确标志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40156699/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com