Java 从可穿戴设备向手机发送信息,然后立即回复

Java 从可穿戴设备向手机发送信息,然后立即回复,java,android,wear-os,android-wear-data-api,Java,Android,Wear Os,Android Wear Data Api,我今天一整天都在和Android Wear消息API斗争,终于接受了我需要一些帮助 我的应用程序非常简单。移动部分由一个MainActivity(只显示“Hello world”)和一个扩展WearableListenerService的服务组成。磨损部分只是一个带有单个按钮的MainActivity,并实现MessageApi.MessageListener 想法很简单:按下Wear设备上的按钮,它会向移动设备发送消息。当移动设备收到消息时,它会显示一个带有发送者的消息路径的祝酒词(例如/Mo

我今天一整天都在和Android Wear消息API斗争,终于接受了我需要一些帮助

我的应用程序非常简单。移动部分由一个MainActivity(只显示“Hello world”)和一个扩展WearableListenerService的服务组成。磨损部分只是一个带有单个按钮的MainActivity,并实现MessageApi.MessageListener

想法很简单:按下Wear设备上的按钮,它会向移动设备发送消息。当移动设备收到消息时,它会显示一个带有发送者的消息路径的祝酒词(例如/Mobile)。执行此操作后,移动设备应立即使用我的回复()方法。然后我要做的就是记录此消息

我可以很好地完成第一部分。当按下按钮时,手机会弹出一个祝酒词,上面写着“/Mobile”。然而,回复似乎在以太中消失了;没有错误,但也没有消息

有人能帮我理解我做错了什么吗?我已经把我的文件贴在下面了

这是我正在学习的教程。干杯

磨损:MainActivity.java Mobile Main活动非常简单,因此为了清楚起见,我将其省略。

您从未调用您的Wear活动,因此您的
MessageListener
从未注册以接收消息。您的活动被销毁时也应该调用它


注意:这两种方法都需要一个已连接的
GoogleAppClient
。如果您在整个活动期间保持一个
GoogleAppClient
打开,而不是尝试在
onDestroy()中连接/
Removelister()
/disconnect,则逻辑可能会更简单

啊,太棒了,谢谢你,伊安·汉尼巴拉克!第一个问题对我来说应该是显而易见的,但你的第二点确实帮助了我。我没有意识到你只能在连接GoogleAppClient时添加一个侦听器。断开连接()方法确实导致了听众从未被添加。它现在似乎像预期的那样工作。再次干杯!
package org.thecosmicfrog.toastdroidmessageapitutorial;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.wearable.view.WatchViewStub;
import android.util.Log;
import android.view.View;

import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.wearable.MessageApi;
import com.google.android.gms.wearable.MessageEvent;
import com.google.android.gms.wearable.Node;
import com.google.android.gms.wearable.NodeApi;
import com.google.android.gms.wearable.Wearable;

import java.util.List;
import java.util.concurrent.TimeUnit;

public class MainActivity extends Activity implements MessageApi.MessageListener {

    private final String LOG_TAG = MainActivity.class.getSimpleName();

    private static final long CONNECTION_TIME_OUT_MS = 100;
    private static final String MOBILE_PATH = "/mobile";

    private GoogleApiClient googleApiClient;
    private String nodeId;

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

        initGoogleApiClient();

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

    private void initGoogleApiClient() {
        googleApiClient = getGoogleApiClient(this);
        retrieveDeviceNode();
    }

    private GoogleApiClient getGoogleApiClient(Context context) {
        return new GoogleApiClient.Builder(context)
                .addApi(Wearable.API)
                .build();
    }

    private void retrieveDeviceNode() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                if (googleApiClient != null && !(googleApiClient.isConnected() || googleApiClient.isConnecting()))
                    googleApiClient.blockingConnect(CONNECTION_TIME_OUT_MS, TimeUnit.MILLISECONDS);

                NodeApi.GetConnectedNodesResult result =
                        Wearable.NodeApi.getConnectedNodes(googleApiClient).await();

                List<Node> nodes = result.getNodes();

                if (nodes.size() > 0)
                    nodeId = nodes.get(0).getId();

                Log.v(LOG_TAG, "Node ID of phone: " + nodeId);

                googleApiClient.disconnect();
            }
        }).start();
    }

    private void initWidgets() {
        findViewById(R.id.button_toast).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendToast();
            }
        });
    }

    private void sendToast() {
        if (nodeId != null) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    if (googleApiClient != null && !(googleApiClient.isConnected() || googleApiClient.isConnecting()))
                        googleApiClient.blockingConnect(CONNECTION_TIME_OUT_MS, TimeUnit.MILLISECONDS);

                    Wearable.MessageApi.sendMessage(googleApiClient, nodeId, MOBILE_PATH, null).await();
                    googleApiClient.disconnect();
                }
            }).start();
        }
    }

    @Override
    public void onMessageReceived(MessageEvent messageEvent) {
        Log.v(LOG_TAG, "In onMessageReceived()");

        if (messageEvent.getPath().equals("/wear")) {
            Log.v(LOG_TAG, "Success!");
        }
    }
}
package org.thecosmicfrog.toastdroidmessageapitutorial;

import android.util.Log;
import android.widget.Toast;

import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.wearable.MessageEvent;
import com.google.android.gms.wearable.Wearable;
import com.google.android.gms.wearable.WearableListenerService;

import java.util.concurrent.TimeUnit;

public class ListenerService extends WearableListenerService {

    private final String LOG_TAG = ListenerService.class.getSimpleName();

    private static GoogleApiClient googleApiClient;

    private static final long CONNECTION_TIME_OUT_MS = 100;
    private static final String WEAR_PATH = "/wear";
    private String nodeId;

    @Override
    public void onMessageReceived(MessageEvent messageEvent) {
        if (messageEvent.getPath().equals("/mobile")) {
            nodeId = messageEvent.getSourceNodeId();
            Log.v(LOG_TAG, "Node ID of watch: " + nodeId);
            showToast(messageEvent.getPath());

            reply(WEAR_PATH);
        }
    }

    private void showToast(String message) {
        Toast.makeText(this, message, Toast.LENGTH_LONG).show();
    }

    private void reply(final String path) {
        googleApiClient = new GoogleApiClient.Builder(getApplicationContext())
                .addApi(Wearable.API)
                .build();

        Log.v(LOG_TAG, "In reply()");
        Log.v(LOG_TAG, "Path: " + path);

        if (googleApiClient != null && !(googleApiClient.isConnected() || googleApiClient.isConnecting()))
            googleApiClient.blockingConnect(CONNECTION_TIME_OUT_MS, TimeUnit.MILLISECONDS);

        Wearable.MessageApi.sendMessage(googleApiClient, nodeId, path, null).await();
        googleApiClient.disconnect();
    }
}