wear contestar app wear-os

wear-os - contestar whatsapp android wear



Enviando mensajes desde Android Wear al dispositivo host (7)

¿Se aseguró de que el " applicationId " sea el mismo para ambas aplicaciones, es decir, para la aplicación en el Android Wear y la aplicación en el teléfono?

Estoy escribiendo una aplicación personalizada de Android Wear que supuestamente dispara un mensaje único al dispositivo host conectado (el teléfono). Examinando la API, encontré el siguiente tutorial que debería funcionar bien: http://developer.android.com/training/wearables/data-layer/messages.html

Mi aplicación Android tiene un servicio WearableListenerService y mi aplicación Android Wear dispara mensajes utilizando la API de mensajes. El servicio WearableListenerService se llama cuando el emulador se conecta basándose en el registro del siguiente método, así que estoy bastante seguro de que el servicio está bien cableado

@Override public void onPeerConnected(Node peer) { super.onPeerConnected(peer); String id = peer.getId(); String name = peer.getDisplayName(); Log.d(LOG_TAG, "Connected peer name & ID: " + name + "|" + id); }

Salida de registro:

/AndroidWearListenerService(19892): Connected peer name & ID: facdc219-37f5-4326-8fa6-1c8b8d3b6669|facdc219-37f5-4326-8fa6-1c8b8d3b6669

Sin embargo, el método onMessageReceived nunca se activa:

@Override public void onMessageReceived(MessageEvent messageEvent) { Log.d(LOG_TAG, "MessageEvent received: " + messageEvent.getData()); //do work }

Aquí está mi código de Android Wear. He eliminado la mayor parte del código de la placa de la caldera dejando solo los bits necesarios

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); final GoogleApiClient googleApiClient = new GoogleApiClient.Builder(this) .addApi(Wearable.API) .build(); googleApiClient.connect(); final WatchViewStub stub = (WatchViewStub) findViewById(R.id.watch_view_stub); stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() { @Override public void onLayoutInflated(WatchViewStub stub) { fireMessage(); } private void fireMessage() { // Send the RPC PendingResult<NodeApi.GetConnectedNodesResult> nodes = Wearable.NodeApi.getConnectedNodes(googleApiClient); nodes.setResultCallback(new ResultCallback<NodeApi.GetConnectedNodesResult>() { @Override public void onResult(NodeApi.GetConnectedNodesResult result) { for (int i = 0; i < result.getNodes().size(); i++) { Node node = result.getNodes().get(i); String nName = node.getDisplayName(); String nId = node.getId(); Log.d(TAG, "Node name and ID: " + nName + " | " + nId); Wearable.MessageApi.addListener(googleApiClient, new MessageApi.MessageListener() { @Override public void onMessageReceived(MessageEvent messageEvent) { Log.d(TAG, "Message received: " + messageEvent); } }); PendingResult<MessageApi.SendMessageResult> messageResult = Wearable.MessageApi.sendMessage(googleApiClient, node.getId(), PATH, null); messageResult.setResultCallback(new ResultCallback<MessageApi.SendMessageResult>() { @Override public void onResult(MessageApi.SendMessageResult sendMessageResult) { Status status = sendMessageResult.getStatus(); Log.d(TAG, "Status: " + status.toString()); if (status.getStatusCode() != WearableStatusCodes.SUCCESS) { alertButton.setProgress(-1); label.setText("Tap to retry. Alert not sent :("); } } }); } } }); } }); }

El registro parece indicar que el mensaje se envió con éxito, pero WearableListenerService.onMessageReceived de la aplicación de Android nunca se activa.

D/MyWearApp MyActivity( 2014): Node name and ID: a2ba665d-a559-4a95-91d2-c16fc7873e28 | a2ba665d-a559-4a95-91d2-c16fc7873e28 D/MyWearApp MyActivity( 2014): Status: Status{statusCode=SUCCESS, resolution=null}

¿Algunas ideas?


Hace unos meses, tuve el mismo problema mientras trabajaba con Android.Mi problema fue: diferentes firmas (huellas digitales SHA generadas después de firmar apks) de ambas aplicaciones de apk mientras que las claves de la aplicación eran las mismas. Refiérase al enlace a continuación:

OnMessageReceived no se llama en WearableListenerService

Espero que esto ayude a alguien.



Intente agregar await () al final de su método sendMessage ().

PendingResult<MessageApi.SendMessageResult> messageResult = Wearable.MessageApi.sendMessage(googleApiClient, node.getId(), PATH, null).await();

La respuesta anterior a continuación es para enviar un mensaje solo cuando la actividad en el dispositivo Android (móvil) está activa.

Dado que está intentando enviar un mensaje desde Android Wear a un dispositivo Android, el detector de mensajes debe agregarse a la Actividad en el dispositivo Android que no esté en Android Wear, los siguientes códigos deben agregarse a MainActivity en Android (móvil)

final GoogleApiClient googleApiClient = new GoogleApiClient.Builder(this) .addApi(Wearable.API) .build(); googleApiClient.connect(); Wearable.MessageApi.addListener(googleApiClient, new MessageApi.MessageListener() { @Override public void onMessageReceived(MessageEvent messageEvent) { Log.d(TAG, "Message received: " + messageEvent.getPath()); } });

También puedes probar el método SendMessage () más simple.

SendMessageResult result = Wearable.MessageApi.sendMessage( mGoogleApiClient, node.getId(), "STRING TO BE SENT", null).await(); if (!result.getStatus().isSuccess()) { Log.e(TAG, "ERROR: failed to send Message: " + result.getStatus()); }


Los sospechosos habituales son:

  • el applicationId como otros han mencionado y
  • los certificados de firma utilizados

En el caso básico, las siguientes partes deben ser idénticas, en las configuraciones de gradle de ambas aplicaciones.

defaultConfig { applicationId = "com.your.domain" } signingConfigs { debug { storeFile file("../debug.keystore") } release { storeFile file("../release.keystore") } }

Ambas aplicaciones necesitan usar el mismo ID de aplicación y estar firmadas con el mismo certificado.



Tuve el mismo problema cuando agregué soporte para Android Wear para una aplicación existente. Sin embargo, después de muchas horas de frustración. Descubrí el problema.

Olvidé agregar las partes de firma de build.gradle en la aplicación del dispositivo en la aplicación de desgaste. Así que asegúrate de que la parte buildTypes y la parte to FirmConfigs sean iguales en ambas aplicaciones.