Программирование под Samsung BadaOS глазами “чайника”

image

Здравствуйте!

Хочу поделиться с Вами опытом написания приложения для телефона Samsung Wave 525. Как выглядит процесс разработки глазами не специалиста в данной области. И на сколько просто и быстро освоить технологию дилетанту.

Все началось с того, что в один прекрасный день мой старенький телефон нокия окончательно приказал долго жить, и стал вопрос о покупке нового аппарата. Анроидфоны и продукция эппла в бюджет увы не вписывались. Хотелось чего-то более-менее современного и недорого. После непродолжительного поиска, наткнулся на самсунги. Вроде недорого, выглядит ничего, да и по характеристикам неплохо. А если выделить чуть больше денег чем планировал c самого начала, то можно взять вот тот с емкостным дисплеем, вайфаем, GPS и какой-то своей операционкой с дивным названием Бада.

И вот доставка привезла Samsung Wave 525. Первое впечатление очень хорошее. После простенькой нокии — шикарный аппарат. Достаточно быстрый, камера, фейсбуки — ютубы — твиттеры разные. Но аппетит приходит всегда во время еды и следующим шагом было изучение магазина приложений Samsung Apps. Вот здесь как раз и ждало разочарование: программ мало, среди имеющихся приложений много ненужного и бесполезного софта, вроде путеводителя по Дели и лучших футболистов Индии. Оказалось что Бада бывает трех версий, на моем телефоне установлена версия 1.1. И ввиду того, что телефон позиционируется как бюджетный, полезных приложений для этой версии почти нет.

А в плане полезности, у меня большой интерес вызвал GPS функционал аппарата. В этом поприще телефон предлагает навигатор Route 66 с картой Украины, карты Google Maps и стандартную утилиту, отображающую GPS информацию. Все это хорошо, но для меня интереснее всего был сервис Google Altitude. Дело в том что я люблю ездить на велосипеде достаточно длинные маршруты в одиночку. И в плане безопасности неплохо было, чтобы дома знали где я в данный момент. Вот только страница алтитуда сказала извините, но ваш телефон не поддерживается.

Да, и насчет холодного старта GPS — для того что-бы поймать спутники потребовалось 1.5 часа на открытой местности.

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

Первым шагом было найти, скачать и разобраться с тем самым SDK. Нашлось оно на developer.bada.com. После регистрации и принятия четырех соглашений, мне любезно предоставили ссылку на скачку. Bada IDE, к большому сожалению, работает только под Windows, хоть и основан на кроссплатформенном Eclipse. Скорее всего дело в драйверах под телефон. Процесс установки описывать не буду, скажу только что для эмуляции Bada 1.1 телефона, при установке нужно дополнительно отметить галочкой модель WaveWQ_LP1. Далее ставим драйвера для телефона, находятся в папке Tools, переписываем и устанавливаем на телефон сертификаты, которые разрешат ему запускать наше приложение. Сертификаты находятся в папке Tools\sbuild. Осталось только подключить телефон в режиме отладки и можно окунуться в процесс вспоминания полузабытого с++.

Следует отметить, что каждый шаг сопровождался обильным гуглением материала. Еще мне как новичку в данной области очень помогли примеры и готовые сэмплы, которые идут вместе с SDK. Без их подсказок написать что-то “специалисту смежных областей” достаточно сложно. PDF туториалы с сайта и SDK несут мало полезной информации.

Для себя отметил, что когда я начинаю разбираться с какой-то новой для меня платформой, то основной опорной точкой является понимание взаимодействия внутренней структуры программы с интерфейсом. Чем доступней и обширней описано в примерах и туториалах создание интерфейса, и его привязка к “логике”, тем быстрее осваивается технология. К чести Самсунга нужно сказать, что особо много времени не понадобилось, хотя в разных примерах методика разная, и это немного дезориентирует. Работа с GPS и сообщениями тоже неплохо документирована. Подробно описывать ее не буду, остановлюсь на “недокументированных невозможностях”, об которых пришлось споткнутся.

Первые грабли
Начнем с классов пространства имен Locations. Они работают с GPS и предлагают много интересных плюшек. Например сохранение координат на неком бада сервере, сохранение целого трека на том-же сервере. Еще имеются классы для организации локальной и удаленной коллекции мест (landmark). Все это богатство по началу очень меня обрадовало. Вот только информацию о этом самом бада сервере я так и не нашел. Что за сервер, и как залогиниться? Как подписаться на услугу треккинга? Как посмотреть свой трек или другого пользователя? В меру моего скромного понимания, эти функции, описанные в API, или еще не реализованы или не до конца отлажены. Вобщем, кроме стандартных примеров где они как-бы работают ничего больше не нашел, а мой вопрос на ask.badadev.com до сих пор без ответа. От идеи использования API-шного функционала пришлось отказаться и писать свой.

По мере написания приложения шли его полевые испытания. Первый сюрприз был приятным: с холодного старта GPS поднялся за 3 минуты. Это меня очень обрадовало, и я начал подозревать о кривизне родного софта. А вот следующую неожиданность назвать приятной крайне тяжело. Дело в том, что точки координат записывались только тогда, когда телефон был в активном режиме. Отладка показала: LocationManager, ответственный за чтение координат, в спящем режиме (выключенный экран) не вызывает метод OnLocationUpdate. В эмуляторе все работает, трек пишется и с выключенным экраном. На реальном телефоне — нет. Гугление и чтение мануалов не дали никакой информации. В справке к API о sleep mode есть только одно упоминание, что при переходе в него лучше выключать GPS, для того чтобы батарея меньше разряжалась. Мало того, при входящем звонке, приложение просто закрывалось. Так и не поборов эту неприятность, стал сам останавливать опрос GPS при переходе приложения в бэкграунд и вылеты во время звонка прекратились. Осталось только сделать кнопку “Always ON”, которая через PowerManager::KeepScreenOnState(true,true) держала бы дисплей всегда включенным но снижала бы его яркость в целях экономии батареи.

После всех экспериментов и опытов вырисовалась общая схема работы приложения: класс LocationProvider раз в n секунд опрашивает GPS и через интерфейс ILocationListener вызывает события OnLocationUpdated и OnProviderStateChanged. Если координаты есть и состояние данного интерфейса LOC_PROVIDER_AVAILABLE то раз в m минут записывается точка во временный файл. По команде меню, информация из временного файла переформатируется в KML и отправляется с помощью IEmailListener по электронной почте. Возможно просто послать текущие координаты СМС-кой через ISmsListener. Номер телефона для СМС, адрес почты, значения интервалов обновления GPS n и записи точек трека m читаются из файла настроек и задаются через форму. PowerManager управляет дисплеем.

Samsung Apps и новые грабли
Пару дней отладки и приложение успешно работает, можно попробовать его опубликовать на Samsung Apps. Для этого нужно зарегистрировать его на Bada Developer, там же создать файл манифеста, в котором указать название приложения, модель телефона и версию API, а также указать привилегии, дающие программе доступ к разным функциям телефона. Потом зарегистрироваться еще в одном сервисе Samsung Seller Office. Именно там загружается приложение и проходит его тестирование Самсунгом.

По правде сказать, верификацию я еще не прошел, споткнулся об очередные грабли. Дело в привилегиях. Моя программа требует три привилегии: LOCATION — для работы с функциями местоположения, MESSAGING — для работы с почтой и СМС и SYSTEM_SERVICE — для работы с питанием экрана. В форме генерации файла манифеста привилегии MESSAGING просто нет, вместо нее MESSAGING_SERVICE. Вроде бы то-же самое, но вызывает конфликт привилегий. А правленый файл манифеста с привилегией MESSAGING Самсунг не принимает, так как он не соответствует генерированному на сайте. Ответа на вопрос как разрешить данный кофликт, от службы поддержки, на момент написания статьи нет.

Заключение

Цель данной статьи — подвести итоги эксперимента, дающего ответ на вопрос может ли обычный (ну почти обычный) пользователь сделать сам себе нужное ПО. И за исключением нескольких важных мелочей, эксперимент можна признать удачным. Также хотелось показать программирование под бада глазами “чайника”. Заодно и спросить совета у бывалых бада строителей. Может кто-то знает о бада-сервере, спящем режиме и как бороться с привилегиями.


0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.