Android Wear DataApi onDataChanged() не вызывается для всех запросов

Я пытаюсь использовать DataApi и DataApi.DataListener для отправки данных с телефона на часы, но onDataChanged вызывается не для всех запросов (доставляются только некоторые) отправить с телефона Wearable.DataApi.putDataItem(mGoogleApiClient, request) хотя ResultCallback<DataApi.DataItemResult>() результат успешен для всех запросов

Чтобы быть уверенным, что данные всегда разные (onDataChanged() вызывается только тогда, когда данные изменились), я добавляю отметку времени к DataMap для каждого запроса следующим образом: myRequestDataMap.putLong("timeStamp", System.currentTimeMillis()) и для немедленного вызова с использованием setUrgent()

В целях отладки я также отправляю сообщение с помощью MessageApi сразу после запроса, и все сообщения доставляются.

Заметки:

  • applicationId одинакова как для телефона, так и для часов
  • play-services-wearable версия тоже такая же и 9.8.0
  • com.google.android.wearable:wearable версия 2.0.3
  • протестировано с LG G Watch и эмулятором

РЕДАКТИРОВАТЬ: смотреть манифест приложения

<manifest
package="app.package"
xmlns:android="http://schemas.android.com/apk/res/android">

<uses-feature
    android:name="android.hardware.type.watch"
    android:required="true"/>

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@android:style/Theme.DeviceDefault.Light">

    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version"/>

    <meta-data
        android:name="com.google.android.wearable.standalone"
        android:value="false" />

    <activity
        android:name="app.package.Activity"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>

</application>

EDIT 2:

Приложение для телефона:

public class App extends Application implements MessageApi.MessageListener, GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener {

@Override
public void onCreate() {
    super.onCreate();
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(Wearable.API)
            .build();
    mGoogleApiClient.connect();
}

@Override
public void onMessageReceived(final MessageEvent messageEvent) {
    //as response to data request
    ...
    //load data from DB
    ...
    while (!cursor.isAfterLast()) {
        ...

        PutDataMapRequest dataMapRequest = myObject.generateDataMap();
        dataMapRequest.getDataMap().putLong("timeStamp", System.currentTimeMillis());
        PutDataRequest request = dataMapRequest.asPutDataRequest();
        PendingResult<DataApi.DataItemResult> pendingResult = Wearable.DataApi
            .putDataItem(mGoogleApiClient, request);

        pendingResult.setResultCallback(new ResultCallback<DataApi.DataItemResult>() {
            @Override
            public void onResult(final DataApi.DataItemResult result) {
                if (result.getStatus().isSuccess()) {
                    Log.d(TAG, "Success");
                } else {
                    Log.d(TAG, "Failed");
                }
            }
        });

        cursor.moveToNext();
    }

}   

}

Носите приложение:

public class WearActivity extends Activity implements GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener, DataApi.DataListener, NodeApi.NodeListener, 
    MessageApi.MessageListener {

@Override
public void onStart() {
    super.onStart();
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addApi(Wearable.API)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();
    mGoogleApiClient.connect();
}

@Override
public void onConnected(Bundle bundle) {
    Wearable.DataApi.addListener(mGoogleApiClient, this);
    Wearable.MessageApi.addListener(mGoogleApiClient, this);
    Wearable.NodeApi.addListener(mGoogleApiClient, this);
}

@Override
public void onDataChanged(DataEventBuffer dataEvents) {
    final List<DataEvent> events = FreezableUtils.freezeIterable(dataEvents);
    for (DataEvent event : events) {
        if (event.getType() == DataEvent.TYPE_CHANGED) {
            DataMapItem dataMapItem = DataMapItem.fromDataItem(event.getDataItem());
            ...
        }
    }
}

 @Override
public void onStop() {
    if (mGoogleApiClient != null && mGoogleApiClient.isConnected()) {
        Wearable.DataApi.removeListener(mGoogleApiClient, this);
        Wearable.MessageApi.removeListener(mGoogleApiClient, this);
        Wearable.NodeApi.removeListener(mGoogleApiClient, this);
        mGoogleApiClient.disconnect();
    }

    super.onStop();
}

}

Кто-нибудь может помочь?


person majov    schedule 13.07.2017    source источник
comment
Вы можете проверить SO post1 и SO post2. Посмотрите, поможет ли это вам. В противном случае я предлагаю вам также поделиться тем, что вы уже сделали, например, кодами в основной деятельности как для телефона, так и для носимых устройств.   -  person Teyam    schedule 14.07.2017
comment
я обновил свой вопрос   -  person majov    schedule 19.07.2017