2016-08-09 6 views
0

Arbeiten an Wear-Anwendung, ich habe Wear-Anwendung mit Mobile erstellt und Anwendungen tragen. Das Senden von Daten von der mobilen Anwendung über "MessageApi.SendMessageResult" und das Zurückgeben des Status ist SUCCESS, aber die Nachricht wird nicht in der Verschleißanwendung empfangen. Bitte finden Sie den Code unten und lassen Sie mich wissen, dass ich etwas vermisse.Wearable.MessageApi.sendMessage gibt Erfolg zurück, aber onMessageReceived ruft nicht an

Mobile App-Code:

public class MainActivity extends Activity implements GoogleApiClient.ConnectionCallbacks { 

private static final String START_ACTIVITY = "/start_activity"; 
private static final String WEAR_MESSAGE_PATH = "/message"; 

private GoogleApiClient mApiClient; 

private ArrayAdapter<String> mAdapter; 

private ListView mListView; 
private EditText mEditText; 
private Button mSendButton; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    init(); 
    initGoogleApiClient(); 
} 

private void initGoogleApiClient() { 
    mApiClient = new GoogleApiClient.Builder(this) 
      .addApi(Wearable.API) 
      .build(); 

    mApiClient.connect(); 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    mApiClient.disconnect(); 
} 

private void init() { 
    mListView = (ListView) findViewById(R.id.list_view); 
    mEditText = (EditText) findViewById(R.id.input); 
    mSendButton = (Button) findViewById(R.id.btn_send); 

    mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1); 
    mListView.setAdapter(mAdapter); 

    mSendButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      String text = mEditText.getText().toString(); 
      if (!TextUtils.isEmpty(text)) { 
       mAdapter.add(text); 
       mAdapter.notifyDataSetChanged(); 

       sendMessage(WEAR_MESSAGE_PATH, text); 

      } 
     } 
    }); 
} 

private void sendMessage(final String path, final String text) { 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      //Previous code 
      NodeApi.GetConnectedNodesResult nodes = Wearable.NodeApi.getConnectedNodes(mApiClient).await(); 

      Log.d("MessageAPI","nodes :: "+nodes); 
      for(com.google.android.gms.wearable.Node node : nodes.getNodes()) { 
       Log.d("MessageAPI","nodes for :: "+node); 
       MessageApi.SendMessageResult result = Wearable.MessageApi.sendMessage(
         mApiClient, node.getId(), path, text.getBytes()).await(); 
       Log.d("MessageAPI","node.getId() : "+node.getId()); 
       Log.d("MessageAPI","text.getBytes() : "+text.getBytes()); 
       Log.d("MessageAPI","path : "+path); 
       Log.d("MessageAPI","nodes result Status:: "+result.getStatus().isSuccess()); 
      } 

      /*PutDataMapRequest putDMR = PutDataMapRequest.create(path); 
      putDMR.getDataMap().putAll(getDatMap()); 
      PutDataRequest request = putDMR.asPutDataRequest(); 
      DataApi.DataItemResult result = Wearable.DataApi.putDataItem(mApiClient, request).await(); 
      if (result.getStatus().isSuccess()) { 
       Log.v("MessageAPI", "nodes DataMap: " + getDatMap() + " sent successfully to data layer "); 
      } else { 
       // Log an error 
       Log.v("MessageAPI", "nodes ERROR: failed to send DataMap to data layer"); 
      }*/ 



      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        mEditText.setText(""); 
       } 
      }); 
     } 
    }).start(); 
} 

@Override 
public void onConnected(Bundle bundle) { 
    sendMessage(START_ACTIVITY, "Wear my TEST MESSAGE"); 
} 

@Override 
public void onConnectionSuspended(int i) { 

} 
private DataMap getDatMap(){ 

    DataMap dataMap = new DataMap(); 
    dataMap.putLong("time", new Date().getTime()); 
    dataMap.putString("hole", "1"); 
    dataMap.putString("front", "250"); 
    dataMap.putString("middle", "260"); 
    dataMap.putString("back", "270"); 

    return dataMap; 
} 

}

Mobile App Manifest:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.ptrprograms.wearmessageapi" > 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 

    <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> 

    <activity 
     android:name=".MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

wearApp-Code

public class WearMessageListenerService extends WearableListenerService { 
private static final String START_ACTIVITY = "/start_activity"; 

@Override 
public void onMessageReceived(MessageEvent messageEvent) { 

    Log.d("MessageAPI","onMessageReceived :: "+ messageEvent.getPath()); 
    /* if(messageEvent.getPath().equalsIgnoreCase(START_ACTIVITY)) { 
     Intent intent = new Intent(this, MainActivity.class); 
     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     startActivity(intent); 
    } else { 
     super.onMessageReceived(messageEvent); 
    }*/ 

    showToast("onMessageReceived:: "+messageEvent.getPath()); 
    Intent intent = new Intent(this, MainActivity.class); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(intent); 

} 

private void showToast(String message) { 
    Toast.makeText(this, message, Toast.LENGTH_LONG).show(); 
} 

@Override 
public void onDataChanged(DataEventBuffer dataEventBuffer) { 
    super.onDataChanged(dataEventBuffer); 
    Log.d("MessageAPI","onMessageReceived : onDataChanged: "); 
} 

}

wearApp manifest:

<?xml version="1.0" encoding="utf-8"?> 

<uses-feature android:name="android.hardware.type.watch" /> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@android:style/Theme.DeviceDefault" > 

    <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> 

    <activity 
     android:name=".MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <!-- <service android:name=".WearMessageListenerService"> 
     <intent-filter> 
      <action android:name="com.google.android.gms.wearable.BIND_LISTENER" /> 
     </intent-filter> 
    </service>--> 
    <service android:name=".WearMessageListenerService"> 
     <action android:name="com.google.android.gms.wearable.MESSAGE_RECEIVED" /> 
     <action android:name="com.google.android.gms.wearable.DATA_CHANGED" /> 
     <data android:scheme="wear" android:host="*" android:pathPrefix="/prefix" /> 
     <!--<data android:scheme="wear" android:host="*" 
     android:path="/start_activity" />--> 
     <!--<action android:name="com.google.android.gms.wearable.CAPABILITY_CHANGED" /> 
     <action android:name="com.google.android.gms.wearable.CHANNEL_EVENT" />--> 
     <!-- <data android:scheme="wear" android:host="*" android:path="/start_activity" />--> 


    </service> 

</application> 

Antwort

0

1) Problem ist in wearApp in WearMessageListenerService. Sie rufen nicht super.onMessageReceived(messageEvent); , d. H. Sie verbrauchen alle Nachrichten. Wenn Sie Super-Methode aufrufen, übergeben Sie die Nachricht an Wearable.MessageApi.addListener(...

2) Ich sehe nicht in Ihrer Kleidung App, dass Sie MessageApi Listener registrieren.

3) Sie mischen MessageApi mit Data Layer API.

4) In Verschleiß-App in Hauptaktivität müssen Sie mit Google Play-Dienste zu verbinden. So registrieren Sie den MessageApi-Listener in der onConnected-Methode.

5) Bitte überprüfen Sie https://github.com/mariopce/android-wear-bilateral-communication. Dies ist ein Beispiel für die Verwendung von MessageApi für 2-Wege-Kommunikation (Mobile-Wear-Mobile)

+0

Vielen Dank für die Antwort. Das Github-Projekt gibt einen Kompilierungsfehler zurück. Fehler: Android-tragen-bilaterale-Kommunikation-master \ mobile \ src \ main \ AndroidManifest.xml Fehler: (22) Fehler: Die Aktion com.google.android.gms. wearable.BIND_LISTENER ist veraltet. [WearableBindListener] Ravikumar11

+0

Travis - es ist ein kontinuierliches Integrationswerkzeug wie jenkins oder teamcity - aber für ein Open Source-Projekt - sagen Sie, dass alles in Ordnung ist. https://travis-ci.org/mariopce/android-wear-bilateral-communication Vielleicht hast du eine ältere Version von Playservice. – mariopce

+0

In Gradle verwende ich kompilieren 'com.google.android.gms: play-services-wearable: 9.4.0' Version und Manifest 9452000. Lassen Sie mich alle Änderungen in den Projekteinstellungen wissen. – Ravikumar11

Verwandte Themen