Android WearのonDataChangedは「本当にデータが変更されている場合に」呼ばれる

More than 1 year has passed since last update.

スマホ(handheld)とWearの間で簡単なデータ(文字列とか)をやり取りしたい場合にはDataItemを使用します。

DataItemでのデータの受け取りはWearableListenerServiceonDataChangedで可能ですが、その中でハマったのでメモ。


スマホからデータを送る方法

DataMapにデータを格納して送信します。

今回は、sendMessageとしてクラス化しました。


MainActivity.java

private void sendMessage(String path, String key, String value){

PutDataMapRequest mapRequest = PutDataMapRequest.create(path);
mapRequest.getDataMap().putString(key, value + System.currentTimeMillis()); //※注意
Wearable.DataApi.putDataItem(googleApiClient, mapRequest.asPutDataRequest());
}


注意(ここが重要):データは「本当にデータが変更されている場合に」Wear側が受け取ってくれる

単純にデータを送りたい場合(例:同じvalueを送り続けたい場合)は、

上記のようにcurrentTimeMillisで現在時刻のミリ秒を付加すると、常に異なるデータを送信可能です。

同じことでハマっていて対処している人がいました。

StackOverFlow-WearableListenerService, onDataChanged() is not called


Wear側でデータを受け取る方法

スマホ側から送られたデータは下記のようにしてonDataChangedで受け取ります。


WearMainActivity.java

@Override

public void onDataChanged(DataEventBuffer dataEventBuffer) {
DataItem dataItem = dataEventBuffer.get(0).getDataItem();
DataMap dataMap = DataMapItem.fromDataItem(dataItem).getDataMap();
vibrate(dataMap.getString("hoge"));
}

結構ハマったので悩みました…

以上。