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应该相同