2015-07-09 40 views
0

我试图在Play服务7.3中引入新的CapabilityApi以了解我的Android Wear设备(Asus Zenwatch)的功能。我已经检出this question,并且可以确认Wearable.NodeApi.getConnectedNodes(...)方法确实可以获取连接节点的列表,并且可以看到列表中的手表。这是我在一个应用程序运行在手机上查询连接磨损设备的功能代码:在这种情况下Android Wear:CapabilityApi超时,不返回能力

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()是安全的。我在最后一行插入了一个断点,但是当我点击并跳过它时,调试器从不返回,就好像该方法永远运行并且永不返回。如果我替换等待()等待(10000,TimeUnit.MILLISECONDS),那么它在10秒后才会超时并且功能被指定为空。在配戴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

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

+0

嘿,谢谢你的回答,它确实有效!但是我有一个后续问题,功能仍然是空的,或者是与Android Wear设备配对的手机上的空列表。我更新了这个问题。 –

+0

我认为你误解了Capa的功能Api:这些是你的应用定义的*功能,允许你区分节点。查看[发送消息培训](http://developer.android.com/training/wearables/data-layer/messages.html)了解使用API​​的示例。 – ianhanniballake

+0

啊,我明白了,我怀疑我误解了这个概念。谢谢! –