Android Wearable Data Layer не будет синхронизироваться.

Я пытаюсь использовать синхронизацию данных между часами и моим телефоном, но мне это не удается.

Мобильная сторона:

package com.off.testcomm;

private GoogleApiClient mGoogleApiClient;

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

    setOnClickListener((Button) findViewById(R.id.button));

    initGoogleAPIClient();

}

private void setOnClickListener(Button button) {
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Log.i("OFF", "increase counter");
            PutDataMapRequest putDataMapReq = PutDataMapRequest.create("/count");
            putDataMapReq.getDataMap().putInt("COUNT_COUNT", 7);
            PutDataRequest putDataReq = putDataMapReq.asPutDataRequest();

            Wearable.DataApi.putDataItem(mGoogleApiClient, putDataReq)
                    .setResultCallback(new ResultCallback<DataApi.DataItemResult>() {
                        @Override
                        public void onResult(DataApi.DataItemResult dataItemResult) {
                            Log.i("OFF", "SaveConfig: " + dataItemResult.getStatus() + ", " + dataItemResult.getDataItem().getUri());
                        }
                    });

        }
    });
}

private void initGoogleAPIClient() {
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
                @Override
                public void onConnected(Bundle connectionHint) {
                    Log.d("OFF", "onConnected: " + connectionHint);
                    // Now you can use the Data Layer API
                }
                @Override
                public void onConnectionSuspended(int cause) {
                    Log.d("OFF", "onConnectionSuspended: " + cause);
                }
            })
            .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
                @Override
                public void onConnectionFailed(ConnectionResult result) {
                    Log.d("OFF", "onConnectionFailed: " + result);
                }
            })
                    // Request access only to the Wearable API
            .addApi(Wearable.API)
            .build();
}

@Override
protected void onStop() {
    mGoogleApiClient.disconnect();
    super.onStop();
}

@Override
protected void onStart() {
    super.onStart();
    mGoogleApiClient.connect();
}

Когда я нажимаю кнопку, я получаю:

SaveConfig: Status{statusCode=SUCCESS, resolution=null}, wear://ad9cb4db-c697-4777-9088-0b29b8584043/count

Так что я предполагаю, что это было отправлено.

При ношении:

package com.off.testcomm;

public class MyWatchFace extends CanvasWatchFaceService {

...

private class Engine extends CanvasWatchFaceService.Engine implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener,DataApi.DataListener, MessageApi.MessageListener {

    @Override
    public void onCreate(SurfaceHolder holder) {
        super.onCreate(holder);

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

    @Override
        public void onVisibilityChanged(boolean visible) {

          if (visible) {
            Log.i("OFF","is visible");
            registerReceiver();
            mGoogleApiClient.connect();
          } ...

    @Override
    public void onConnected(Bundle bundle) {
        Log.i("OFF", "OnConnected ");

        Wearable.DataApi.addListener(mGoogleApiClient, this);

    }

    @Override
    public void onConnectionSuspended(int i) {
        Log.i("OFF","onConnectionSuspended");

    }

    @Override
    public void onDataChanged(DataEventBuffer dataEventBuffer) {
        Log.i("OFF","OnDataChanged");

    }

    @Override
    public void onMessageReceived(MessageEvent messageEvent) {
        Log.i("OFF","onMessageReceived");
    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        Log.i("OFF","onConnectionFailed");

    }

 ...

При износе последнего журнала я получаю: «OnConnected». Когда я нажимаю кнопку на мобильном телефоне, ничего не синхронизируется при износе.

Как видите, оба класса находятся в одних и тех же пакетах.

Что касается манифестов, у обоих есть:

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

Любые идеи?

Благодарность

w.


person wonglik    schedule 08.09.2015    source источник
comment
На стороне отправителя (телефона) добавьте временную метку к своим данным и повторите попытку: putDataMapReq.getDataMap().putLong(timestamp, System.currentTimeMillis()); и посмотреть, если это имеет значение. Я подозреваю, что вы добавляете одни и те же данные, и это не считается изменением, поэтому onDataChanged не вызывается.   -  person Ali Naddaf    schedule 08.09.2015
comment
@AliNaddaf, кажется, это работает, спасибо. Мне нужно сделать несколько тестов, чтобы убедиться, но почему бы вам не отправить его в качестве ответа, и если все в порядке, я закрою его с вашей подсказкой.   -  person wonglik    schedule 08.09.2015


Ответы (1)


Поскольку вы добавляете одни и те же данные каждый раз, когда нажимаете кнопку, в исходящих данных нет «изменения», поэтому вы не получаете обратный вызов onDataChanged(); Фреймворк Android Wear просматривает содержимое ваших данных и решает, является ли он новым или нет, и если он не видит никаких изменений в содержимом (при условии, что его путь также не меняется), он не будет учитывать это. новенький. Добавьте временную метку к вашим данным, и это должно каждый раз создавать новые данные и вызывать обратный вызов:

putDataMapReq.getDataMap().putLong("timestamp", System.currentTimeMillis());
person Ali Naddaf    schedule 08.09.2015