使用GoogleApiClient从Push Notification IntentService发送数据到Android Wear

5
这是一个关于编程的后续问题... Android Wear捆绑通知和背景图像 我想创建一个Android Wear GridViewPager布局,当新的推送通知到来时就会被创建。
以下是我的代码,它在新消息到来时初始化GoogleApiClient连接,以便我可以向穿戴应用程序发送数据,然后创建GridView Pager。
我的问题是GoogleApiClient从未连接。我已经成功运行了sdk文件夹中的SynchonizedNotifications示例应用程序,所以我知道我的设备和手表已正确配对。
以下是当前代码...
public class GCMIntentService extends IntentService implements GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener{

    @Override
    protected void onHandleIntent(Context context, Intent intent) {

        mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addApi(Wearable.API)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();

        ConnectionResult connectionResult =   mGoogleApiClient.blockingConnect(30, TimeUnit.SECONDS);

        // Extract the payload from the message
        Bundle extras = intent.getExtras();
        if (this.mGoogleApiClient.isConnected())        {

           // sending a simple message works
           MessageApi.SendMessageResult result = Wearable.MessageApi.sendMessage(mGoogleApiClient,
                node.getId(), "path", null).await();

            PutDataMapRequest putDataMapRequest = PutDataMapRequest.create(Constants.BOTH_PATH);
            putDataMapRequest.getDataMap().putString(Constants.KEY_CONTENT, "content");
            putDataMapRequest.getDataMap().putString(Constants.KEY_TITLE, "title");
            PutDataRequest request = putDataMapRequest.asPutDataRequest();

            // push data to wear app here
            Wearable.DataApi.putDataItem(mGoogleApiClient, request)
                .setResultCallback(new ResultCallback<DataApi.DataItemResult>() {
                    @Override
                    public void onResult(DataApi.DataItemResult dataItemResult) {
                        if (!dataItemResult.getStatus().isSuccess()) {
                            Log.e(TAG, "Failed to set the data, status: " + dataItemResult.getStatus().getStatusCode());
                        }else{
                            // get here, but no message received from wear
                            Log.i(TAG,"SUCCESSFUL RESPONSE RECEIVED FROM WEAR");
                        }
                        mGoogleApiClient.disconnect();
                    }
                });

        } else {
            Log.e(TAG, "no Google API Client connection");
        }
    }
}
2个回答

6
似乎您的数据没有变化。当使用DataItem API方法时,不要将其视为从设备发送数据到可穿戴设备(反之亦然)。相反,请记住,您只是操作一个在设备之间共享的缓存:您正在同步数据,而不是传输数据。
这最终意味着除非数据发生更改,否则您的监听器不会触发。这就是方法称为onDataChanged()的原因。底层API会智能地处理使用PutDataRequest更新缓存,以提高效率。如果同步包含相同信息的有效负载,则您将不会注意到任何变化。
所以尝试一下:向有效负载添加时间戳。可能是putDataMapRequest.getDataMap().putLong("timestamp", System.currentTimeMillis());。每次有效负载都将不同,您应该看到onDataChanged()现在会触发。
是的,我花了很长时间才弄清楚这一点!

数据更改并不总是被捕捉到,我有一个包含资产的DataMap,即使使用了缓存破坏器,它也不总是被传输。甚至缓存破坏器字段似乎也无法完成工作。 - Sveinung Kval Bakken
大家好,当使用PutDataMapRequest发送特定的byteArray时,onDataChanged()方法不会被调用。这是在手表上捕获音频并与手机同步时发生的情况。第一次调用onDataChanged()时,音频在手机上播放得很好,但第二次及以后,onDataChanged()永远不会触发。有什么线索吗? - Vny Kumar

6
首先,如果这是您的完整代码,则实际上没有在GoogleApiClient上调用connect()
其次,connect()异步的,因此您不能只是像这样做:
mGoogleApiClient.connect();
if (mGoogleApiClient.isConnected()) ... 

您需要等待连接回调。或者,如果您正在后台线程中执行此代码,可以使用blockingConnect()代替。


@Twilly,你应该在推送实际执行后才断开连接,因为这也是异步的,可以使用await()或在监听器内部完成。也许你可以在这里发布你的“将数据推送到手表应用程序”的代码? - matiash
感谢您的快速回复。我将断开连接的调用移动到响应回调内部,但仍然看不到可穿戴设备上的响应。我在我的初始问题中添加了代码,显示了数据的发送。 - TWilly
此外,以下代码可以正常工作,但我需要发送的不仅是简单的消息。// 测试发送消息 MessageApi.SendMessageResult result = Wearable.MessageApi.sendMessage(mGoogleApiClient, node.getId(), "path", null).await(); - TWilly
据我所知,无论是服务还是活动,都不应该对GoogleApiClient造成任何影响。但是我有点迷失于你目前的状态:/你是否收到“SUCCESSFUL RESPONSE…”消息,但可穿戴设备没有可用数据? - matiash
这是我得到的响应。 http://imgur.com/EZV2jDc 在WearableListenerService.onDataChanged中,可穿戴设备从未收到消息。 - TWilly
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接