我有一段时间没有在这里发帖了。请原谅我这么晚了还不清楚。
我想听穿戴设备发出的
capabilityClient
声,以了解手持设备何时离线(提醒您忘记携带手机,以供练习)。到目前为止,我的尝试失败了,因此我正在扭转工作流程(从手持设备监听佩戴情况)以简化。
我有一台实体 Pixel 6(手机)和一台实体 Fossil Carlyle HR(手表)。它们是配对的,我几乎每天都使用它们。它们都连接到 ADB,我可以使用 Android Studio 中的 Logcat 监控它们的日志。
我有一个在本地运行的 DataLayer Sample 项目 的稍微修改过的版本。我首先尝试为功能更改设置监听器,但当我的设备离线时我从未收到任何回调。
我转而只寻找节点,以验证是否可以找到。有时,当我查询可到达的节点时,它会返回配对的设备。有时则不然。
我查询节点的问题似乎与配对设备“在附近”有关,但我不确定。
在 MainActivity.kt 中,我有一个触发 queryNodes() 的按钮:
MainActivity.kt
// Sorry for the gratuitous logging and control statements.
// I've been learning Kotlin as I go, and I forgot the value of the debugger.
...
private fun queryNodes() {
Log.d(TAG, "Node Query clicked")
lifecycleScope.launch {
try {
val nodes = getReachableNodes()
.filterValues { MOBILE_CAPABILITY in it }.keys
Log.d(TAG, "Nodes: " + nodes.toString())
} catch (cancellationException: CancellationException) {
throw cancellationException
} catch (exception: Exception) {
Log.d(TAG, "Querying nodes failed: $exception")
}
}
}
...
private suspend fun getReachableNodes(): Map<Node, Set<String>> =
capabilityClient.getAllCapabilities(CapabilityClient.FILTER_REACHABLE)
.await()
// Pair the list of all reachable nodes with their capabilities
.flatMap { (capability, capabilityInfo) ->
Log.d(TAG, "flat mapping " + capability.toString())
capabilityInfo.nodes.map { it to capability }
}
// Group the pairs by the nodes
.groupBy(
keySelector = { it.first },
valueTransform = { it.second }
)
// Transform the capability list for each node into a set
.mapValues { it.value.toSet() }
...
此设置返回空节点列表。
当我将过滤器更改为
FILTER_ALL
时,我能够恢复节点。通过调试器,我发现节点的 isNearby
属性是 false
。我想这就是它无法“可达”的原因。
我该怎么做才能使这些节点可达?这和“附近”有什么关系吗?
我是否用这个
CapabilityClient
找错了树并监听功能变化?
请参阅下图,来自连接指南:
Watch 1
、Phone
和Watch 2
从彼此的角度来看都是可达节点。
Phone
和 Watch 1
彼此邻近。
我该怎么做才能使这些节点可达?
节点必须连接(在线)并配对:“此 API 仅在 Wear OS 手表和配对的 Android 设备上可用”。
这和“附近”有什么关系吗?
不。根据上面的示例,可以从
Watch 2
或 Phone
到达 Watch 1
,但 Watch 2
不在它们附近。
我想从穿戴设备上监听capabilityClient,以了解手持设备何时离线(提醒您忘记手机,以供练习)。
我是否用这个 CapabilityClient 找错了树并监听功能更改?
也许吧。
看起来一种方法是进行两次单独的调用,每个调用都有不同的过滤器,然后减去结果以找出离线的结果。
我建议您在 问题跟踪器 中提出功能请求,解释您的用例。