Отправка сообщений с Android Wear на хост-устройство
Я пишу пользовательское приложение Android Wear, которое должно запускать одноразовое сообщение на подключенное хост-устройство (телефон). Копаясь в API, я нашел следующий учебник, который должен хорошо работать:http://developer.android.com/training/wearables/data-layer/messages.html
мое приложение для Android имеет WearableListenerService, и мое приложение Android Wear запускает сообщения с помощью API сообщений. Wearablelistenerservice get вызывается, когда эмулятор подключается на основе регистрации следующего метода, поэтому я уверен, что служба подключена нормально
@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);
}
Лог:
/AndroidWearListenerService(19892): Connected peer name & ID: facdc219-37f5-4326-8fa6-1c8b8d3b6669|facdc219-37f5-4326-8fa6-1c8b8d3b6669
однако метод onMessageReceived никогда не запускается:
@Override
public void onMessageReceived(MessageEvent messageEvent) {
    Log.d(LOG_TAG, "MessageEvent received: " + messageEvent.getData());
    //do work
}
вот мой код Android Wear. Я удалил большую часть кода котельной плиты, оставив только необходимые биты
@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 :(");
                                }
                            }
                        });
                    }
                }
            });
        }
    });
}
ведение журнала, похоже, указывает, что сообщение было отправлено успешно, но приложение для Android WearableListenerService.onMessageReceived никогда не стреляет.
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}
какие идеи?
7 ответов
вы убедитесь, что "applicationId " одинаково для обоих приложений, т. е. для приложения на Android Wear и приложения на телефоне?
У меня была та же проблема, когда я добавил поддержку Android Wear для существующего приложения. Однако после многих часов разочарования. Я обнаружил проблему.
Я забыл добавить части подписи из сборки.gradle в приложении устройства в приложении wear. Поэтому убедитесь, что часть buildTypes и часть signingConfigs одинаковы в обоих приложениях.
У меня была аналогичная проблема, как обсуждалось здесь https://plus.google.com/116088533685577893615/posts/deCyoF6ALvV. Основываясь на моих экспериментах, кажется (хотя и не документировано), что имя пакета приложения watch должно быть таким же, как и у портативного приложения. Я создал пример проекта для api сообщений здесь https://github.com/petrnalevka/wear.
попробуйте добавить await() в конце метода sendMessage ().
PendingResult<MessageApi.SendMessageResult> messageResult = Wearable.MessageApi.sendMessage(googleApiClient, node.getId(),
                                PATH, null).await();
предыдущий ответ ниже предназначен для отправки сообщения только тогда, когда активность в Android-устройстве (мобильном) активна.
поскольку вы пытаетесь отправить сообщение с Android Wear на Android-устройство, прослушиватель сообщений должен быть добавлен в действие на Android-устройстве, а не в Android Wear, в MainActivity в 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());
         }
});
вы также можете попробовать более простой метод 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());
}
У меня есть пример кода, где у меня работают сообщения, от износа до устройства и устройства для ношения. https://github.com/kentarosu/AndroidWearAndLIFX
несколько месяцев назад у меня была такая же проблема при работе с Android wear.Моя проблема была-разные подписи (отпечатки пальцев SHA, созданные после подписания apks) обоих apk, в то время как ключи приложения были одинаковыми.См. ссылку ниже:
OnMessageReceived не вызывается в WearableListenerService
надеюсь, это кому-то поможет.
Обычные подозреваемые:
- на applicationId как уже упоминалось, и
 - на сертификаты подписи использовать
 
в базовом случае следующие части должны быть идентичными в конфигурациях gradle обоих приложений.
defaultConfig {
    applicationId = "com.your.domain" 
}
signingConfigs {
    debug {
        storeFile file("../debug.keystore")
    }
    release {
        storeFile file("../release.keystore")
    }
} 
и приложения должны использовать тот же applicationId и подписываться с тем же сертификатом.