我今天整天都在与 Android Wear Message API 作斗争,终于接受了我需要一些帮助。
我的应用程序非常简单。移动部分由一个 MainActivity(它只显示“Hello world”和一个扩展WearableListenerService的服务)组成。Wear 部分只是一个带有单个按钮的 MainActivity,并实现MessageApi.MessageListener。
这个想法很简单:按下 Wear 设备上的按钮,它会向移动设备发送消息。当手机收到消息时,它会显示一个带有发件人消息路径的 Toast (例如/mobile)。执行此操作后,手机应立即使用我的回复()方法将消息发送回Wear 设备。我要做的就是记录此消息。
我可以完美地完成第一部分。按下按钮时,手机会弹出一个 Toast,上面写着“/mobile”。然而,答案似乎只是迷失在了以太中。没有错误,但也没有消息。
有人可以帮我理解我做错了什么吗?我在下面粘贴了我的文件。
这是我正在关注的教程。干杯!
佩戴:MainActivity.java
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!");
}
}
}
移动:ListenerService.java
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();
}
}
Mobile MainActivity 非常简单,所以为了清楚起见,我将其省略了。