我正在尝试使用play services 7.3中引入的新CapabilityApi来了解我的android穿戴设备(华硕Zenwatch)的功能。我已经检查了这个问题,并且可以确认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配对的手机,或未与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。这是预期的结果吗?我以为我应该得到一份智能手表功能的清单。还是这段代码应该在手表上运行?
必须连接GoogleApiClient
。考虑在后台线程上使用blockingConnect(),然后检查结果ConnectionResult以确保连接成功。