3

Моей целью
Я создаю приложение/пакет, где износ и карманные способны и вносить изменения на уровне данных и получать уведомления о таких изменениях. Я использую интерфейс GoogleApiClient и DataApi.DataListener.Android двухсторонняя связь между КПК и носимым

Текущий прогресс
Как прямо сейчас, действие на мой носимого успешно обновляет счетчики на уровне данных, и это изменение затем детектируется и отражается в Handheld через отображается новые счетчики.

Задача
Обнаружение работает только в одном направлении. Хотя изменение, инициированное Wearable, успешно обновляет счеты на Handheld, изменение, инициированное Handheld, не обнаружено на Wearable.

, что я пытался
Я смотрел на StackExchange и Google в течение нескольких часов, и я не нашел случаи, когда оба носимых и Handheld обновляли объекты слоя данных. В большинстве случаев это было только обновление Handheld и распознавание Wearable, или наоборот. Односторонняя связь работает для меня отлично. Мне нужно идти в двух направлениях.

Отрывок из Handheld Код

public class ListenActivity extends Activity implements 
    DataApi.DataListener, 
    GoogleApiClient.ConnectionCallbacks, 
    GoogleApiClient.OnConnectionFailedListener { 
// ConnectionCallback methods, UI methods not included in snippet 

private static final String COUNT_KEY = "com.example.count"; 
private int count = 0; 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_listen); 

    handler.post(displayCounts); 

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

@Override 
public void onDataChanged(DataEventBuffer dataEvents) 
{ 
    for (DataEvent event : dataEvents) 
    { 
     if (event.getType() == DataEvent.TYPE_CHANGED) 
     { 
      DataItem item = event.getDataItem(); 
      if (item.getUri().getPath().compareTo("/count") == 0) 
      { 
       DataMap dataMap = DataMapItem.fromDataItem(item).getDataMap(); 
       count = dataMap.getInt(COUNT_KEY); 
      } 
     } 
    } 
} 

// A UI button calls this method to reset the count, but the Wearable isn't calling its onDataChanged() method. 
public void resetCount(View view) 
{ 
    PutDataMapRequest putDataMapReq = PutDataMapRequest.create("/count"); 
    putDataMapReq.getDataMap().putInt(COUNT_KEY, 0); 
    PutDataRequest putDataReq = putDataMapReq.asPutDataRequest(); 
    PendingResult<DataApi.DataItemResult> pendingResult = 
      Wearable.DataApi.putDataItem(mGoogleApiClient, putDataReq); 
} } 

Отрывок носимого кодекса

public class WearListenActivity extends Activity implements 
    DataApi.DataListener, 
    GoogleApiClient.ConnectionCallbacks, 
    GoogleApiClient.OnConnectionFailedListener { 

// ConnectionCallback methods, UI methods not included in snippet 

private static final String COUNT_KEY = "com.example.count"; 
private int count = 0; 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mDismissOverlay = (DismissOverlayView) findViewById(R.id.dismiss_overlay); 
    mDismissOverlay.showIntroIfNecessary(); 
    mGestureDetector = new GestureDetectorCompat(this, new GestureListener()); 

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

// This method is never called on the Wearable. 
// It isn't detecting the changes made by Handheld's resetCount() method? 
@Override 
public void onDataChanged(DataEventBuffer dataEvents) 
{ 
    for (DataEvent event : dataEvents) 
    { 
     if (event.getType() == DataEvent.TYPE_CHANGED) 
     { 
      DataItem item = event.getDataItem(); 
      if (item.getUri().getPath().compareTo("/count") == 0) 
      { 
       DataMap dataMap = DataMapItem.fromDataItem(item).getDataMap(); 
       count = dataMap.getInt(COUNT_KEY); 
      } 
     } 
    } 
} 

// User taps the screen, this method is called. Works perfectly fine since handheld updates its counts. 
private void updateDataLayer() 
{ 
    PutDataMapRequest putDataMapReq = PutDataMapRequest.create("/count"); 
    putDataMapReq.getDataMap().putInt(COUNT_KEY, count); 
    PutDataRequest putDataReq = putDataMapReq.asPutDataRequest(); 
    PendingResult<DataApi.DataItemResult> pendingResult = 
      Wearable.DataApi.putDataItem(mGoogleApiClient, putDataReq); 
} } 
+0

Есть еще код в ваш носимого где вы звоните [DataApi.addListener] (https://developers.google.com/android/reference/com/google/android /gms/wearable/DataApi#addListener(com.google.android.gms.common.api.GoogleApiClient,%20com.google.android.gms.wearable.DataApi.DataListener)) (например, в методе 'onConnected()')? Любая конкретная причина, по которой вы регистрируете своего слушателя в каждом мероприятии, а не в [WearableListenerService] (https://developers.google.com/android/reference/com/google/android/gms/wearable/WearableListenerService), который будет работать, будет ли ваша деятельность работает или нет? – ianhanniballake

+1

У меня есть приложение, которое делает это. Код один и тот же с обеих сторон, у меня есть общий класс диспетчера данных, который используют оба действия. Несколько вещей, которые нужно иметь в виду; ваша активность будет уведомляться, даже если она была внесена в изменение, уведомления отправляются только в том случае, если данные отличаются от предыдущих (отправка одной и той же строки дважды будет проигнорирована), а иногда на карте данных есть устаревшие данные. Для каждого элемента данных я сохраняю идентификатор устройства и временную метку для учета этого. Опубликуйте больше кода своего кода, и мы сможем найти проблему. – blackcj

+0

@ianhanniballake Да, я добавляю Listener в метод onConnected(). Причина, по которой я регистрирую своего слушателя в каждом действии, заключается в том, что то, что я реализую, - это один модуль большего приложения, а остальная часть приложения не требует возможности прослушивания данных. Тем не менее, я созерцаю использование WearableListenerService в любом случае на основе всех ваших ответов/комментариев. –

ответ

2

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

Вы можете найти пример здесь: Handling Data Layer Events

+0

Для вашего класса, расширяющего WearableListenerService, вы подключаетесь непосредственно к GoogleApiClient в onCreate() или подключаетесь только для отправки данных, как в примере, который вы связали? –

+0

Я играл с расширением WearableListenerService и сумел заставить все работать. Большое спасибо! –

Смежные вопросы