Пожалуй, начну сначала. Шел далекий 2015-й, август, я был студентом 6 курса и начал задумываться о своей дипломной работе. После прохождения курса разработки мобильных приложений на 4 курсе, хотелось написать что-то под Android. А еще дома уже как полгода был установлен домашний кинотеатр (проектор, экран и аудиопанель, подключенные к настольному ПК). А управлял я всем этим добром через AIORemote.

Но были пара моментов, которые мне в этой схеме очень не нравились: хотя управление основными элементами управления видеоплеером, который я использую (MPC — HC) присутствовали, чтобы запустить видео или удалить, приходилось переключаться на удаленный тачпад.

В общем, сделать жизнь удобнее чесалось уже давно, а тут появились цель, стимул и возможность.

Началось все с идеи создать приложение для удаленного управления домашним кинотеатром. Поиск по Google Play выявил, что аналоги есть (куча приложений для удаленного управления MPC — HC, а так же универсальные для удаленного управления компьютером). Загвоздка в том, что не было строго определенных нужных мне функции. Значит надо изобрести свой велосипед.

Шаг первый


Для начала набросал эскиз как я вижу главный экран приложения — экран с элементами управления.

Экран управления
Слева — начальный набросок, справа — то, что получилось на текущий день

Параллельно с этим занялся поисками библиотеки, которая облегчит доступ к API видеоплеера. Нашел MPC_API_LIB, написанную то ли испанцем, то ли итальянцем (судя по комментариям в исходном коде).

Просто мобильное приложение может взаимодействовать только с плеером, да и то через WEB-интерфейс (оставил это на крайний случай), поэтому нужна серверная часть. Но на чем писать сервер? Запускать планируется на Windows, поэтому .NET подходит. Или Java? К этому моменту знаний .NET и Java у меня было на одном уровне, и я решил писать на .NET.

Шаг второй


Управление аудиовыходами компьютера. У меня аудиопанель подключена к компьютеру, у компьютера также имеются колонки. И одна из самых раздражительных вещей при начале просмотра кино — переключение звука. Выяснил, что есть утилиты, которые имитируют вызов системного окна с настройками звука. Но еще нашел интересную утилиту DefSound, которая использует системные библиотеки. То, что нужно. Завязываю переключение аудиоустройств в приложении на нее.

Шаг третий


К декабрю 15го создаю первую версию, которая переключает аудио, управляет воспроизведением и другими мультимедийными функциями. Параллельно с этим пишу документацию (так как у меня же диплом) и регистрирую аккаунт разработчика в Google. К этому моменту написан индусский рабочий код.

Разработку немного осложняло то, что у меня нет так такового android-смартфона. Но есть Blackberry Z30. А в нем зашит Android runtime 4.3. Поэтому тесты в реальных условиях были именно на нем.

Шаг четвертый


Думаю о монетизации приложения. Выбираю, как мне теперь кажется, самый неправильный вариант: платная и бесплатная версии. Сервер представляет из себя консольное приложение с настройками через config-файл, все нужно указывать вручную. С самого начала было решено перевести приложение на английский (немного поэксплуатировав супругу-переводчицу).

Провел много времени в раздумьях, как заставить работать ActionBar одинаково на всех устройствах. Наконец, составил стиль на основе библиотеки AppCompat:

<resources>
    <style name="MyTheme" parent="Base.Theme.AppCompat.Light.DarkActionBar">
        <item name="android:actionBarStyle">@style/MyActionBarStyle</item>
        <item name="actionBarStyle">@style/MyActionBarStyle</item>
        <item name="actionMenuTextColor">@color/textColor</item>
    </style>

    <style name="MyActionBarStyle" parent="@android:style/Widget.Holo.Light.ActionBar">
        <item name="android:logo">@mipmap/ic_launcher</item>
        <item name="logo">@mipmap/ic_launcher</item>
        <item name="android:displayOptions">showHome|useLogo</item>
        <item name="displayOptions">showHome|useLogo</item>
    </style>
</resources>

Встраивание рекламы в приложение требует некоторых уступок. Например, я смирился с тем, что вес приложения увеличился в три раза (на данный момент с 2.4МБ до 6.5МБ), а так же с набором разрешений:

без рекламы:


<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />

с рекламой:


<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

Работу с Toast’ами во время разработки так же пришлось переосмыслить, чтобы не накапливалась куча toast’ов, не успевших показаться:

public class SingleToast {

    private static Toast mToast;

    public static void show(Context context, String text) {
        show(context, text, Toast.LENGTH_SHORT);
    }

    public static void show(final Context context, final String text, final int duration) {
        Handler shower = new Handler(Looper.getMainLooper());
        shower.post(new Runnable() {
            @Override
            public void run() {
                if (mToast != null) {
                    mToast.cancel();
                }
                mToast = Toast.makeText(context, text, duration);
                mToast.show();
            }
        });
    }

    public static void hide() {
        if (mToast != null) {
            mToast.cancel();
        }
    }

    public static Toast getToast() {
        return mToast;
    }
}

От сервера ответ приходит в формате JSON, но механизм парсинга на клиенте еще не рафакторился и используются классы из org.json. Хотя подключена библиотека com.fasterxml.jackson и планируется грамотная работа с JSON.

Шаг пятый


В начале лета 16-го, за месяц до сдачи диплома приложение приведено в более-менее презентабельный вид. Внезапно встал вопрос с иконкой. В интернете иконок по похожей тематике полно, но авторские права и всякие лицензии настораживают. Я не художник, но Photoshop’ом иногда пользуюсь. Поэтому и на этом этапе изобретаю велосипед.

Логотип

Мобильному приложению требуется сервер, запущенный на ПК. И его надо как-то распространить. Что ж, нужен сайт.

Шаг шестой


Создаю статичный сайт для хранения и распространения серверной части. Голый HTML + CSS. Публикую приложение в Google play. И вот тут с первой публикацией возникла загвоздка (которая, кстати, до сих пор не решена). Опубликовал сначала бета-версию и попросил друзей потестировать. Потом перевел в релиз. И тут друг говорит, что не может оставить отзыв и оценить приложение.

image

Переписка в техподдержкой плодов не принесла и я видел единственный вариант — опубликовать заново. Благо, вторая публикация успешно прижилась и все заработало. Успел вставить в дипломную презентацию скриншоты со страницы Google play (как позже оказалось — это имело вес при защите). Тем времен иду сдавать диплом…

Наши дни


После сдачи диплома желание развивать проект не уменьшилось (хотя ожидал, что после исчезновения стимула может надоесть). Сайт был переведен на PHP для удобного администрирования. Половину разработки сайта я возложил на плечи супруги, отчего работа над проектом получилась семейной. В приложение постепенно добавлялись новые функции, которые придумывались по мере использования. За год разработки apache.http, который я изначально использовал (и использую по сей день) успел стать legacy. Вышел Android N. Вышла Android Studio 2.

На данный момент переделана серверная часть — переписана на WPF, локализована на английский язык (изначально имелись только английские пояснения в файле настроек).

Статистика


На данный момент закачек более 2к:

Статистика

Активных совсем мало, и проект можно считать провалом. Но я почему-то так не считаю. Было получено много опыта на каждом шаге.

В проект было вложено 25$ за аккаунт и много личного времени, но изначально не было цели заработать. Скорее, я рассматриваю это как хобби, хотя бы потому, что занимаюсь им в свободное от работы время. И потому, что оно приносит удовольствие.
Поделиться с друзьями
-->

Комментарии (22)


  1. shpaker
    31.08.2016 09:40

    Отрадно, когда дипломный проект не на громкую и инновационную тему, а даже реализован в завешенный проект который принес вам горсть экспиренса. А почему выбор пал на WPF? Это же имхо оковы винды и прочие страдания…


    1. TRTHHRTS
      31.08.2016 09:51

      Выбирал между WinForms, WPF и Java Swing. Предыдущий опыт работы со Swing был печальным. Насчет других вариантов я был/есть не в курсе. А WPF очень гибок, с возможностями настроить любой элемент на форме на сколько фантазии хватит (при должном умении). XAML сначала отпугнул, но пары туториалов хватило на то, чтобы создать что-то похожее на мою идею.


  1. sigizmund
    31.08.2016 12:16

    Кстати хотел бы поддержать автора в том смысле, что лучший способ изучения новой технологии — это решение какой-либо задачи, которая нужна лично тебе, и ты готов трах.. тратить много времени на то, чтобы все работало «как надо». В конце концов часто выясняется что оно было не очень-то и нужно, и даже находится лучшее решение уже кем-либо сделанное, но опыт и знания-то уже с вами, и никуда не пропадут.


  1. illi
    31.08.2016 12:19

    А разве на Blackberry Z30 с ее BB OS 10 вшит не Android runtime 4.3?


    1. TRTHHRTS
      31.08.2016 12:37

      Да, верно, 4.3 начиная с версии BB 10.3, это я немного запутался. Исправил.


      1. illi
        31.08.2016 13:17

        А в BB World не думали выложить приложение?


        1. TRTHHRTS
          01.09.2016 23:04

          Изначально вообще думал над тем, чтобы сделать клиента специально для BlackBerry, но потом посчитал, что нецелесообразно.
          И да, сейчас думаю над тем, чтобы выложить там.


  1. deniskreshikhin
    31.08.2016 13:55

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


    А вообще, что за ВУЗ, как полностью тема диплома называлась? Не было ли проблем с бюрократией? Или это где-то не в России?


    1. TRTHHRTS
      31.08.2016 19:14

      КФ МГТУ им. Н.Э.,
      Тема звучала как «Разработка мобильного приложения для удаленного управления домашним медиацентром».
      С бюрократией проблем не возникло, а какие могут быть проблемы?


      1. deniskreshikhin
        31.08.2016 19:29

        Ого, круто. У нас в ВУЗе темы нужно было согласовывать и обычно руководители давали заранее выбранные темы. Либо идти на производство, но там еще хуже темы. Но это было 10 лет назад, может сейчас тоже что изменилось.


  1. alalambda
    31.08.2016 18:54
    +1

    Я очень извиняюсь за незнание деталей российского образования, но… 6 курс? Разработка описанного приложения на Android? Вы меня простите, но у нас в университете в маленькой прибалтийской стране точно такими же делами занимаются второкурсники, тоже с дипломной работой.


    1. SvyatoslavMC
      31.08.2016 20:05

      Тоже возник аналогичный вопрос. У нас на 6м курсе (магистратура) такие темы для диссертации отметают. Мне пришлось для нужд биоинформатики разрабатывать средства распределённых вычислений на кластерах и во всё это завернуть новые научные методы анализа аминокислот.


      1. TRTHHRTS
        31.08.2016 20:39

        Вообще говоря, работа не магистерская, и я не магистр, а специалист.
        Возможно в этом отличие уровня квалификационных работ.
        А может в том, что в разных ВУЗах разные преподаватели, которые совершенно по-разному смотрят на процесс образования.
        А может просто группа была раздолбайская и моя тема была на уровне в пределах контекста ВУЗа.


    1. Mugik
      31.08.2016 20:29
      +1

      Блин ребята это всего-лишь дипломная/магистерская работа. Кому это нужно? Хотите показать свой уровень — пишите статьи, публикуйтесь в международных журналах, выступите на европейских конференциях, ваш уровень оценят авторитетные специалисты вашей области, а не несколько непонятных преподавателей, которые вполне могли отлучиться в туалет во время вашей защиты.


      1. SvyatoslavMC
        31.08.2016 20:50

        Ну в этой сфере не всё так плохо. Дипломные работы можно делать в IT компании, а в хорошей магистратуре можно участвовать в грантах совместно с научным руководителем, выступать на тематических конференциях. Это всё есть и практикуется. Публикации тоже помогают подготовить, даже для ВАК. За наличие статей ВУЗ хорошо доплачивает в виде повышенной стипендии.


        1. deniskreshikhin
          31.08.2016 22:26

          Это все хорошо, если человек нацелен получать ктн или phd, но для тех кто будет работать в индустрии это вообще ничего не дает. Т.к. статьи в соавторстве с разного рода профессорами не котируются совершенно никак. А что бы публиковать самостоятельно нужно иметь что-то серьезное и готовить публикацию годами, терпеть всякие гневные рецензии, переписывать по нескольку раз и все такое.


          А собственное приложение в AppStore поможет пройти собеседование на Swift/Objective-C программиста.


          По мне главная цель нормального адекватного ВУЗа это дать возможность людям после получения диплома найти работу которая быстро покроет затраты на обучения (в т.ч. упущенное время).


          Все-таки учеными люди должны становится по призванию, а не потому что так хочет руководитель или профессор.


        1. Mugik
          01.09.2016 10:57
          +1

          Хороших магистратур можно по пальцам пересчитать, а хороших и адекватных преподавателей, понимающих современные тренды можно пересчитать на кнопках игровой мыши. Стоит ли говорить, что конкурс в такие магистратуры и к таким преподавателям, такой, что проще уехать в США и учиться там, чем за гранты в 10 тысяч рублей сидеть тут?


          1. SvyatoslavMC
            01.09.2016 21:28

            Гранты не 10 тысяч и не 100. Там довольно большие суммы, но доля зависит от степени вовлечённости в проект. Сам я после обучения вернулся в корпоративную среду, т.к. по мне сфера более динамичная и интересная. Проекты по грантам длятся годами и работа может быть однообразной. Но это с чем я столкнулся. Наверняка по стране всякое встречается.


  1. jehy
    31.08.2016 21:06

    По поводу того, что apache httpComponents стали legacy, я как раз недавно писал (хотя это произошло значительно до 2015 года). Возможно, вам будет полезно.


    1. TRTHHRTS
      01.09.2016 22:58

      Спасибо! После прочтения статьи сложилось впечатление, что right way это использовать как раз перепакованную apache.http.
      Попробовал. Замеров не делал, но на первый взгляд даже стало быстрее.


  1. LionZXY
    01.09.2016 07:19

    Был бы очень признателен за исходники ^_^
    Естественно, могу подписать всякие бумажки о неразглашении и прочем


    1. TRTHHRTS
      01.09.2016 23:00

      В планах (не в самых ближайших, конечно) выложить все части проекта на GitHub.
      Но пока не готов.
      Если вас интересует что-то конкретное — с удовольствием поделюсь описанием что к чему и кусками кода.