【问题标题】:Sending messages from Android Wear to host device从 Android Wear 向主机设备发送消息
【发布时间】:2014-07-06 11:05:57
【问题描述】:

我正在编写一个自定义 Android Wear 应用程序,该应用程序应该向连接的主机设备(手机)发出一次性消息。通过 API 挖掘,我发现以下教程应该很好用:http://developer.android.com/training/wearables/data-layer/messages.html

我的 Android 应用有一个 WearableListenerService,我的 Android Wear 应用使用消息 API 触发消息。 WearableListenerService get 在模拟器连接时调用,基于记录以下方法,所以我很确定服务连接正常

@Override
public void onPeerConnected(Node peer) {
    super.onPeerConnected(peer);

    String id = peer.getId();
    String name = peer.getDisplayName();

    Log.d(LOG_TAG, "Connected peer name & ID: " + name + "|" + id);
}

日志输出:

/AndroidWearListenerService(19892): Connected peer name & ID: facdc219-37f5-4326-8fa6-1c8b8d3b6669|facdc219-37f5-4326-8fa6-1c8b8d3b6669

但是,onMessageReceived 方法永远不会被触发:

@Override
public void onMessageReceived(MessageEvent messageEvent) {
    Log.d(LOG_TAG, "MessageEvent received: " + messageEvent.getData());
    //do work
}

这是我的 Android Wear 代码。我已经删除了大部分样板代码,只留下了必要的部分

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my);

    final GoogleApiClient googleApiClient = new GoogleApiClient.Builder(this)
            .addApi(Wearable.API)
            .build();

    googleApiClient.connect();

    final WatchViewStub stub = (WatchViewStub) findViewById(R.id.watch_view_stub);
    stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {
        @Override
        public void onLayoutInflated(WatchViewStub stub) {
            fireMessage();
        }

        private void fireMessage() {
            // Send the RPC
            PendingResult<NodeApi.GetConnectedNodesResult> nodes = Wearable.NodeApi.getConnectedNodes(googleApiClient);
            nodes.setResultCallback(new ResultCallback<NodeApi.GetConnectedNodesResult>() {
                @Override
                public void onResult(NodeApi.GetConnectedNodesResult result) {
                    for (int i = 0; i < result.getNodes().size(); i++) {
                        Node node = result.getNodes().get(i);
                        String nName = node.getDisplayName();
                        String nId = node.getId();
                        Log.d(TAG, "Node name and ID: " + nName + " | " + nId);

                        Wearable.MessageApi.addListener(googleApiClient, new MessageApi.MessageListener() {
                            @Override
                            public void onMessageReceived(MessageEvent messageEvent) {
                                Log.d(TAG, "Message received: " + messageEvent);
                            }
                        });

                        PendingResult<MessageApi.SendMessageResult> messageResult = Wearable.MessageApi.sendMessage(googleApiClient, node.getId(),
                                PATH, null);
                        messageResult.setResultCallback(new ResultCallback<MessageApi.SendMessageResult>() {
                            @Override
                            public void onResult(MessageApi.SendMessageResult sendMessageResult) {
                                Status status = sendMessageResult.getStatus();
                                Log.d(TAG, "Status: " + status.toString());
                                if (status.getStatusCode() != WearableStatusCodes.SUCCESS) {
                                    alertButton.setProgress(-1);
                                    label.setText("Tap to retry. Alert not sent :(");
                                }
                            }
                        });
                    }
                }
            });
        }
    });
}

日志似乎表明消息已成功发送,但 Android 应用的 WearableListenerService.onMessageReceived 从未触发。

D/MyWearApp MyActivity( 2014): Node name and ID: a2ba665d-a559-4a95-91d2-c16fc7873e28 | a2ba665d-a559-4a95-91d2-c16fc7873e28
D/MyWearApp MyActivity( 2014): Status: Status{statusCode=SUCCESS, resolution=null}

有什么想法吗?

【问题讨论】:

  • 我在我的应用程序中使用了您的代码,并且遇到了同样的问题。我检查了 build.gradle 和 applicationId 对于移动和穿戴应用程序是一样的。但错误仍然存​​在
  • 看起来您在代码中为每个连接的节点添加了一个侦听器。我可能不会导致您的问题,但它看起来不正确。

标签: wear-os


【解决方案1】:

您是否确保两个应用(即 Android Wear 上的应用和手机上的应用)的“applicationId”相同?

【讨论】:

  • 这为我解决了问题。不知道 Android Wear build.gradle 中有一个 applicationId。有趣的是,在 Android 应用程序中,我没有定义 applicationId。为了让它工作,我只是确保 Android Wear 应用程序中的 applicationId 与 Android 应用程序的包名称匹配。
  • 两个应用程序的 applicationId 必须相同,否则 Android 将不知道应该将消息发送到哪个位置。没有任何消息传递函数采用参数来指定对等方。所以它是由applicationId自动指定的。
  • 是的,这行得通。他们在任何地方的文档中都有这个吗?这是 Google Play 服务客户端的标准吗?
  • 我在我的应用程序中使用了您的代码,并且遇到了同样的问题。我检查了 build.gradle 和 applicationId 对于移动和穿戴应用程序是相同的。但错误仍然存​​在
  • 这里有更多关于 build.gradle 文件中的 applicationId 的信息:Android Tools Project 如果答案本身包含 defaultConfig() sn-p,这将有所帮助。
【解决方案2】:

当我为现有应用添加 Android Wear 支持时,我遇到了同样的问题。然而,经过数小时的挫折。我发现了问题。

我忘记在 Wear 应用的设备应用中添加来自 build.gradle 的签名部分。 因此,请确保两个应用程序中的 buildTypes 部分和 signingConfigs 部分相同。

【讨论】:

  • 你先生是个传奇!!我也浪费了很多时间,实际上是几天,直到这颗宝石救了我的命:)
【解决方案3】:

我遇到了与此处https://plus.google.com/116088533685577893615/posts/deCyoF6ALvV 讨论的类似问题。根据我的实验,手表应用程序的包名称似乎(尽管没有记录)需要与手持应用程序的相同。我在这里https://github.com/petrnalevka/wear为消息api创建了一个示例项目。

【讨论】:

    【解决方案4】:

    尝试在 sendMessage() 方法的末尾添加 await()。

    PendingResult<MessageApi.SendMessageResult> messageResult = Wearable.MessageApi.sendMessage(googleApiClient, node.getId(),
                                    PATH, null).await();
    

    下面的上一个答案是仅在 Android 设备(移动)中的 Activity 处于活动状态时发送消息。

    由于您尝试从 Android Wear 向 Android 设备发送消息,消息监听器应添加到 Android 设备中的 Activity 中,而不是 Android Wear 中,应在 Android(移动)中的 MainActivity 中添加以下代码

    final GoogleApiClient googleApiClient = new GoogleApiClient.Builder(this)
            .addApi(Wearable.API)
            .build();
    
    googleApiClient.connect();
    
    Wearable.MessageApi.addListener(googleApiClient, new MessageApi.MessageListener() {
             @Override
             public void onMessageReceived(MessageEvent messageEvent) {
                      Log.d(TAG, "Message received: " + messageEvent.getPath());
             }
    });
    

    你也可以试试更简单的 SendMessage() 方法

    SendMessageResult result = Wearable.MessageApi.sendMessage(
            mGoogleApiClient, node.getId(), "STRING TO BE SENT", null).await();
    if (!result.getStatus().isSuccess()) {
        Log.e(TAG, "ERROR: failed to send Message: " + result.getStatus());
    }
    

    【讨论】:

    • 在我的手机上,我实现了 WearableListenerService 在我的 Android Wear 上,我使用 Message API 来触发消息 Android Wear 中的 MessageListener 位用于监听消息是否成功传递(这是不正确的用法?)我无法在活动中实现 MessageApi.MessageListener,因为我希望我的应用即使没有运行也能做出反应(因此 WearableListenerService)
    • @ebernie 能否展示您的代码或提供 GitHub 链接。我无法在两周内解决这个问题
    【解决方案5】:

    我有一些示例代码,可以让消息正常工作,从穿戴设备到穿戴设备。 https://github.com/kentarosu/AndroidWearAndLIFX

    【讨论】:

      【解决方案6】:

      几个月前,我在使用 android wear 时遇到了同样的问题。我的问题是 - 两个 apk 的不同签名(签名 apk 后生成的 SHA 指纹),而应用程序密钥相同。请参阅下面的链接:

      OnMessageReceived not called in WearableListenerService

      希望这对某人有所帮助。

      【讨论】:

        【解决方案7】:

        通常的嫌疑人是:

        • 其他人提到的 applicationId
        • 使用的签名证书

        在基本情况下,以下部分应该是相同的,在两个应用程序的 gradle 配置中。

        defaultConfig {
            applicationId = "com.your.domain" 
        }
        
        signingConfigs {
            debug {
                storeFile file("../debug.keystore")
            }
            release {
                storeFile file("../release.keystore")
            }
        } 
        

        两个应用需要使用相同的 applicationId 并使用相同的证书进行签名。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-19
          • 1970-01-01
          相关资源
          最近更新 更多