设备上未调用 WearableListenerService onMessageReceived

问题描述 投票:0回答:5

我正在尝试使用

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

这是我在 Wear 设备上从 GoogleApiClient 进行的

onConnected
回调。

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());
        }
    }
});

运行时显示以下内容

Sending message: Nexus 6P
sent: true

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

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();
    }
}

我正确验证了当模拟器连接到我的设备时,会显示

Peer connected
toast。我正确地进行了端口转发以在磨损模拟器上进行调试。我检查了我的 applicationId 和包名称在我的应用程序和 Wear 应用程序中是否一致。但是,我的设备上从未收到
onMessageReceived
回调。

非常感谢任何建议!我已经调试了一整天了:(

android wear-os android-wear-data-api
5个回答
14
投票

哦,天哪..我找到了我的问题。我以为 applicationId 是相同的,但事实证明我从未在 Wear 模块上设置构建风格,所以这两个 applicationId 实际上是

com.example.android
com.example.android.dev
..

希望这可以帮助其他遇到与我相同问题的人:\


6
投票

由于 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')
    }
}

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


2
投票

也遇到同样的问题..

确保您在穿戴模块中使用的版本至少为18.0.0!

构建.gradle:

   implementation 'com.google.android.gms:play-services-wearable:18.0.0'

1
投票

另一个可能的陷阱,在你的WearableListenerService中,不要忘记对super的调用:

@Override
public void onCreate() {
    super.onCreate(); // <-- don't forget this
    ...
}

0
投票

还要注意导出的标志:它必须是 true

<service
        android:name=".services.DataLayerListenerService"
        android:exported="true">
© www.soinside.com 2019 - 2024. All rights reserved.