我正在编写Android Wear应用程序,并且我希望在点击按钮时让佩戴设备在手机上启动。
为此,我首先建立了与GoogleApiClient的连接,如下所示
googleApiClient = new GoogleApiClient.Builder(this)
.addApi(Wearable.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
googleApiClient.connect();
然后在按钮上单击运行sendMessage函数。这是函数
private void sendMessage(){
if(mNode != null && googleApiClient != null && googleApiClient.isConnected()){
Wearable.MessageApi.sendMessage(
googleApiClient, mNode.getId(),HELLO_WORLD_WEAR_PATH, null).setResultCallback(
new ResultCallback<MessageApi.SendMessageResult>() {
@Override
public void onResult(MessageApi.SendMessageResult sendMessageResult) {
if(!sendMessageResult.getStatus().isSuccess()){
Log.e("TAG", "Failed to send message with status code: " + sendMessageResult.getStatus().getStatusCode());
}
else{
Log.e("TAG", "Success");
}
}
}
);
}
else {
Log.e("TAG","No nodes" + mNode);
}
}
问题是该函数进入了sendMessage的else语句,这意味着mNode为null。 mNode是Node类型的变量。
要获取节点,我有这个功能
private void resolveNode() {
Wearable.NodeApi.getConnectedNodes(googleApiClient).setResultCallback(new ResultCallback<NodeApi.GetConnectedNodesResult>() {
@Override
public void onResult(NodeApi.GetConnectedNodesResult nodes) {
for (Node node : nodes.getNodes()) {
mNode = node;
}
}
});
}
我已将手机与Android Studio中的Android Wear虚拟设备连接。
我在这里做错了什么?
答案 0 :(得分:1)
当您调用googleApiClient.connect()时,连接会花费很短的时间,并且此调用不会阻止。因此,在进行任何进一步的调用之前,您需要等待连接成功并调用onConnected()。
接下来,当您调用resolveNode()时,不会立即设置mNode变量。 setResultCallback会在很短的时间后执行,因此在处理结果之前不应调用sendMessage()。
所以你需要确保在这里正确订购。
(编辑)
完成评论后,结果发现问题是由与Google Play服务的连接失败引起的。这是因为使用的模拟器是一个旧的API 20设备,它具有旧版本的Google Play服务。使用最新的API 22仿真器将解决此问题。
答案 1 :(得分:0)
尝试使用此方法获取Node
new Thread(new Runnable() {
@Override
public void run() {
NodeApi.GetConnectedNodesResult nodes = Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).await();
for (Node node : nodes.getNodes()){
MessageApi.SendMessageResult resultMessage = Wearable.MessageApi.sendMessage(mGoogleApiClient, node.getId(), ID_PATH, BYTES HERE).await();
if (resultMessage.getRequestId() == MessageApi.UNKNOWN_REQUEST_ID) {
Log.e("Message failed", ".......");
}
}
}
}).start();