GoogleApiClient节点为空

时间:2015-07-09 17:41:36

标签: android wear-os google-api-client

我正在编写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虚拟设备连接。

我在这里做错了什么?

2 个答案:

答案 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();