1

J'ai un problème de communication entre mon téléphone et mon appareil d'usure. J'ai décidé d'ajouter le module d'usure à mon application. Porter app a une seule classe (MainActivity)OnDataChanged n'est pas appelé

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

}

Je quess que "Wearable.DataApi.putDataItem" devrait appeler WearableListenerService dans mon application téléphonique. Voici ce service:

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

     } 
    } 
} 
} 

}

Cependant, la méthode onDataChanged dans WatchListener_service n'est pas appelé. La méthode onResult dans ResultCallbacks imprime "Succes", il semble donc que DataItem est envoyé correctement.

Je trouve déjà de nombreux problèmes similaires sur Stackoverlflow donc je vérifié toutes ces choses:

  1. Les deux modules a même applicationId
  2. Les deux modules utilisent « com.google.android.gms: play-services-portable : 9.0.0 '
  3. SetUrgent est utilisé pour mettreDataRequest donc il ne devrait y avoir aucun retard.
  4. WearableListenerService a déclaré filtre l'intention correcte Manifest:

    l'action android: name = "com.google.android.gms.wearable.DATA_CHANGED" données android: scheme = "porter" android: host = "* "

Les deux applications téléphone et Wear s'exécutent sur un périphérique physique. Ma question est ... Que dois-je faire pour résoudre ce problème? Merci

Répondre

2

Vérifiez si les deux applications ont la même clé de débogage. J'ai eu quelques problèmes avec cela et le problème était différentes clés pour les deux applications (usure et mobile). PS: L'API Android Wear est ridicule. J'ai arrêté de développer pour Wear à cause de la gravité de cette API qui ne fonctionne pas comme ils le disent.