Пожалуйста, опишите ошибку

Нашли баг? Помогите нам его исправить, заполнив эту форму

Android Wear: основы разработки

Владислав Герасименко
Android-разработчик

Android Wear — версия операционной системы Android, которая появилась не так давно — в марте 2014 года и с каждым днем становится все более популярней. Судя по темпам развития данного направления спрос на приложения под наручные девайсы в скором будущем будет еще больше. А пока мобильным разработчикам стоит задуматься о изучении этого направления. В данной статье я расскажу об особенностях «умных часов» и основах разработки под Android Wear. Возможно, моя статья будет интересная и для разработчиков под платформу Apple Watch.

android-wear-copy-7

Прошло уже больше двух лет, и за этот период она очень изменилась и продолжает развиваться. Большое количество девайсов уже имеется на рынке на базе этой платформы. Буквально полтора года назад существовало крайне мало приложений под эту платформу. Но уже сейчас их количество выросло в десятки раз. Приложения становятся все более востребованными на рынке.

Особенности

Теперь перейдем к особенностям «умных часов», благодаря которым они становятся популярнее:

  1. Непосредственная связь со смартфоном.
    Связь осуществляется по Bluetooth сопряжению, доступно управление смартфоном и получение уведомлений прямо на экран часов.
  2. Различные датчики движения и GPS.
    Это дает возможность создавать очень популярные фитнесс приложения, создавать приложения для просмотра карт, особенно на новых мощных устройствах.
  3. Голосовые датчики.
    Эта особенность дает возможность пользоваться такими сервисами как «OK Google» не прибегая к помощи смартфона.
  4. Совместимость с Android и IOS устройствами.
    Часы Android Wear работают с телефонами на базе Android 4.3, iOS 8.2 или более поздних версий. Это говорит о том, что моя статья возможно все-таки и будет интересна IOS разработчикам.

Процесс разработки

Поговорим о самом интересном — о разработке. Многие думают, что разработка под Android Wear мало чем отчитается от разработки обычного Android приложения. И это правда. Но существует несколько нюансов:

  1. На самом раннем этапе необходимо определить, будет ли приложение работать в гордом одиночестве на часах (что редко), или же будет работать во взаимодействии с приложением на смартфон. Это условие определяет суть дальнейшей разработки.
  2. Существует проблема с подключением некоторых часов к PC. Если говорить об IDE Android Studio, то тестировать приложения на некоторых устаревших устройствах (например, таких как мои любимые «умные часы» Sony smart watch 2) не получится, так как Android Studio будет компилировать только через USB или Bluetooth с напрямую подключенными часами (не через смартфон). Проблема в том, что Smart Watch 2 подключаются к PC только для зарядки. Поэтому, прочитав на официальном сайте SONY статью о разработке под sw2 я попробовал писать под них на «старой не доброй» Eclipse. Однако последние версии девайсов не вызовут проблем с подключением и на Android Studio.
  3. Эмулятор не «комильфо».
    Иметь реальное устройство для запуска разрабатываемого приложения на Android Wear гораздо важнее чем при разработке обычного Android приложения под смартфон. Это очень важно, потому что тестировать работу системы «смартфон-часы» с Bluetooth сопряжением на эмуляторе- это чревато пропусканием множества багов при разработке. А это обязательно «всплывет» на реальном устройстве.
  4. Нельзя забывать о том, что Android Wear устройства могут иметь не только различную диагональ экрана, но и различную форму- квадратную и круглую. Это стоит учитывать при составлении дизайна и верстке приложения, так как писать придется под обе формы.
  5. При отладке чаще всего придется запускать сразу два приложения (смартфон, часы). При отладке на двух эмуляторах использовать инструмент adb (Android Debug Bridge) получиться только если запускать один из эмуляторов, например, через Genymotion. Но будет лучше, если иметь хотя-бы одно реальное устройство. Подробнее о подключении двух устройств/эмуляторов через adb расскажу далее.

Создание проекта и его структура

Процесс создания проекта Android Wear мало чем отличается от процесса создания обычного Android приложения. Для наилучшей демонстрации связи между часами и смартфоном создадим проект, который будет включать приложения как и на смартфон, так и на часы.

При создании проекта, помимо атрибутов phone и tablet выбираем атрибут wear и минимальную версию SDK. Версии SDK Android Wear развивались почти параллельно SDK Android:

5

Далее выбираем тип шаблона для начального activity смартфона и его имя. В общем, все как обычно:

artboard

Теперь все тоже самое для Wear:

1

Тут стоит выделить вид Wear Face — который представляет из себя шаблон для создания циферблатов. Работает на уровне SDK 21 и выше.

После создания проекта его структура будет разделена на два пакета — mobile и wear. В разделе gradle будут располагаться файлы, относящийся как к mobile, так и к Wear. Таким образом создаться очень удобная структура для создания Android Wear проектов.

Подготовка к запуску

Для запуска созданных приложений необходимо иметь два подключенных между собой устройства/эмулятора. Если иметь два реальных устройства, то без проблем можно подключить их непосредственно через Bluetooth. В противном случае придется использовать инструмент командной строки adb (Android Debug Bridge). Данная утилита по умолчанию находится в папке platform-tools в директории SDK. Перед соединением смартфона с часами необходимо убедится что они есть в списке доступных устройств. Для этого в командной строке запустим adb и выполним команду:

adb devices

Появится список запущенных устройств/эмуляторов:

6

Как видим из примера, для отладки готовы два элемента — смартфон и эмулятор. Далее, убедившись в наличии необходимых элементов, выполним команду:

adb forvard tcp:5601 tcp:5601

Теперь можно приступать к соединению смартфона с часами. Включим на смартфоне и на часах отладку через USB в настройках. Скачаем официальное приложение Android Wear на смартфон. Запустим его и выберем меню «Подключить Эмулятор»:

3 4

После этого смартфон должен подключиться к часам и можно начинать запускать приложения.

Round and Square Wear

Для удобной работы разными формами экранов часов создан очень удобный виджет WatchViewStub, который может выбирать нужный файл разметки в зависимости от формы экрана устройства. В ресурсах, на одну активность будет храниться три файла разметки. Первый содержит в себе разметку для квадратной формы. Второй — для круглой. А третий содержит сам виджет code>WatchViewStub. Для доступа к элементам разметки из кода можно использовать конструкцию:


final WatchViewStub stub = (WatchViewStub) findViewById(R.id.watch_view_stub);
stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {
    @Override
    public void onLayoutInflated(WatchViewStub stub) {
        mTextView = (TextView) stub.findViewById(R.id.text);
    }
});

Обмен данными

Для обмена информации между смартфоном и часами используется инструмент Wearable Data Layer APIs, который включает себя несколько различных объектов, которые система может отправлять одному или другому устройству:

  1. Data Items.
    Этот класс служит для синхронизации данных между устройствами. Его использование необходимо, когда на смартфоне и на часах должна храниться одинаковая информация. Изменение информации на одном устройстве вызовет необходимость изменения информации на другом.
  2. Messages.
    Этот тип используется, когда нужно передать какую-то единичную информацию или команду. Например, команду на открытие активности часов или переключение трека в музыкальном плеере.
  3. Asset.
    Чаще всего используется для отправки картинок.

Подробнее о Wearable Data Layer APIs можно узнать в официальной Android статье.

В моей статье я бы хотел кратко описать реализацию отправки Message объекта. Допустим, нам необходимо отправить сообщение от смартфона на часы с текстом и вывести в log часов этот текст. Для начала создадим GoogleApiClient и опишем Callback методы и добавим в него WearableAPI, необходимый для обмена информации с часами:


GoogleApiClient  googleApiClient = new GoogleApiClient.Builder(this)
                .addApi(Wearable.API)             
                .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
                    @Override
                    public void onConnected(Bundle connectionHint) {
                        Log.d(TAG, "onConnected");
                    }
                    @Override
                    public void onConnectionSuspended(int cause) {
                        Log.d(TAG, "onConnectionSuspended: ");
                    }
                })
                .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
                    @Override
                    public void onConnectionFailed(ConnectionResult result) {
                        Log.d(TAG, "onConnectionFailed: " + result);
                    }
                })
                .build();

Методы onConnected и onConnectionFailed срабатывают на успешные и неуспешные подключения соответственно. Но onConnectionSuspended срабатывает, если подключенние временно недоступно. В этом случае GoogleApiClient автоматически выполняет запрос на подключение. Теперь вызовем метод connect() когда нам это необходимо:

googleApiClient.connect();

Для получения всех узлов, которые доступны после подключения к API можно воспользоваться следующей конструкцией:

private HashSet<Node> getNodes() {
    HashSet <Node>results = new HashSet<Node>();
    NodeApi.GetConnectedNodesResult nodes =
            Wearable.NodeApi.getConnectedNodes(googleApiClient).await();
    for (Node node : nodes) {
        results.add(node);
    }
    return results;
}

Для отправки сообщения воспользуемся MessageAPI, о котором говорилось ранее. В параметрах метода sendMessage отправляем созданный нами GoogleAPI клиент, узел,message path и сообщение в виде массива байтов. Message path представляет собой строку, которая поможет отличить этот вид сообщения от другого. Например, если нам нужно открыть активити на часах, мы можем отправить «/start_activity». В нашем случае отправим, например, «/log». Так же закрепляем callback, для обработки результата отправки:

private String MESSAGE_PATH_LOG="/log";
private void sendMessage(String message) {

    if ( googleApiClient.isConnected()) {
        Wearable.MessageApi.sendMessage(
                googleApiClient, node.getId(), MESSAGE_PATH_LOG, message.getBytes()).setResultCallback(
                new ResultCallback<MessageApi.SendMessageResult>() {
                    @Override
                    public void onResult(MessageApi.SendMessageResult sendMessageResult) {
                        if (!sendMessageResult.getStatus().isSuccess()) {
                            Log.e(TAG, "Failed to send message ");
                        }
                        else {  Log.e(TAG, "Success to send message ");}
                    }
                }
        );
      }
 }

Теперь приступим к написанию кода на стороне часов. Для перехватывания отправленного сообщения необходимо создать сервис и описать его в AndroidManifest:

&ltservice android:name=". WearCallListenerService "&gt
    &ltintent-filter&gt
        &ltaction android:name="com.google.android.gms.wearable.MESSAGE_RECEIVED" /&gt
    &lt/intent-filter&gt
&lt/service&gt

Теперь при получении сообщения, в зависимости от message path, выполним какое либо действие. В нашем слуае — это запись в log сообщения.

WearCallListenerService.java:

public class WearCallListenerService extends WearableListenerService {
    private String MESSAGE_PATH_LOG="/log";
    @Override
    public void onMessageReceived(MessageEvent messageEvent) {
        try {
            if (messageEvent.getPath().equalsIgnoreCase(MESSAGE_PATH_LOG)) {
                String message = new String(messageEvent.getData(), "UTF-8");
                Log.d("received message: ", message);
            } else {
                super.onMessageReceived(messageEvent);
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}

Таким образом можно реализовать обмен сообщениями между смартфоном и часами. Описанный способ должен работать при отправке информации в обе стороны. Пользуясь MessageAPI можно разработать множество интересных приложений для Android Wear даже не прибегая к синхронизации (Data Items).

Заключение

На мой взгляд, разработка Android Wear приложений не должна ускользнуть от внимания любого Android разработчика. Операционная система и носимые устройства развивается очень быстро. Умные часы становятся более мощными и совершенными. Android Wear позволяет взглянуть на разработку мобильных приложений с другого ракурса, ведь «умные часы» дают простор для размышления, позволяют творческому разработчику создавать оригинальные приложения, облегчающие жизнь пользователей по всему миру.

Читать и комментировать
Что нового в C#7?

Андрей Гришин

22 сентября 2017

Что нового в C#7?

HERE maps для Android: обзор технологии

Владислав Герасименко

10 апреля 2017

HERE maps для Android: обзор технологии

Почему я решил стать руководителем проектов
Расширения для Visual Studio Code

Александр Хисматулин

24 октября 2017

Расширения для Visual Studio Code

Краснодар

Коммунаров, 268,
3 эт, офисы 705, 707

+7 (861) 200 27 34

Хьюстон

3523 Brinton trails Ln Katy

+1 833 933 0204

Москва

+7 (495) 145-01-05