Как я диплом писал/приложение создавал/на Google Play выкладывал

Пожалуй, начну сначала. Шел далекий 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$ за аккаунт и много личного времени, но изначально не было цели заработать. Скорее, я рассматриваю это как хобби, хотя бы потому, что занимаюсь им в свободное от работы время. И потому, что оно приносит удовольствие.
Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 22

    0
    Отрадно, когда дипломный проект не на громкую и инновационную тему, а даже реализован в завешенный проект который принес вам горсть экспиренса. А почему выбор пал на WPF? Это же имхо оковы винды и прочие страдания…
      0
      Выбирал между WinForms, WPF и Java Swing. Предыдущий опыт работы со Swing был печальным. Насчет других вариантов я был/есть не в курсе. А WPF очень гибок, с возможностями настроить любой элемент на форме на сколько фантазии хватит (при должном умении). XAML сначала отпугнул, но пары туториалов хватило на то, чтобы создать что-то похожее на мою идею.
      0
      Кстати хотел бы поддержать автора в том смысле, что лучший способ изучения новой технологии — это решение какой-либо задачи, которая нужна лично тебе, и ты готов трах.. тратить много времени на то, чтобы все работало «как надо». В конце концов часто выясняется что оно было не очень-то и нужно, и даже находится лучшее решение уже кем-либо сделанное, но опыт и знания-то уже с вами, и никуда не пропадут.
        0
        А разве на Blackberry Z30 с ее BB OS 10 вшит не Android runtime 4.3?
          0
          Да, верно, 4.3 начиная с версии BB 10.3, это я немного запутался. Исправил.
            0
            А в BB World не думали выложить приложение?
              0
              Изначально вообще думал над тем, чтобы сделать клиента специально для BlackBerry, но потом посчитал, что нецелесообразно.
              И да, сейчас думаю над тем, чтобы выложить там.
        • UFO just landed and posted this here
            0
            КФ МГТУ им. Н.Э.,
            Тема звучала как «Разработка мобильного приложения для удаленного управления домашним медиацентром».
            С бюрократией проблем не возникло, а какие могут быть проблемы?
            • UFO just landed and posted this here
            +1
            Я очень извиняюсь за незнание деталей российского образования, но… 6 курс? Разработка описанного приложения на Android? Вы меня простите, но у нас в университете в маленькой прибалтийской стране точно такими же делами занимаются второкурсники, тоже с дипломной работой.
              0
              Тоже возник аналогичный вопрос. У нас на 6м курсе (магистратура) такие темы для диссертации отметают. Мне пришлось для нужд биоинформатики разрабатывать средства распределённых вычислений на кластерах и во всё это завернуть новые научные методы анализа аминокислот.
                0
                Вообще говоря, работа не магистерская, и я не магистр, а специалист.
                Возможно в этом отличие уровня квалификационных работ.
                А может в том, что в разных ВУЗах разные преподаватели, которые совершенно по-разному смотрят на процесс образования.
                А может просто группа была раздолбайская и моя тема была на уровне в пределах контекста ВУЗа.
                +1
                Блин ребята это всего-лишь дипломная/магистерская работа. Кому это нужно? Хотите показать свой уровень — пишите статьи, публикуйтесь в международных журналах, выступите на европейских конференциях, ваш уровень оценят авторитетные специалисты вашей области, а не несколько непонятных преподавателей, которые вполне могли отлучиться в туалет во время вашей защиты.
                  0
                  Ну в этой сфере не всё так плохо. Дипломные работы можно делать в IT компании, а в хорошей магистратуре можно участвовать в грантах совместно с научным руководителем, выступать на тематических конференциях. Это всё есть и практикуется. Публикации тоже помогают подготовить, даже для ВАК. За наличие статей ВУЗ хорошо доплачивает в виде повышенной стипендии.
                  • UFO just landed and posted this here
                      +1
                      Хороших магистратур можно по пальцам пересчитать, а хороших и адекватных преподавателей, понимающих современные тренды можно пересчитать на кнопках игровой мыши. Стоит ли говорить, что конкурс в такие магистратуры и к таким преподавателям, такой, что проще уехать в США и учиться там, чем за гранты в 10 тысяч рублей сидеть тут?
                        0
                        Гранты не 10 тысяч и не 100. Там довольно большие суммы, но доля зависит от степени вовлечённости в проект. Сам я после обучения вернулся в корпоративную среду, т.к. по мне сфера более динамичная и интересная. Проекты по грантам длятся годами и работа может быть однообразной. Но это с чем я столкнулся. Наверняка по стране всякое встречается.
                  0
                  По поводу того, что apache httpComponents стали legacy, я как раз недавно писал (хотя это произошло значительно до 2015 года). Возможно, вам будет полезно.
                    0
                    Спасибо! После прочтения статьи сложилось впечатление, что right way это использовать как раз перепакованную apache.http.
                    Попробовал. Замеров не делал, но на первый взгляд даже стало быстрее.
                    0
                    Был бы очень признателен за исходники ^_^
                    Естественно, могу подписать всякие бумажки о неразглашении и прочем
                      0
                      В планах (не в самых ближайших, конечно) выложить все части проекта на GitHub.
                      Но пока не готов.
                      Если вас интересует что-то конкретное — с удовольствием поделюсь описанием что к чему и кусками кода.

                    Only users with full accounts can post comments. Log in, please.