【问题标题】:GoogleApiClient Node is nullGoogleApiClient 节点为空
【发布时间】:2015-07-09 17:41:36
【问题描述】:

我正在编写一个 Android Wear 应用,我想让 Wear 设备在点击按钮时在手机上启动一个 Intent。

为此,我首先像这样设置到 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 为空。 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 虚拟设备连接起来。

我在这里做错了什么?

【问题讨论】:

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


    【解决方案1】:

    当您调用 googleApiClient.connect() 时,连接需要很短的时间,并且此调用不会阻塞。因此,您需要等待连接成功并调用 onConnected(),然后再进行任何进一步的调用。

    接下来,当您调用 resolveNode() 时,不会立即设置 mNode 变量。 setResultCallback 会在稍后执行,因此在处理结果之前不应调用 sendMessage()。

    所以你需要确保这里的所有东西都正确排序。

    (编辑)

    通过 cmets 后,发现问题是由于与 Google Play 服务的连接失败引起的。这是因为使用的模拟器是旧的 API 20 设备,它具有旧版本的 Google Play 服务。使用最新的 API 22 模拟器将解决此问题。

    【讨论】:

    • 我已经把我的代码放在这里pastebin.com/wLywc9WP 如果我理解正确的话,我认为订单已经很好了。还是我错过了什么?
    • resolveNode() 内部发生了什么?返回了多少个节点,为什么只存储最后一个?
    • 另外,你在 build.gradle 中使用的是什么 play-services-wearable 库?确保可穿戴设备和手机端都是 7.5 或更高版本,否则它会在仅支持一个 Android Wear 设备时以兼容模式运行。
    • 另外,您的 adb logcat 输出中是否有任何异常?可能是您在错误的线程上做某事而遇到了异常。
    • 我从这个站点上的另一个问题获得了解析节点功能。我会调查的。至于 play-services-wearable 库,在可穿戴和手机端都是 7.5 版本。
    【解决方案2】:

    尝试用这个来获取节点

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

    【讨论】:

    • 我应该用这个替换resolveNode函数吗?
    • 此函数确保变量“节点”通过 NodeApi.getConnectedNodes() 从 mGoogleApiClient 接收一些连接并等待直到发生这种情况。然后就可以调用MessageApi.sendMessageResult,把给定的节点放到for中。
    猜你喜欢
    • 1970-01-01
    • 2015-12-10
    • 2017-03-06
    • 1970-01-01
    • 2022-09-23
    • 2016-01-28
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多