CapabilityApi 没有 return 任何节点
CapabilityApi does not return any Nodes
我正在尝试在我的手持应用程序和可穿戴应用程序之间进行通信,并且我正在尝试使用 CapabilityApi
找到正确的 Node
。我知道设备已连接 - 其他应用程序和示例工作正常 - 但是当我 运行 我的可穿戴应用程序既不调用 getCapability()
或 getAllCapabilities()
return 任何 Nodes
完全没有。
其他一切似乎都能正常工作 - 事实上,如果我使用 NodeApi
并使用 MessageApi
发送消息,我发现手持设备也能正常工作 - 但功能由于某种原因,每个设备都没有做广告。我已在 res/values 文件夹中正确设置 wear.xml,并确保两个应用程序在 build.gradle.
中设置了相同的 applicationId
我的可穿戴应用中对 CapabilityApi
的调用如下所示:
Wearable.CapabilityApi.getCapability(mGoogleApiClient, SOME_CAPABILITY, CapabilityApi.FILTER_REACHABLE)
.setResultCallback(new ResultCallback<CapabilityApi.GetCapabilityResult>() {
@Override
public void onResult(CapabilityApi.GetCapabilityResult result) {
if (!result.getStatus().isSuccess()) {
return;
}
final CapabilityInfo info = result.getCapability();
updateCapabilities(info);
}
});
但是CapabilityInfo
实例中的Set<Node>
总是空的!同样使用 Wearable.CapabilityApi.getAllCapabilities()
总是 returns 一个空的 List<Node>
!
为了记录,我的手持应用程序的 wear.xml 如下所示:
<resources>
<string-array name="android_wear_capabilities">
<item>some_capability</item>
</string-array>
</resources>
我梳理了我的代码库以查找错误,但我就是找不到。为什么不宣传这些功能没有任何意义。
简答:
对手持和穿戴应用程序使用相同的调试证书,否则CapabilityApi
将无法运行。
长答案:
原来错误很简单!修复它只需要编辑 build.gradle.
中的 signingConfig
我使用通用调试证书对我的手持应用程序的调试版本进行签名:
signingConfigs {
debug {
storeFile file("debug.jks")
storePassword ...
keyAlias ...
keyPassword ...
}
}
buildTypes {
debug {
signingConfig signingConfigs.debug
}
release {
...
}
}
但是我的可穿戴应用程序没有使用相同的调试证书,它显然使用了我的 IDE 提供的默认调试证书。似乎当手持和可穿戴应用程序不使用相同的证书时——即使它只是一个调试版本——那么另一个设备就无法找到一个设备的功能。这实际上很有道理,让整个事情变得混乱的是其他一切似乎都工作得很好,因此很难查明这样的问题。
在我的例子中,我从手持应用程序的 build.gradle 中删除了常见的调试歌唱配置,CapabilityApi
立即开始工作。我认为为可穿戴和手持应用程序设置相同的 debug signingConfig 也可以解决问题,但我现在没有测试。
检查是否:
- 两个模块 build.gradle 中的 ApplicationId 相同
- 两个模块的包名相同
如果您在任何一侧都有两种构建类型(发布和调试),请同时添加另一种。就像我在移动端有两种构建类型:
//Mobile side
buildTypes {
release {
signingConfig signingConfigs.release
}
debug {
applicationIdSuffix = ".debug" // just add debug build type to your watch build.gradle file as well
}
}
所以我添加了
//wear side
debug {
applicationIdSuffix = ".debug"
}
但是不要忘记两边的applicationidsuffix应该相同
我正在尝试在我的手持应用程序和可穿戴应用程序之间进行通信,并且我正在尝试使用 CapabilityApi
找到正确的 Node
。我知道设备已连接 - 其他应用程序和示例工作正常 - 但是当我 运行 我的可穿戴应用程序既不调用 getCapability()
或 getAllCapabilities()
return 任何 Nodes
完全没有。
其他一切似乎都能正常工作 - 事实上,如果我使用 NodeApi
并使用 MessageApi
发送消息,我发现手持设备也能正常工作 - 但功能由于某种原因,每个设备都没有做广告。我已在 res/values 文件夹中正确设置 wear.xml,并确保两个应用程序在 build.gradle.
我的可穿戴应用中对 CapabilityApi
的调用如下所示:
Wearable.CapabilityApi.getCapability(mGoogleApiClient, SOME_CAPABILITY, CapabilityApi.FILTER_REACHABLE)
.setResultCallback(new ResultCallback<CapabilityApi.GetCapabilityResult>() {
@Override
public void onResult(CapabilityApi.GetCapabilityResult result) {
if (!result.getStatus().isSuccess()) {
return;
}
final CapabilityInfo info = result.getCapability();
updateCapabilities(info);
}
});
但是CapabilityInfo
实例中的Set<Node>
总是空的!同样使用 Wearable.CapabilityApi.getAllCapabilities()
总是 returns 一个空的 List<Node>
!
为了记录,我的手持应用程序的 wear.xml 如下所示:
<resources>
<string-array name="android_wear_capabilities">
<item>some_capability</item>
</string-array>
</resources>
我梳理了我的代码库以查找错误,但我就是找不到。为什么不宣传这些功能没有任何意义。
简答:
对手持和穿戴应用程序使用相同的调试证书,否则CapabilityApi
将无法运行。
长答案:
原来错误很简单!修复它只需要编辑 build.gradle.
中的 signingConfig我使用通用调试证书对我的手持应用程序的调试版本进行签名:
signingConfigs {
debug {
storeFile file("debug.jks")
storePassword ...
keyAlias ...
keyPassword ...
}
}
buildTypes {
debug {
signingConfig signingConfigs.debug
}
release {
...
}
}
但是我的可穿戴应用程序没有使用相同的调试证书,它显然使用了我的 IDE 提供的默认调试证书。似乎当手持和可穿戴应用程序不使用相同的证书时——即使它只是一个调试版本——那么另一个设备就无法找到一个设备的功能。这实际上很有道理,让整个事情变得混乱的是其他一切似乎都工作得很好,因此很难查明这样的问题。
在我的例子中,我从手持应用程序的 build.gradle 中删除了常见的调试歌唱配置,CapabilityApi
立即开始工作。我认为为可穿戴和手持应用程序设置相同的 debug signingConfig 也可以解决问题,但我现在没有测试。
检查是否:
- 两个模块 build.gradle 中的 ApplicationId 相同
- 两个模块的包名相同
如果您在任何一侧都有两种构建类型(发布和调试),请同时添加另一种。就像我在移动端有两种构建类型:
//Mobile side
buildTypes {
release {
signingConfig signingConfigs.release
}
debug {
applicationIdSuffix = ".debug" // just add debug build type to your watch build.gradle file as well
}
}
所以我添加了
//wear side
debug {
applicationIdSuffix = ".debug"
}
但是不要忘记两边的applicationidsuffix应该相同