Android Wear DataMap onDataChanged()仅调用来自其他设备的数据

时间:2016-12-19 21:35:48

标签: android wear-os android-wear-data-api

我正在创建一个使用Android Wear的DataMap Api在Wear设备和手机之间发送信息的库。我已经让DataMap Api与另一个项目一起工作了,但是尽管使用了相同的步骤,但它似乎并不适用于这个项目。如果我在磨损设备或手机上使用putDataItem,则仅在更改数据的设备上调用onDataChanged,而不是其他设备。

我看到了我能找到的其他地方。我在我的数据中包含了一个时间戳以确保数据更改,我已将PutDataRequest设置为紧急使用setUrgent()以确保它立即发送,并且我确保onResult在发送时返回true数据。清单中的gms版本匹配,我也尝试在清单中设置intent过滤器。

以下是我一直在使用的代码:

电话部分:

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);
        }
    }
}

谢谢!

1 个答案:

答案 0 :(得分:0)

当然你可以自由选择自己的方式,但根据我的口味,我更喜欢Patloev的RXWear https://github.com/patloew/RxWear 请参阅我E52 watchface的此片段 从磨损中接收复杂的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 -> {   });

}