web-dev-qa-db-fra.com

Envoi de messages d'Android Wear à un appareil hôte

J'écris une application Android Wear personnalisée qui est censée envoyer un message unique au périphérique hôte connecté (le téléphone). En fouillant dans l'API, j'ai trouvé le tutoriel suivant qui devrait bien fonctionner: http://developer.Android.com/training/wearables/data-layer/messages.html

Mon application Android dispose d'un WearableListenerService et mon application Android Wear déclenche le déclenchement de messages à l'aide de l'API Message. Le WearableListenerService est appelé lorsque l'émulateur est connecté en fonction de la journalisation de la méthode suivante. Je suis donc presque sûr que le service est correctement connecté.

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

Journal de sortie:

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

Cependant, la méthode onMessageReceived n'est jamais déclenchée:

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

Voici mon code d'usure Android. J'ai supprimé la plupart des codes de plaque de chaudière, ne laissant que les bits nécessaires

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

La journalisation semble indiquer que le message a été envoyé avec succès, mais l'application WearableListenerService.onMessageReceived de l'application Android ne se déclenche jamais.

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}

Des idées?

24
ebernie

Vous êtes-vous assuré que le " applicationId " est identique pour les deux applications, c'est-à-dire pour l'application sur Android Wear et pour l'application sur le téléphone?

48
Dominique

J'ai eu le même problème lorsque j'ai ajouté le support Android Wear pour une application existante. Cependant, après plusieurs heures de frustration. J'ai découvert le problème. 

J'ai oublié d'ajouter les éléments de signature du build.gradle dans l'application de l'appareil dans l'application d'usure . Assurez-vous donc que les éléments buildTypes et signerConfigs sont identiques dans les deux applications. 

4
ui-jakob

J'ai eu un problème similaire à celui décrit ici https://plus.google.com/116088533685577893615/posts/deCyoF6ALvV . D'après mes expériences, il semble (bien que ce ne soit pas documenté) que le nom du package de l'application Watch doit être identique à celui de l'application de poche. J'ai créé un exemple de projet pour le message api ici https://github.com/petrnalevka/wear .

3
Petr Nalevka

Essayez d’ajouter wait () à la fin de votre méthode sendMessage ().

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

La réponse précédente ci-dessous concerne l'envoi d'un message uniquement lorsque l'activité sur l'appareil Android (mobile) est active. 

Puisque vous essayez d'envoyer un message d'Android Wear à un appareil Android, l'écouteur de message doit être ajouté à l'activité dans l'Android sous Android Wear, les codes suivants doivent être ajoutés à MainActivity dans Android (mobile) 

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

Vous pouvez également essayer la méthode plus simple SendMessage ()

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
wenjiun

J'ai quelques exemples de code où je fais fonctionner les messages, de l'usure à l'appareil et de l'appareil à l'usure. https://github.com/kentarosu/AndroidWearAndLIFX

2
gatlingxyz

Il y a quelques mois, j'ai eu le même problème lorsque je travaillais avec Android Wear. Mon problème était - différentes signatures (empreintes digitales SHA générées après la signature d'apks) des deux apk alors que les clés d'application étaient identiques.

OnMessageReceived n'est pas appelé dans WearableListenerService

J'espère que ça aide quelqu'un.

1
Lakhan Sharma

Les suspects habituels sont: 

  • le applicationId comme d'autres l'ont mentionné et 
  • les certificats de signature utilisé

Dans le cas de base, les parties suivantes doivent être identiques, dans les configurations de dégradé des deux applications. 

defaultConfig {
    applicationId = "com.your.domain" 
}

signingConfigs {
    debug {
        storeFile file("../debug.keystore")
    }
    release {
        storeFile file("../release.keystore")
    }
} 

Les deux apps doivent utiliser le même identificateur d'application et être signés avec le même certificat. 

0
Plato