Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Enviar mensaje de wearable al teléfono y luego responder inmediatamente

He estado luchando con el Android Wear Message API todo el día y finalmente he aceptado que necesito ayuda con esto.

Mi aplicación es muy sencilla. La parte Mobile consta de una MainActivity (que no hace nada más que mostrar "Hello world" y un Service que extiende WearableListenerService . La porción Wear es sólo MainActivity con un solo Button, e implementa MessageApi.MessageListener .

La idea es sencilla: presione el botón en el dispositivo de desgaste que envía un mensaje al móvil. Cuando el móvil recibe el mensaje, muestra un Toast con la ruta del mensaje del remitente (por ejemplo, / mobile ). Inmediatamente después de hacer esto, el móvil debe enviar un mensaje de nuevo al dispositivo desgaste usando mi método del reply () . Todo lo que quiero hacer es Registrar este mensaje.

Puedo lograr la primera parte perfectamente bien. Cuando se presiona el botón, el móvil aparece un tostado diciendo "/ mobile". La respuesta, sin embargo, parece perderse en el éter; No hay errores, pero tampoco hay mensaje.

¿Puede alguien por favor ayudarme a entender lo que estoy haciendo mal? He pegado mis archivos a continuación.

Este es el tutorial que estoy siguiendo. ¡Aclamaciones!

Desgaste: MainActivity.java

package org.thecosmicfrog.toastdroidmessageapitutorial; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.support.wearable.view.WatchViewStub; import android.util.Log; import android.view.View; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.wearable.MessageApi; import com.google.android.gms.wearable.MessageEvent; import com.google.android.gms.wearable.Node; import com.google.android.gms.wearable.NodeApi; import com.google.android.gms.wearable.Wearable; import java.util.List; import java.util.concurrent.TimeUnit; public class MainActivity extends Activity implements MessageApi.MessageListener { private final String LOG_TAG = MainActivity.class.getSimpleName(); private static final long CONNECTION_TIME_OUT_MS = 100; private static final String MOBILE_PATH = "/mobile"; private GoogleApiClient googleApiClient; private String nodeId; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initGoogleApiClient(); final WatchViewStub stub = (WatchViewStub) findViewById(R.id.watch_view_stub); stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() { @Override public void onLayoutInflated(WatchViewStub stub) { initWidgets(); } }); } private void initGoogleApiClient() { googleApiClient = getGoogleApiClient(this); retrieveDeviceNode(); } private GoogleApiClient getGoogleApiClient(Context context) { return new GoogleApiClient.Builder(context) .addApi(Wearable.API) .build(); } private void retrieveDeviceNode() { new Thread(new Runnable() { @Override public void run() { if (googleApiClient != null && !(googleApiClient.isConnected() || googleApiClient.isConnecting())) googleApiClient.blockingConnect(CONNECTION_TIME_OUT_MS, TimeUnit.MILLISECONDS); NodeApi.GetConnectedNodesResult result = Wearable.NodeApi.getConnectedNodes(googleApiClient).await(); List<Node> nodes = result.getNodes(); if (nodes.size() > 0) nodeId = nodes.get(0).getId(); Log.v(LOG_TAG, "Node ID of phone: " + nodeId); googleApiClient.disconnect(); } }).start(); } private void initWidgets() { findViewById(R.id.button_toast).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sendToast(); } }); } private void sendToast() { if (nodeId != null) { new Thread(new Runnable() { @Override public void run() { if (googleApiClient != null && !(googleApiClient.isConnected() || googleApiClient.isConnecting())) googleApiClient.blockingConnect(CONNECTION_TIME_OUT_MS, TimeUnit.MILLISECONDS); Wearable.MessageApi.sendMessage(googleApiClient, nodeId, MOBILE_PATH, null).await(); googleApiClient.disconnect(); } }).start(); } } @Override public void onMessageReceived(MessageEvent messageEvent) { Log.v(LOG_TAG, "In onMessageReceived()"); if (messageEvent.getPath().equals("/wear")) { Log.v(LOG_TAG, "Success!"); } } } 

Móvil: ListenerService.java

 package org.thecosmicfrog.toastdroidmessageapitutorial; import android.util.Log; import android.widget.Toast; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.wearable.MessageEvent; import com.google.android.gms.wearable.Wearable; import com.google.android.gms.wearable.WearableListenerService; import java.util.concurrent.TimeUnit; public class ListenerService extends WearableListenerService { private final String LOG_TAG = ListenerService.class.getSimpleName(); private static GoogleApiClient googleApiClient; private static final long CONNECTION_TIME_OUT_MS = 100; private static final String WEAR_PATH = "/wear"; private String nodeId; @Override public void onMessageReceived(MessageEvent messageEvent) { if (messageEvent.getPath().equals("/mobile")) { nodeId = messageEvent.getSourceNodeId(); Log.v(LOG_TAG, "Node ID of watch: " + nodeId); showToast(messageEvent.getPath()); reply(WEAR_PATH); } } private void showToast(String message) { Toast.makeText(this, message, Toast.LENGTH_LONG).show(); } private void reply(final String path) { googleApiClient = new GoogleApiClient.Builder(getApplicationContext()) .addApi(Wearable.API) .build(); Log.v(LOG_TAG, "In reply()"); Log.v(LOG_TAG, "Path: " + path); if (googleApiClient != null && !(googleApiClient.isConnected() || googleApiClient.isConnecting())) googleApiClient.blockingConnect(CONNECTION_TIME_OUT_MS, TimeUnit.MILLISECONDS); Wearable.MessageApi.sendMessage(googleApiClient, nodeId, path, null).await(); googleApiClient.disconnect(); } } 

El Mobile MainActivity es bastante trivial por lo que he dejado de lado para mayor claridad.

  • ¿Cómo puedo configurar el color estrella de la barra de calificación?
  • ¿Cómo puedo solucionar este UnknownHostException?
  • Error de Gradle después de incluir facebook sdk
  • Android: varios appWidgets que reproducen diferentes sonidos
  • Inserción de valores en Mapa <K, V>
  • Abrir el archivo pdf desde el servidor con la intención de Android
  • Android Location.getAccuracy () devuelve 1
  • Leer archivo de texto remoto en android
  • One Solution collect form web for “Enviar mensaje de wearable al teléfono y luego responder inmediatamente”

    Nunca llama a MessageApi.addListener () en su actividad de desgaste para que MessageListener nunca se registre para recibir mensajes. También debe llamar a MessageApi.removeListener () cuando se está destruyendo su actividad.

    Nota: ambos métodos requieren un GoogleApiClient conectado. Puede facilitar la lógica si deja un GoogleApiClient abierto durante toda la duración de su actividad en lugar de intentar conectar / removeListener() / desconectar en su onDestroy() .

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.