Моей целью
Я создаю приложение/пакет, где износ и карманные способны и вносить изменения на уровне данных и получать уведомления о таких изменениях. Я использую интерфейс 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);
} }
Есть еще код в ваш носимого где вы звоните [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
У меня есть приложение, которое делает это. Код один и тот же с обеих сторон, у меня есть общий класс диспетчера данных, который используют оба действия. Несколько вещей, которые нужно иметь в виду; ваша активность будет уведомляться, даже если она была внесена в изменение, уведомления отправляются только в том случае, если данные отличаются от предыдущих (отправка одной и той же строки дважды будет проигнорирована), а иногда на карте данных есть устаревшие данные. Для каждого элемента данных я сохраняю идентификатор устройства и временную метку для учета этого. Опубликуйте больше кода своего кода, и мы сможем найти проблему. – blackcj
@ianhanniballake Да, я добавляю Listener в метод onConnected(). Причина, по которой я регистрирую своего слушателя в каждом действии, заключается в том, что то, что я реализую, - это один модуль большего приложения, а остальная часть приложения не требует возможности прослушивания данных. Тем не менее, я созерцаю использование WearableListenerService в любом случае на основе всех ваших ответов/комментариев. –