Envío de mensajes desde Android Wear al dispositivo host


Estoy escribiendo una aplicación Android Wear personalizada que se supone que dispara un mensaje único al dispositivo host conectado (el teléfono). Buscando a través de 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 WearableListenerService y mi aplicación Android Wear dispara mensajes usando la API de mensajes. El WearableListenerService get se llama cuando el emulador se conecta basado en el registro del siguiente método, por lo que estoy bastante seguro de que el servicio está conectado bien

@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 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ó correctamente, pero el servicio WearableListenerService de la aplicación Android.Un mensaje recibido nunca dispara.

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}

Cualquiera ideas?

 24
Author: ebernie, 2014-07-06

7 answers

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

 48
Author: Dominique,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-07 13:08:53

Tuve el mismo problema cuando agregué compatibilidad con Android Wear para una aplicación existente. Sin embargo después del camino a muchas horas del desajuste. Descubrí el problema.

Olvidé agregar las partes de firma de la compilación.gradle en la aplicación dispositivo en la aplicación wear. Así que asegúrate de que la parte buildTypes y la parte signingConfigs sean las mismas en ambas aplicaciones.

 4
Author: ui-jakob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-26 21:23:07

He tenido un problema similar al que se discute aquí https://plus.google.com/116088533685577893615/posts/deCyoF6ALvV. Basándome en mis experimentos, parece (aunque no está documentado) que el nombre del paquete de la aplicación watch debe ser el mismo que el de la aplicación handheld. He creado un proyecto de ejemplo para la api de mensajes aquí https://github.com/petrnalevka/wear .

 3
Author: Petr Nalevka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-07 20:43:06

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 mensajes solo cuando la Actividad en el dispositivo Android (móvil) está activa.

Dado que está tratando de enviar un mensaje desde Android Wear al dispositivo Android, el oyente de mensajes debe agregarse en la Actividad en el dispositivo Android no 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 puede 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());
}
 2
Author: wenjiun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-07 04:16:15

Tengo un código de ejemplo donde tengo los mensajes de trabajo, tanto de desgaste para el dispositivo y el dispositivo de desgaste. https://github.com/kentarosu/AndroidWearAndLIFX

 2
Author: kentarosu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-07 13:08:49

Hace unos meses, tuve el mismo problema mientras trabajaba con Android wear.My el problema fue: diferentes firmas (huellas SHA generadas después de firmar apk) de ambos apk, mientras que las claves de la aplicación eran las mismas.Consulte el siguiente enlace:

OnMessageReceived not called in WearableListenerService

Espero que esto ayude a alguien.

 1
Author: Lakhan Sharma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:09:00

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 applicationId y estar firmadas con el mismo certificado.

 0
Author: Plato,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-03 13:32:52