将消息从Android Wear发送到主机设备

时间:2014-07-06 11:05:57

标签: wear-os

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

我的Android应用程序有一个WearableListenerService,我的Android Wear应用程序使用Message 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}

有什么想法吗?

7 个答案:

答案 0 :(得分:49)

您确定&#34; applicationId &#34;两个应用程序是相同的,即Android Wear上的应用程序和手机上的应用程序?

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

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

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

以下答案仅适用于Android设备(移动设备)中的活动处于活动状态时发送消息。

由于您尝试从Android Wear向Android设备发送消息,因此应将消息监听器添加到Android设备中不在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());
}

答案 4 :(得分:2)

我有一些示例代码,我可以使用这些代码,从磨损到设备和设备都可以使用。 https://github.com/kentarosu/AndroidWearAndLIFX

答案 5 :(得分:1)

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

OnMessageReceived not called in WearableListenerService

希望这有助于某人。

答案 6 :(得分:0)

通常的嫌疑人是:

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

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

defaultConfig {
    applicationId = "com.your.domain" 
}

signingConfigs {
    debug {
        storeFile file("../debug.keystore")
    }
    release {
        storeFile file("../release.keystore")
    }
} 

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