2016-12-19 4 views
0

Je crée une bibliothèque qui utilise DataMap Api d'Android Wear pour envoyer des informations entre un appareil Wear et un téléphone. J'ai le DataMap Api qui fonctionne avec un autre projet, mais malgré les mêmes étapes, il ne semble pas fonctionner dans celui-ci. Si j'utilise putDataItem sur le dispositif d'usure, ou sur le téléphone, onDataChanged n'est appelé que sur l'appareil qui a changé les données, pas sur l'autre appareil.Android Wear DataMap onDataChanged() n'est pas appelé pour les données d'un autre appareil uniquement

J'ai regardé partout ailleurs j'ai pu trouver. J'ai inclus un horodatage dans mes données pour m'assurer que les données changent, j'ai mis le PutDataRequest comme Urgent avec setUrgent() pour m'assurer qu'il est envoyé immédiatement, et je me suis assuré que le onResult retourne vrai quand j'envoie le Les données. Les versions de gms dans le manifeste correspondent, et j'ai essayé de configurer le filtre d'intention dans le manifeste aussi.

Voici le code que je l'ai utilisé:

Phone Référence:

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


} 

Ensuite, la pièce d'usure:

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

Merci!

Répondre

0

Bien sûr, vous êtes libres de choisir leur propre chemin, mais à mon goût, je préfère RXWear de Patloev https://github.com/patloew/RxWear Voir cet extrait de mon E52 watchface
Recevoir des données obj complexes de l'usure:

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




       } 
      }); 

Envoyer certains à l'horloge:

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

}