Android Wear:CapabilityApi 超时,return 功能不会

Android Wear: CapabilityApi times out, doesn't return capabilities

我正在尝试使用 play services 7.3 中引入的新 CapabilityApi 来了解我的 android 穿戴设备(Asus Zenwatch)的功能。我已经检查了 this question 并且可以确认 Wearable.NodeApi.getConnectedNodes(...) 方法确实可以获取连接节点的列表并且我确实在列表中看到了手表。这是我 运行 在我 phone 上的一个应用程序中使用的代码,用于查询连接的穿戴设备的功能:

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 在这种情况下是一个 activity。此调用发生在非 ui 线程上,因此调用 await() 是安全的。我在最后一行插入了一个断点,但是当我点击它并跨过它时,调试器永远不会 returns,就好像方法永远 运行 永远不会 returns 一样。如果我将 await() 替换为 await(10000, TimeUnit.MILLISECONDS),那么它将在 10 秒后超时并且 capabilities 被赋值为 null。 phone 与 android 磨损配对、未配对或模拟器上的行为相同。

我错过了什么吗?使用 CapabilityApi 并获取可用功能列表并且不会超时的正确方法是什么?

编辑 1:

在@ianhanniballake 的帮助下,我想出了这个不会挂起的代码,但是 returns 结果非常 quickly:

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 智能手表配对的 phone 上使用此代码时,capabilities 最终要么空列表,或 null。这是预期的结果吗?我以为我应该得到一份我的智能手表功能的列表。或者这个代码应该是手表本身的 运行?

您必须连接您的 GoogleApiClient。考虑使用 blockingConnect() as you are on a background thread, then checking the resulting ConnectionResult 来确保连接成功。