【问题标题】:WearableListenerService onMessageReceived is not called on device设备上未调用 Wea​​rableListenerService onMessageReceived
【发布时间】:2020-02-21 12:30:25
【问题描述】:

我正在尝试使用 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 回调。

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

【问题讨论】:

  • 请看一下这个要点。它可以帮助您解决问题gist.github.com/schwiz/84f14c94d4a95c3b77be
  • 感谢分享。我已经根据您的要点检查了所有内容,唯一的区别是我尝试将消息从磨损发送到设备,而您尝试将消息从设备发送到磨损。不过,我认为这不会影响任何事情。
  • 好的。让我们做点魔法吧。尝试在两台设备上手动卸载您的应用 apk .. 并再次测试
  • 试过了,没有运气:(在两个设备上都卸载并重新安装(首先是应用程序,然后是磨损).. gah,很确定它只是一些配置混乱导致消息被丢弃。我希望有更多的日志记录:\
  • 请查看这个库。它对于 WearbleApi 来说有点薄 github.com/Mariuxtheone/Teleport 它的源代码可能对你有帮助

标签: android wear-os android-wear-data-api


【解决方案1】:

哦,天哪……我发现了我的问题。我以为 applicationId 是一样的,但事实证明我从来没有在 wear 模块上设置过构建风格,所以这两个 applicationId 实际上是 com.example.androidcom.example.android.dev..

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

【讨论】:

    【解决方案2】:

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

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

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

    1. Wear 和 Phone 应用需要相同的 applicationId
    2. 应用之间的 ve​​rsionNumber 和 versionName 相同
    3. 由同一个密钥签名(这是解决我的问题的原因)

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

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

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

    【讨论】:

    • 非常感谢。文档确实需要更清楚地说明这一点。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-24
      • 2021-02-20
      • 2018-01-22
      • 2018-10-01
      相关资源
      最近更新 更多