使用DataMap发送和接收数据 - Android可穿戴式

时间:2016-02-29 20:26:07

标签: android wear-os android-wear-data-api

我正在开发Android Wearable项目,我正在尝试将数据从移动设备发送到可穿戴模拟器。我正在尝试将接收到的数据记录在可穿戴设备中,但它没有记录。

这些是我迄今为止所做的。

1)打开Android Wear应用,让模拟器状态为"已连接"

2)连接我的移动设备

3)运行adb -d forward tcp:5601 tcp:5601将移动设备与模拟器连接

4)实施GoogleApiClient.ConnectionCallbacks,         GoogleApiClient.OnConnectionFailedListener,我的移动设备中的发送类中的LocationListener以及onCreate中的构建客户端:

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

5)在我的移动设备中,使用' weatherDescription"创建一个dataItem。完美记录,我可以使用DataApi使用putDataItem发送到可穿戴设备:

这是weatherDescription的日志:I / weatherDescription:散云

            putDataMapReq = PutDataMapRequest.create("/data");
            Log.i("weatherDescription", weatherDescription);
            putDataMapReq.getDataMap().putString("weatherDescription", weatherDescription);

            PutDataRequest putDataReq = putDataMapReq.asPutDataRequest();
            Wearable.DataApi.putDataItem(googleClient, putDataReq); 

5)实施GoogleApiClient.ConnectionCallbacks,         GoogleApiClient.OnConnectionFailedListener,我的可穿戴设备中的接收类(我的自定义watchface类)中的LocationListener,以及onCreate中的构建客户端:

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

6)在Wearable中的onConnect中设置监听器:

@Override
public void onConnected(Bundle bundle) {

    Wearable.DataApi.addListener(mGoogleApiClient, this).setResultCallback(new ResultCallback<Status>() {
        @Override
        public void onResult(Status status) {
            Log.i("myTag", String.valueOf(status));
        }
    });
}

看起来它在接收/可穿戴端正确连接:

I / myTag:状态{statusCode = SUCCESS,resolution = null}

7)在onDataChanged中,记录收到的信息:

    public void onDataChanged(DataEventBuffer dataEventBuffer) {
        Log.i("myTag", "in on Data Changed");
        for (DataEvent event : dataEventBuffer){
            if(event.getType() == DataEvent.TYPE_CHANGED){
                DataItem item = event.getDataItem();

                if(item.getUri().getPath().compareTo("/data") == 0 ){
                    DataMap dataMap = DataMapItem.fromDataItem(item).getDataMap();

                    dataMap.getString("weatherDescription");

                    Log.i("myTag", dataMap.getString("weatherDescription"));
                }
            }
        }
    }

4 个答案:

答案 0 :(得分:3)

听起来您的dataMap没有更改其值,然后它不会将数据发送到可穿戴设备。

您可以发送Long.toString(System.currentTimeMillis())以验证每次都更改。

答案 1 :(得分:1)

以下是一些线索:

  1. 在第五点,尝试在此处输入 setUrgent()

    PutDataRequest putDataReq = putDataMapReq.asPutDataRequest().setUrgent();

  2. 此外,如果您在回调中获得成功,则表示您的数据已成功发送。它并不意味着收到的很好,或收到的很好。

    1. 也许你做了,但你是否在onStart()或其他任何地方打电话给googleClient.connect()

    2. onDataChanged()仅在put数据真的不同时被调用,如果你输入相同的数据,它就不会被调用。要进行测试,您可以在数据地图中添加时间戳

    3. 您的移动设备需要具有相同的软件包名称,并且需要佩戴应用程序才能交换消息/数据。

    4. 也许您可以尝试实现WearableListenerService来接收onDataChanged上的数据。代码没有什么不同,只是在收到数据时创建了此服务,因此您不必打开应用程序。确保在清单上的此服务意图过滤器中添加 BIND_LISTENER操作

    5. <service android:name=".AnalogWatchFaceConfigListenerService"> <intent-filter> <action android:name="com.google.android.gms.wearable.BIND_LISTENER" /> </intent-filter> </service>

答案 2 :(得分:0)

首先,尝试记录放置DataItem

的结果
Wearable.DataApi.putDataItem(googleClient, putDataReq)
    .setResultCallback(new ResultCallback<DataApi.DataItemResult>() {
                @Override
                public void onResult(DataApi.DataItemResult dataItemResult) {
                    Log.d(TAG, "putDataItem status: "
                            + dataItemResult.getStatus().toString());
                }
            });

dataItemResult.getStatus()来电会告诉您是否出现问题。接下来,确保您正在收听onDataChanged()事件。在您的Wear应用onConnected()方法中,添加:

Wearable.DataApi.addListener(googleClient, yourListenerHere);

最后,要强制将数据立即发送到Wear设备,请使用setUrgent()

putDataMapReq = PutDataMapRequest.create("/data").setUrgent();

希望有所帮助。

答案 3 :(得分:0)

我终于明白了。在表盘方面,我在WeatherWatchFaceService类中声明了Google Api Client实例mGoogleApiClient,而不是Engine类。在我将它从WeatherWatchFaceService移动到Engine后,手表端收到了我试图从手机发送的内容。

干杯。