WearableListenerService onMessageReceived() не вызывается

На телефонном устройстве у меня есть служба WearableListenerService, прослушивающая ввод с устройства Android Wear.

Я использую как DataItems, так и Messages. DataItems отлично синхронизируются между двумя устройствами, однако у меня возникают проблемы с получением сообщений на телефон.

Я пробовал следующее:

  • Подтвержденная одежда отправила сообщение
  • Проверено, совпадают ли имена пакетов
  • Проверено, совпадают ли подписи (оба отладки Android)

Тем не менее, onMessageReceived не вызывается в DataLayerListenerService. Первоначально я использовал активность и расширял MessageListener, который тоже не работал, за исключением одного момента, когда он ненадолго работал.

Код износа Android

public static void sendMessageToDevice(final String commandPath, final byte[] additionalData)
{
    // Separate thread from UI thread
    new Thread(new Runnable()
    {
        @Override
        public void run()
        {
            String nodeId = null;

            // Find first connected device id

            NodeApi.GetConnectedNodesResult result =
                    Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).await();
            List<Node> nodes = result.getNodes();

            if (nodes.size() > 0)
            {
                nodeId = nodes.get(0).getId();
            }
            if (nodeId != null)
            {
                Wearable.MessageApi.sendMessage(mGoogleApiClient, nodeId,
                        commandPath, additionalData).setResultCallback(new ResultCallback<MessageApi.SendMessageResult>()
                {
                    @Override
                    public void onResult(MessageApi.SendMessageResult sendMessageResult)
                    {
                        if (!sendMessageResult.getStatus().isSuccess())
                        {
                            System.err.println("Message " + commandPath + " could not be sent.");
                        }
                    }
                });

                System.out.println("Command path is: " + commandPath);
            }
        }
    }).start();
}

Код Android-устройства

public class DataLayerListenerService extends WearableListenerService
{

@Override
public void onMessageReceived(MessageEvent messageEvent)
{
    System.out.println("Received command");
    String command = messageEvent.getPath();
    System.out.println("Received command is: " + command);
    if (command.contains("/mobile/input/"))
    {
        System.out.println(command);
    }
}

@Override
public void onDataChanged(DataEventBuffer dataEvents)
{
    for (DataEvent event : dataEvents)
    {
        if (event.getType() == DataEvent.TYPE_CHANGED)
        {
            DataItem item = event.getDataItem();
            DataMap dataMap = DataMapItem.fromDataItem(item).getDataMap();
            String itemPath = item.getUri().getPath();
            if (itemPath.equals("/mobile/input/level"))
            {
                int level = dataMap.getInt("level");
                MainActivity.readLevel(level);
            }
        }
    }
}
}

person emnes    schedule 10.08.2015    source источник


Ответы (1)


Одна из возможных проблем может заключаться в следующем: вы захватываете все подключенные узлы, а затем захватываете самый первый из них, который будет предназначен для вашего сообщения. Это вполне может оказаться облачным узлом (или другим носимым устройством, если у вас их несколько), а не вашим телефоном. Правильный подход — использовать CapabilityApis, чтобы найти правильный узел для отправки вашего сообщения. В своем коде посмотрите на node.toString() для выбранного вами узла, чтобы убедиться, что он выбирает облако, чтобы убедиться, что это проблема.

person Ali Naddaf    schedule 10.08.2015
comment
Ах, я ошибочно предположил, что телефон — это единственное, что может быть подключенным узлом (на самом деле, это было предложено в учебнике). Надеюсь, это может помочь другим с этой проблемой. Не могли бы вы точно объяснить, что такое облачный узел? Это GoogleApi? Для справки: я распечатал nodeId.toString() и действительно это было облако. Распечатал все узлы, и мой телефон оказался вторым. Я реализовал CapabilityApi, следуя учебнику Android, и он работает! Спасибо!! - person emnes; 11.08.2015
comment
Не могли бы вы указать мне на учебник, который дал неправильное предложение? Если это наши официальные уроки, я могу их исправить, спасибо. - person Ali Naddaf; 11.08.2015
comment
руководство по Toastdroid. Это не официальный Android. - person emnes; 12.08.2015
comment
Кроме того, у меня есть еще один вопрос относительно WearableListenerService, который вы сказали здесь что WearableListenerService не является долговечным сервисом, но в этом Руководство по Android в разделе «С активностью слушателя» подразумевает иное? - person emnes; 12.08.2015
comment
Где в этом документе говорится о том, что WearableListenerService является долговременной службой? - person Ali Naddaf; 12.08.2015
comment
Что ж, в документе говорится о WearableListenerService, а затем упоминается альтернатива (с использованием прослушивателей) и говорится, что ваше приложение заботится только о событиях уровня данных, когда пользователь взаимодействует с приложением, и ему не нужна долгосрочная служба чтобы обрабатывать каждое изменение данных, вы можете прослушивать события... это означает, что предыдущий метод (WearableListenerService) является долговременной службой? - person emnes; 13.08.2015
comment
Нет, это не так, и на самом деле, как я упоминал ранее, WearbleListenerService (или любой другой сервис, который запускается через привязку, а не через startService()) будет недолговечным; вы можете легко это попробовать; реализуйте onDestroy() и onCreated() в ваш WearableListernService и поместите туда оператор журнала, а затем отправьте сообщение; вы увидите, что вызывается onCreate(), а затем вскоре после обработки сообщения будет вызываться onDestroy(). - person Ali Naddaf; 13.08.2015
comment
Только что попробовал, и да, теперь я понимаю, что вы имеете в виду. Замечательно! Было бы неплохо, если бы в документе это было указано явно, я считаю, что это сбивает с толку и неясно. - person emnes; 14.08.2015
comment
В документации указано, что служба запускается, когда фреймворк связывает запрос с вашей реализацией службы, и когда служба запускается таким образом, как правило, она работает до тех пор, пока не будет выполнена (четко указано в разделе разработки в Службах). Я посмотрю, смогу ли я добавить туда комментарий, чтобы прояснить это и для WearableServiceListener. - person Ali Naddaf; 14.08.2015