我正在尝试使用在Play服务7.3中引入的新CapabilityApi来了解我的Android服装设备(华硕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();
在这种情况下,上下文是一项活动。此调用发生在非ui线程上,因此调用await()是安全的。我在最后一行插入了一个断点,但当我点击它并跳过它时,调试器永远不会返回,就好像该方法永远运行并且永远不会返回。如果我将 await()替换为 await(10000,TimeUnit.MILLISECONDS),那么它会在10秒后超时并且功能被指定为null 。在与Android服装配对的电话上,或与之配对的电话或模拟器上的行为相同。
我错过了什么吗?什么是使用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智能手表配对的手机上运行此代码时,功能最终会成为空列表,或者为空。这是预期的结果吗?我以为我应该得到一份智能手表的功能列表。或者这个代码应该在手表上运行吗?
答案 0 :(得分:1)
您必须连接GoogleApiClient
。考虑在后台线程上使用blockingConnect(),然后检查生成的ConnectionResult以确保连接成功。