【发布时间】:2015-07-09 21:58:12
【问题描述】:
我正在尝试使用 play services 7.3 中引入的新 CapabilityApi 来了解我的 android 穿戴设备(Asus Zenwatch)的功能。我已经检查了this question 并且可以确认 Wearable.NodeApi.getConnectedNodes(...) 方法确实可以获取连接节点的列表,并且我确实在列表中看到了手表。这是我在手机应用程序中运行的代码,用于查询连接的穿戴设备的功能:
GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(context)
.addApi(Wearable.API)
.build();
PendingResult<CapabilityApi.GetAllCapabilitiesResult> result =
Wearable.CapabilityApi.getAllCapabilities(mGoogleApiClient, CapabilityApi.FILTER_ALL);
Map<String, CapabilityInfo> capabilities = result.await().getAllCapabilities();
context 在这种情况下是一个活动。此调用发生在非 ui 线程上,因此调用 await() 是安全的。我在最后一行插入了一个断点,但是当我点击它并跳过它时,调试器永远不会返回,就好像该方法永远运行并且永远不会返回一样。如果我将 await() 替换为 await(10000, TimeUnit.MILLISECONDS),那么它会在 10 秒后超时,并且将 capabilities 分配为 null .在与 android wear 配对、未配对或在模拟器上的手机上的行为是相同的。
我错过了什么吗?使用 CapabilityApi 并获取可用功能列表且不会超时的正确方法是什么?
编辑 1:
在@ianhanniballake 的帮助下,我想出了这段代码,它不会挂起,但会很快返回结果:
ConnectionResult connectionResult = mGoogleApiClient.blockingConnect(CONNECTION_TIME_OUT_MS, TimeUnit.MILLISECONDS);
if (connectionResult.isSuccess()) {
PendingResult<CapabilityApi.GetAllCapabilitiesResult> result =
Wearable.CapabilityApi.getAllCapabilities(mGoogleApiClient, CapabilityApi.FILTER_ALL);
mGoogleApiClient.disconnect();
Map<String, CapabilityInfo> capabilities =
result.await().getAllCapabilities();
return capabilities != null && !capabilities.isEmpty();
} else {
mGoogleApiClient.disconnect();
return false;
}
但是,当我在与 Android 智能手表配对的手机上运行此代码时,capabilities 最终会显示为空列表或 null。这是预期的结果吗?我以为我应该得到一份智能手表功能的清单。或者这段代码应该在手表本身上运行?
【问题讨论】:
标签: android google-play-services wear-os