未在设备上调用WearableListenerService onMessageReceived

Jin*_*Jin 6 android android-wear-data-api wear-os

我正试图从我的Android Wear应用程序向我的手机应用程序发送一条简单的消息Wearable.MessageApi.

这是我onConnected在Wear设备上从GoogleApiClient回调的.

final PendingResult<Status> status = Wearable.DataApi.addListener(googleApiClient, this);
status.setResultCallback(new ResultCallback<Status>() {
    @Override
    public void onResult(Status status) {
        if (!status.isSuccess()) {
            return;
        }

        NodeApi.GetConnectedNodesResult nodes =
                Wearable.NodeApi.getConnectedNodes(googleApiClient).await();
        for (Node node : nodes.getNodes()) {
            System.out.println("Sending message: " + node.getDisplayName());
            final MessageApi.SendMessageResult result =
                    Wearable.MessageApi.sendMessage(googleApiClient, node.getId(),
                            "request", "12345".getBytes())
                            .await();
            System.out.println("sent: " + result.getStatus().isSuccess());
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

运行时显示以下内容

Sending message: Nexus 6P
sent: true
Run Code Online (Sandbox Code Playgroud)

这是我在我的应用程序上的注册服务:

public class MyWearableListenerService extends WearableListenerService {

    @Override
    public void onMessageReceived(MessageEvent messageEvent) {
        Toast.makeText(this, "Received message", Toast.LENGTH_LONG).show();
    }

    @Override
    public void onPeerConnected(Node peer) {
        Toast.makeText(this, "Peer connected", Toast.LENGTH_LONG).show();
    }
}
Run Code Online (Sandbox Code Playgroud)

我正确地验证Peer connected了当模拟器连接到我的设备时吐司正在显示.我正确地将端口转发到磨损模拟器上进行调试.我检查了我的applicationId和包名在我的应用程序和穿戴应用程序中是否一致.但是,我从来没有onMessageReceived在我的设备上收到回叫.

任何建议都非常感谢!我一直在调试这一整天:(

Jin*_*Jin 9

哦,天啊......我想出了我的问题.我以为的applicationID是一样的,但事实证明,我从来没有设置磨损模块上构建的味道,所以这两个applicationIds实际上com.example.androidcom.example.android.dev..

希望这有助于遇到与我同样问题的其他人:


Dis*_*Dev 5

由于 Android 开发者网站上的(非常)糟糕且过时的文档,我遇到了同样的问题。我正在将一个 Wear 应用程序添加到一个已经存在多年的现有应用程序中。因此,多年来我一直在我的主应用程序中使用自定义 debug.keystore。

当我制作 Wear 应用程序时,我没有更新 build.gradle 以使用与常规应用程序相同的 debug.keystore 文件 - 一旦我这样做了,我就开始从手表 -> 手机接收消息!

如果您遇到与我和 OP 相同的问题,请查看以下清单:

  1. Wear 和 Phone 应用程序需要相同的 applicationId
  2. 应用程序之间的版本号和版本名称相同
  3. 用相同的密钥签名(这解决了我的问题)

我刚刚将“signingConfigs”部分从我的应用程序的 build.gradle 复制到了 Wear 应用程序的 build.gradle

signingConfigs { debug { storeFile file('../app/debug.keystore') } }

这个问题花了我一整天的时间,希望其他人觉得这很有用。