Как использовать DataItem в Android Wear

Я хочу синхронизировать предпочтения между портативными и носимыми устройствами. Я реализую пример кода в мобильном приложении.

PutDataMapRequest dataMap = PutDataMapRequest.create("/count");
dataMap.getDataMap().putInt(COUNT_KEY, count++);
PutDataRequest request = dataMap.asPutDataRequest();
PendingResult<DataApi.DataItemResult> pendingResult = Wearable.DataApi
    .putDataItem(mGoogleApiClient, request);
System.out.println(dataMap.getDataMap().getInt("COUNT_KEY"));//print 3

А затем внедрите приведенный ниже код в носимое приложение. Но сохраненный счет не может быть восстановлен.

 PutDataMapRequest dataMap = PutDataMapRequest.create("/count");
 int count = dataMap.getDataMap().getInt("COUNT_KEY");
 System.out.println(count);//print 0

Я попробовал на реальном портативном устройстве Android и эмуляторе Android Wear. Я подтвердил, что они подключены с помощью демо-карт приложения Android Wear.

Что мне нужно больше или я что-то не понимаю?


person lamrongol    schedule 06.07.2014    source источник


Ответы (1)


С помощью этого кода вы пытаетесь создать второй запрос на размещение, не читая ранее сохраненные данные. Вот почему он пуст.

Для доступа к ранее сохраненным данным используется DataApi методы. Например, вы можете получить все сохраненные данные с помощью Wearable.DataApi.getDataItems():

PendingResult<DataItemBuffer> results = Wearable.DataApi.getDataItems(mGoogleApiClient);
results.setResultCallback(new ResultCallback<DataItemBuffer>() {
    @Override
    public void onResult(DataItemBuffer dataItems) {
        if (dataItems.getCount() != 0) {
            DataMapItem dataMapItem = DataMapItem.fromDataItem(dataItems.get(0));

            // This should read the correct value.
            int value = dataMapItem.getDataMap().getInt(COUNT_KEY);
        }

        dataItems.release();
    }
});

Я использовал это, и это работает. Однако у меня самого возникла проблема, так как я не знаю Uri для доступа к конкретному элементу данных с помощью Wearable.DataApi.getDataItem(). Поэтому я разместил этот вопрос. Если вы просто тестируете, DataApi.getDataItems() должно быть достаточно.

Другой вариант — использовать DataApi.addListener(), чтобы получать уведомления об изменениях в хранилище.

person matiash    schedule 06.07.2014
comment
Я реализовал этот код, но onResult() не запускается. Я пробовал pendingResult.await(); в другом потоке и обнаружил, что этот процесс не заканчивается. - person lamrongol; 13.07.2014
comment
@lamrongol Подключались ли вы к игровым сервисам раньше? - person matiash; 13.07.2014