I'm working on BLE devices whose address I know.
Before reading a characteristic, I'd like to test if the device isn't already connected.
Seem's it has to be done throught BluetoothManager.getConnectedDevices()
So I wrote a little isConnected() method:

fun isConnected(address: String): Boolean {
  val connDev = bluetoothLEHandler.bluetoothManager.getConnectedDevices(BluetoothProfile.GATT)
  connDev.forEach{ if(it.address == address ) return true }
  return false
}

在判断现有连接后,如果答案是肯定的,我想使用相应的GATT:

if(isConnected(device.address)){//don't reconnect, just trigger connection callback
  onConnectionEstablished(/*here I need the gatt of the already connected device*/)
}

- 我如何才能获得GATT,知道设备,并知道此设备已连接?

->或者我正在try 做一些愚蠢的事情,我应该总是使用device.connectGatt(...)来获得GATT,甚至不try 判断是否还没有连接吗?

- 或者这种情况应该永远不会发生,因为我应该总是关闭以前的连接,即使知道我有很高的可能性必须立即重新连接?

推荐答案

您说得对,BluetothManager.getConnectedDevices()可以用来查看您的设备是否已连接.但是,在与远程GATT设备交互时,更正确(至少更常见)的流程是在初始连接到GATT设备时存储对该设备的引用.然后,只要您想要与该设备交互(读/写/通知等),就可以使用连接回调中的引用.This link很好地概括了这一点:

成功的连接try 将看到onConnectionStateChange() 当其状态参数设置为GATT_SUCCESS并且 NewState参数设置为BluetothProfile.STATE_CONNECTED.对此 点,存储对BluetothGatt对象的引用是至关重要的 这也是由该回调提供的.这将是主要的 向BLE设备发出命令的接口.

因此,换句话说,您不需要断开并重新连接,也不需要在现有连接上调用device.ConnectGatt(),而是使用作为onConnectionStateChage() callback的一部分返回的GATT参数.

Android相关问答推荐

derivedStateOf与使用key和MutableState记住

如何使用Gradle风味在两个Kotlin导入(Google vs Amazon Java billing library)之间进行 Select ?

无法从API访问项目详细信息

约束布局:垂直链中的视图应将内容包裹到空间的1/3

Android和Rust,OpenSSL交叉编译在ARM V7上链接失败

我如何剪裁一个可由另一个合成的

在以XML格式设置完整屏幕视图时可见App Compat按钮

如何在使用带有底部导航组件的片段管理器时更改片段工具栏的标签

页面更改时不显示 cogo toast 消息

我无法连接到信号机

返回并再次打开webview时webview无法打开相机

弹出导航堆栈后,Compose 无法访问 Hilt View Model

如何在我的sqlite数据库中获取某个玩家的分数

面向Jetpack Compose的可组合放置问题

无法找到方法 ''java.io.File > org.jetbrains.kotlin.gradle.tasks.KotlinCompile.getDestinationDir()

组合 - 重新组合图像

Jetpack 组合和片段

Jetpack Compose Tapjacking:过滤对模糊 UI 的touch

如何将私有 mutableStateOf 分配给 Android Jetpack 中的 State 变量?

如何获取 Material Design 3 的底部导航栏高度?