Android Wear:CapabilityApi超时,无法返回功能

时间:2015-07-09 21:58:12

标签: android google-play-services wear-os

我正在尝试使用在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智能手表配对的手机上运行此代码时,功能最终会成为空列表,或者为空。这是预期的结果吗?我以为我应该得到一份智能手表的功能列表。或者这个代码应该在手表上运行吗?

1 个答案:

答案 0 :(得分:1)

您必须连接GoogleApiClient。考虑在后台线程上使用blockingConnect(),然后检查生成的ConnectionResult以确保连接成功。