在WearableListenerService中未调用OnMessageReceived

时间:2014-07-25 14:16:34

标签: android

我正在使用Eclipse IDE处理android Wear应用程序。我使用相同的包名称来佩戴应用程序和移动应用程序,我正在根据google documentation手动打包可穿戴应用程序。一切正常。它安装在使用usb调试手机的Android服装模拟器。

我的问题是我使用以下代码向可穿戴设备发送消息

List<Node> nodeList=getNodes();
for(Node node : nodeList) {
    Log.v(" ", "telling " + node.getId() );

    PendingResult<MessageApi.SendMessageResult> result = Wearable.MessageApi.sendMessage(
        mGoogleApiClient,
        node.getId(),
        START_ACTIVITY_PATH,
        null
    );

    result.setResultCallback(new ResultCallback<MessageApi.SendMessageResult>() {
        @Override
        public void onResult(MessageApi.SendMessageResult sendMessageResult) {
            Log.v(" ", "Phone: " + sendMessageResult.getStatus().getStatusMessage());
        }
    });
}

OnPeerConnected方法正在运行,当设备被对等但OnMessageReceived从未在WearableListenerService中调用。这是我的WearableListenerService代码:

public class DataLayerListenerService extends WearableListenerService {

    private static final String TAG = "DataLayerSample";
    private static final String START_ACTIVITY_PATH = "/start/MainActivity";
    private static final String DATA_ITEM_RECEIVED_PATH = "/data-item-received";
    private static final String LOG_TAG = "log";
    @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);
    }
    @Override
    public void onDataChanged(DataEventBuffer dataEvents) {
        System.out.println("Recevive message3");
    }

    @Override
    public void onMessageReceived(MessageEvent messageEvent) {
        System.out.println("service watch message1");
        if (messageEvent.getPath().equals(START_ACTIVITY_PATH)) {
            System.out.println("service watch message2");
            Intent startIntent = new Intent(this, MainActivity.class);
            startIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(startIntent);
        }
    }
}

此外,Logcat中始终显示警告消息:

  

应用程序与记录的应用程序密钥不匹配:AppKey [com.myapp,c3f31717fa35401056c20a2798907f1232efa75e]!= AppKey [com.myapp,f36e726eefc7e528db26a1c25f6fbf2f93dacd70]

如果两个应用的应用密钥相同,那么我该如何为这两个应用创建相同的应用密钥。

非常感谢任何帮助, 感谢。

3 个答案:

答案 0 :(得分:10)

您有错误消息:

  

应用与记录的应用密钥不匹配:   AppKey [com.myapp,c3f31717fa35401056c20a2798907f1232efa75e]!=   的AppKey [com.myapp,f36e726eefc7e528db26a1c25f6fbf2f93dacd70]

表示您的应用使用不同的密钥进行签名 手机和可穿戴应用程序的软件包名称相同 - 这很好,但它们也需要共享相同的签名。这就是无法传递邮件的原因 - 可穿戴应用程序基于包名称和签名被识别为“同一应用程序的一部分”。

请确保您使用相同的密钥签署了这两个应用。如果您正在测试自动安装功能,请务必从手表模拟器中卸载可穿戴应用程序的调试版本。

答案 1 :(得分:10)

我有同样的错误,我的错是&#34;穿&#34;模块的软件包名称与应用程序的名称不同。

BAD:
[module: app] es.voghdev.myapp
[module: wear] es.voghdev.myapp.wear

GOOD:
[module: app] es.voghdev.myapp
[module: wear] es.voghdev.myapp

让我浪费了这么多时间! &GT;: - (

答案 2 :(得分:2)

使用asyntask发送消息,因为它们会阻止ui线程。您还需要调用await方法。要使应用程序具有相同的密钥,您需要使用带有gradle的构建变体。

public class SendMessageTask extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... voids) {
        NodeApi.GetConnectedNodesResult nodes =
                Wearable.NodeApi.getConnectedNodes(apiClient).await();
        for (Node node : nodes.getNodes()) {
            Wearable.MessageApi
                    .sendMessage(apiClient, node.getId(), "/start/MainActivity", null)
                    .await();
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        Toast.makeText(MainActivity.this, "Message Sent", Toast.LENGTH_SHORT).show();
    }
}