OnDataChanged не вызывается

У меня проблема со связью между моим телефоном и изнашиваемым устройством. Я решил добавить в свое приложение модуль износа. В приложении Wear есть только один класс (MainActivity).

package cz.johrusk.myapplication;

import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.wearable.view.WatchViewStub;
import android.util.Log;
import android.widget.TextView;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.wearable.DataApi;
import com.google.android.gms.wearable.DataEventBuffer;
import com.google.android.gms.wearable.PutDataMapRequest;
import com.google.android.gms.wearable.PutDataRequest;
import com.google.android.gms.wearable.Wearable;


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

GoogleApiClient mGoogleApiClient;
private TextView mTextView;
static final String TAG = MainActivity.class.getSimpleName();

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final WatchViewStub stub = (WatchViewStub) findViewById(R.id.watch_view_stub);
    stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {
        @Override
        public void onLayoutInflated(WatchViewStub stub) {
            mTextView = (TextView) stub.findViewById(R.id.text);
        }
    });
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addApi(Wearable.API)
            .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
                @Override
                public void onConnected(Bundle connectionHint) {
                    Log.d(TAG, "onConnected: " + connectionHint);
                    sendNumber(1);
                    Log.d(TAG,"BBBBBBBB");
                }
                @Override
                public void onConnectionSuspended(int cause) {
                    Log.d(TAG, "onConnectionSuspended: " + cause);
                }
            })
            .addOnConnectionFailedListener(this)
            .build();
    mGoogleApiClient.connect();
    Log.d(TAG,"mGoogleApiClient connected;");
}


@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
    Log.d(TAG,"FAILE" + connectionResult);
}
public void sendNumber(int number) {
    PutDataMapRequest putDataMapRequest = PutDataMapRequest.create("/number");

    putDataMapRequest.getDataMap().putInt("number",number);
    putDataMapRequest.getDataMap().putLong("Time",System.currentTimeMillis());
    PutDataRequest putDataReq = putDataMapRequest.asPutDataRequest();
    putDataReq.setUrgent();
    Wearable.DataApi.putDataItem(mGoogleApiClient, putDataReq)
            .setResultCallback(new ResultCallback<DataApi.DataItemResult>() {
                @Override
                public void onResult(@NonNull DataApi.DataItemResult dataItemResult) {
                    if (!dataItemResult.getStatus().isSuccess()) {
                        Log.d(TAG,"Fail");
                    }
                    else{
                        Log.d(TAG,"Succes");
                    }
                }
            });
}
@Override
protected void onStart() {
    super.onStart();
    mGoogleApiClient.connect();
}
@Override
public void onDataChanged(DataEventBuffer dataEventBuffer) {
    Log.d(TAG,"TEST");
}

}

Я сомневаюсь, что Wearable.DataApi.putDataItem должен вызывать WearableListenerService в моем телефонном приложении. Вот эта услуга:

package cz.johrusk.showsmscode.service;


import android.util.Log;

import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.wearable.DataEvent;
import com.google.android.gms.wearable.DataEventBuffer;
import com.google.android.gms.wearable.DataMap;
import com.google.android.gms.wearable.DataMapItem;
import com.google.android.gms.wearable.Wearable;
import com.google.android.gms.wearable.WearableListenerService;


 public class WatchListener_service extends WearableListenerService {
@Override
public void onCreate() {
    super.onCreate();
   GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addApi(Wearable.API)
            .build();
    mGoogleApiClient.connect();
}
@Override
public void onDataChanged(DataEventBuffer dataEventBuffer) {
    Log.d("prijato","number is: ");

    for (DataEvent dataEvent : dataEventBuffer) {
    if (dataEvent.getType() == DataEvent.TYPE_CHANGED) {
        DataMap dataMap = DataMapItem.fromDataItem(dataEvent.getDataItem()).getDataMap();
        String path = dataEvent.getDataItem().getUri().getPath();
        if (path.equals("/number")){
            int number = dataMap.getInt("numa");
            long time = dataMap.getInt("timestamp");
            Log.d("received","number is: " + number);

        }
    }
}
}

}

Однако метод onDataChanged в WatchListener_service не вызывается. Метод onResult внутри ResultCallbacks печатает «Succes», поэтому кажется, что DataItem отправляется правильно.

Я уже нахожу много похожих проблем на Stackoverlflow, поэтому проверил все эти вещи:

  1. Оба модуля имеют одинаковый applicationId
  2. Оба модуля используют com.google.android.gms: play-services-wearable: 9.0.0.
  3. SetUrgent используется для putDataRequest, поэтому задержки быть не должно.
  4. WearableListenerService объявил правильный фильтр намерений в манифесте:

    действие android: name = "com.google.android.gms.wearable.DATA_CHANGED" data android: scheme = "wear" android: host = "*"

И телефон, и приложение Wear работают на физическом устройстве. У меня вопрос ... Что мне делать, чтобы исправить эту проблему? Спасибо


person Tom Wayne    schedule 21.05.2016    source источник


Ответы (1)


Убедитесь, что оба приложения имеют одинаковый ключ отладки. У меня были некоторые проблемы с этим, и проблема заключалась в разных ключах для обоих приложений (для ношения и для мобильных устройств).

PS: Android Wear API просто смешон. Я прекратил разработку для Wear из-за того, насколько ужасен этот API, который не работает так, как они говорят.

person Daniel Oliveira    schedule 26.10.2016