Android Wear DataMap onDataChanged () не вызывается только для данных с другого устройства

Я создаю библиотеку, которая использует DataMap Api Android Wear для передачи информации между устройством Wear и телефоном. У меня DataMap Api работает с другим проектом, но, несмотря на использование тех же шагов, в этом он, похоже, не работает. Если я использую putDataItem на устройстве износа или телефоне, onDataChanged вызывается только на устройстве, которое изменило данные, а не на другом устройстве.

Я искал везде, где мог найти. Я включил метку времени в свои данные, чтобы убедиться, что данные изменяются, я установил PutDataRequest как Urgent с помощью setUrgent (), чтобы убедиться, что он будет отправлен немедленно, и я убедился, что onResult возвращает true, когда я отправляю данные. Версии gms в манифесте совпадают, и я также попытался настроить фильтр намерений в манифесте.

Вот код, который я использовал:

Телефонная часть:

package a.package.name; //I've changed this here, to hide stuff..  it's the same as below, though.
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.Result;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.wearable.Asset;
import com.google.android.gms.wearable.DataApi;
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.PutDataMapRequest;
import com.google.android.gms.wearable.PutDataRequest;
import com.google.android.gms.wearable.Wearable;

public class WatchCommsPhone implements DataApi.DataListener, GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener, ResultCallback {

public static final String DATA_PATH_WATCH = "/watch_comms1";
public static final String DATA_PATH_PHONE = "/watch_comms2";

private GoogleApiClient gac;
Context c;

WatchCommsCallback wcc;

Handler h = new Handler();

public WatchCommsPhone(Context currentContext, WatchCommsCallback callback){
    wcc = callback;
    c = currentContext;
    gac = new GoogleApiClient.Builder(c).addApi(Wearable.API).addConnectionCallbacks(this).addOnConnectionFailedListener(this).build();
    gac.connect();
}

public void sendString(String message,long timestamp, String tag){

    PutDataMapRequest pdmr = PutDataMapRequest.create(DATA_PATH_PHONE);
    DataMap dm = pdmr.getDataMap();
    Asset a = Asset.createFromBytes(message.getBytes());
    dm.putAsset("data",a);
    dm.putLong("timestamp", timestamp);
    dm.putString("tag",tag);
    PutDataRequest pdr = pdmr.asPutDataRequest();
    pdr.setUrgent();
    Wearable.DataApi.putDataItem(gac,pdr).setResultCallback(this);
}

@Override
public void onConnected(@Nullable Bundle bundle) {
    Log.d("WatchCommsPhone","Watch Comms Watch: Connected");
    Wearable.DataApi.addListener(gac,this);

}

@Override
public void onConnectionSuspended(int i) {
    Log.d("WatchCommsPhone","Watch Comms Watch: Connection Suspended");
}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
    Log.e("WatchCommsPhone","Watch Comms Watch: Connection Failed");
}

@Override
public void onDataChanged(DataEventBuffer dataEventBuffer) {  //This gets called when you get data!
    Log.d("WatchCommsPhone", "On Data Changed!");
    for (DataEvent event: dataEventBuffer){

        if (event.getType() == DataEvent.TYPE_CHANGED){
            Log.d("WatchCommsPhone","Got data of path: " + event.getDataItem().getUri().getPath());
            if(event.getDataItem().getUri().getPath().equals(DATA_PATH_WATCH)){
                Log.d("WatchCommsPhone","Got data from watch.");
                DataMap dm = DataMapItem.fromDataItem(event.getDataItem()).getDataMap();
                String tag = dm.getString("tag");
                Long timestamp = dm.getLong("timestamp");
                String data = dm.getString("data");
                ProcessData pd = new ProcessData(tag,data,timestamp);
                h.post(pd);
            }
        }
        }
}

@Override
public void onResult(@NonNull Result result) {
    Log.d("WatchCommsPhone","onResultCalled: " + result.getStatus().isSuccess());

}

public interface WatchCommsCallback{
    void onWatchMessageReceived(String tag, String message, long timestamp);
}

public class ProcessData implements Runnable{
    String tag;
    String data;
    Long timestamp;

    public ProcessData(String receivedTag, String receivedData, Long receivedTimestamp){
        tag = receivedTag;
        data = receivedData;
        timestamp = receivedTimestamp;
    }
    @Override
    public void run(){
        wcc.onWatchMessageReceived(tag,data,timestamp);
    }
}


}

Затем часть износа:

 package a.package.name; //I've changed this here, to hide stuff..  it's the same as above, though.
 import android.content.Context;
 import android.os.Bundle;
 import android.os.Handler;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.util.Log;
 import com.google.android.gms.common.ConnectionResult;
 import com.google.android.gms.common.api.GoogleApiClient;
 import com.google.android.gms.common.api.Result;
 import com.google.android.gms.common.api.ResultCallback;
 import com.google.android.gms.wearable.Asset;
 import com.google.android.gms.wearable.DataApi;
 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.PutDataMapRequest;
 import com.google.android.gms.wearable.PutDataRequest;
 import com.google.android.gms.wearable.Wearable;
    public class WatchCommsWatch implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, DataApi.DataListener, ResultCallback {

    public static final String DATA_PATH_WATCH = "/watch_comms1";
    public static final String DATA_PATH_PHONE = "/watch_comms2";


    Context c;
    GoogleApiClient gac;
    WatchCommsCallback wcc;

    Handler h = new Handler();

    public WatchCommsWatch(Context currentContext,WatchCommsCallback callback){
        wcc = callback;
        c = currentContext;
        gac = new GoogleApiClient.Builder(c).addApi(Wearable.API).addConnectionCallbacks(this).addOnConnectionFailedListener(this).build();
        gac.connect();
    }

    public void sendString(String message,long timestamp, String tag){

        PutDataMapRequest pdmr = PutDataMapRequest.create(DATA_PATH_WATCH);
        pdmr.setUrgent();
        DataMap dm = pdmr.getDataMap();
        Asset a = Asset.createFromBytes(message.getBytes());
        dm.putAsset("data",a);
        dm.putLong("timestamp", timestamp);
        dm.putString("tag",tag);
        PutDataRequest pdr = pdmr.asPutDataRequest();
        pdr.setUrgent();
        Wearable.DataApi.putDataItem(gac,pdr).setResultCallback(this);

    }

    @Override
    public void onConnected(@Nullable Bundle bundle) {
        Log.d("WatchCommsWatch","Watch Connected.");
        Wearable.DataApi.addListener(gac,this);

    }

    @Override
    public void onConnectionSuspended(int i) {
        Log.d("WatchCommsWatch","Watch Connection Suspended.");
    }

    @Override
    public void onDataChanged(DataEventBuffer dataEventBuffer) {
        Log.d("WatchCommsWatch","onDataChanged Called.");
        for (DataEvent event: dataEventBuffer){
            if (event.getType() == DataEvent.TYPE_CHANGED){
                if(event.getDataItem().getUri().getPath().equals(DATA_PATH_WATCH)){
                    Log.d("WatchCommsWatch","Got data from watch.");
                    DataMap dm = DataMapItem.fromDataItem(event.getDataItem()).getDataMap();
                    String tag = dm.getString("tag");
                    Long timestamp = dm.getLong("timestamp");
                    Asset dataAsset = dm.getAsset("data");
                    //String data = new String(dataAsset.getData());
                    String data = tag;
                    ProcessData pd = new ProcessData(tag,data,timestamp);
                    h.post(pd);
                }
            }
        }
    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
        Log.e("WatchCommsWatch","WatchCommsWatch: Connection Failed.");
    }

    @Override
    public void onResult(@NonNull Result result) {
        Log.d("WatchCommsWatch","onResultCalled: " + result.getStatus().isSuccess());

    }
    public interface WatchCommsCallback{
        void onWatchMessageReceived(String message, String tag, long timestamp);
    }

    public class ProcessData implements Runnable{
        String tag;
        String data;
        Long timestamp;

        public ProcessData(String receivedTag, String receivedData, Long receivedTimestamp){
            tag = receivedTag;
            data = receivedData;
            timestamp = receivedTimestamp;
        }
        @Override
        public void run(){
            wcc.onWatchMessageReceived(tag,data,timestamp);
        }
    }
}

Спасибо!


person Martin_xs6    schedule 19.12.2016    source источник


Ответы (1)


Конечно, вы можете выбрать свой собственный путь, но на мой вкус я предпочитаю RXWear от Patloev https://github.com/patloew/RxWear См. этот фрагмент из моего Циферблат E52
Получение сложных данных obj из износа:

rxWear.message().listen("/dataMap", MessageApi.FILTER_LITERAL)
            .compose(MessageEventGetDataMap.noFilter())
            .subscribe(dataMap -> {
                // String title = dataMap.getString("title",           getString(R.string.no_message));
                if  (dataMap.containsKey("alWearTimersCategories")) {
                    String json =   dataMap.getString("alWearTimersCategories");
                    alTimersCategories=  allData.convertStringToALTimerWorkspace(json);
                    allData.setAlTimersCategoriesFromWear(alTimersCategories);
                    if (indata != null) {
                         timerdataset.refreshInternalData(alTimersCategories.get(   iActiveWorkSpaceindex).alTimersCategoryInWorkspace);
                    }




                }
            });

Отправьте на часы:

    rxWear.message().sendDataMapToAllRemoteNodes("/dataMap")
            .putString("timers", "TimersCategories")
            .putString("alTimersCategories", convertALTimerWorkspace(alTimersCategories))
            .toObservable()
            .subscribe(requestId -> {   });

}
person Nick Maletsky    schedule 20.12.2016