Привет, читатель. Не знаю как ты, а я ну очень ленивый. И я не люблю вновь и вновь повторять какие-то стандартные действия, если можно написать скрипт. В Android для этого можно использовать визуальный инструмент автоматизации Tasker и среду исполнения скриптов SL4A, которые, работая в паре, позволяют сделать смартфон по-настоящему умным девайсом.

 

Tasker

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

Что ты обычно делаешь при включении громкой связи? Правильно, кладешь телефон на стол. А что, если громкая связь включится сама, когда ты положишь телефон экраном вниз во время разговора? Удобно? Так вот, Tasker позволяет реализовать такое поведение буквально за минуту. Также можно настроить автоматический запуск плеера при подключении наушников, автоматическую отправку SMS, когда доезжаешь до дома, или переключение музыки в плеере встряхиванием телефона. С помощью Tasker все это достижимо в несколько тапов по экрану.

Приложение это платное и стоит 3,49 фунта стерлингов (примерно пять долларов), но прежде чем покупать, можно ознакомиться с программой, скачав trial-версию на семь дней с сайта разработчика tasker.dinglisch.net. Недели будет вполне достаточно: например, лично я без сомнений купил программу всего через два дня использования и уверен, что ты поступишь также. Кстати, учти, что версия с Play Market не имеет функции шифрования из-за ограничений законов США.

 

Основные понятия

Итак, рассмотрим интерфейс и основные понятия программы. Для начала сменим язык приложения на русский (Меню -> Preferences -> Language) (это делать не обязательно, если основным языком системы выбран русский. — Прим. ред.). Теперь вернемся на главный экран. Он поделен на три раздела: «Profiles», «Tasks» и «Scenes» (скриншот 1).

Скриншот 1: главное окно Tasker
Скриншот 1: главное окно Tasker

В разделе «Profiles» отображаются, как понятно из его названия, пользовательские профили.Профиль — это один или несколько Контекстов и привязанная к ним Задача, где контекст— это некоторое условие, такое как, например, переворот телефона экраном вниз, включение GPS или проседание заряда батареи до определенного уровня. Если все контексты профиля становятся активными, то активизируется сам профиль и начинает выполняться Начальная задача профиля. Если хоть один из контекстов профиля становится неактивен, профиль дезактивируется и выполняется Конечная задача.

Например, для профиля с одним контекстом «Телефон лежит экраном вниз» начальная задача выполнится после того, как устройство приобретет нужную позицию (то есть экраном вниз), а конечная — когда оно покинет эту позицию. Задача — это одно или целая цепочка Действий, где действие — это какая-то элементарная операция. Разработчики предоставили нам очень много действий, начиная от вывода сообщений на экран и заканчивая файловыми операциями. Наличие и их последовательность в задаче определяем мы. Действия можно поделить на настройки и собственно действия. Настройки отличаются от действий тем, что они возобновляют прежнее состояние после дезактивации контекста. Например, звонок по определенному номеру является действием, а включение громкой связи — настройкой. В приложении их можно отличить по пиктограмме: молния — это действие, шестеренка — настройка.

 

Создаем профиль

Вооружившись знаниями, попробуем создать наш первый профиль: автоматическое включение громкой связи в том случае, если телефон переворачивают экраном вниз. Для создания нового профиля нажимаем кнопку «+» внизу по центру экрана. Появится окошко с приглашением к вводу имени профиля. Имя указывать не обязательно, но рекомендуется, дабы в будущем не запутаться среди профилей (я ввел «Громкая связь»). Далее ты увидишь меню выбора типа первого контекста (скриншот 2). Рассмотрим все типы подробнее:

  • Приложение. Этот тип контекста активен тогда, когда запущено некоторое приложение, и дезактивируется, если приложение закрыть. После выбора этого пункта загружается список установленных приложений, из которых можно выбрать как одно, так и несколько.
  • Время. Здесь можно выбрать время активности контекста, тогда контекст будет активен в течение выбранного промежутка времени. Также можно установить повторение, тогда контекст будет активизироваться на короткий промежуток, повторяясь через указанное время.
  • День. Можно выбрать день месяца или недели, когда контекст активен. Тут все просто.
  • Место. Очень полезный и интересный контекст, активизируется тогда, когда устройство оказывается в некоем радиусе от указанной точки на карте (см. соответствующую врезку).
  • Состояние и событие. События и их особенности мы рассмотрим в следующем примере. Сейчас же нас интересует пункт «Состояние». Этот тип контекста активен, когда устройство пребывает в конкретном состоянии, например в режиме полета, при активном подключении к Wi-Fi-сети или же в положении экраном вниз, что и надо для нашей задачи (да-да, я еще помню о ней :)).
Скриншот 2: типы контекстов
Скриншот 2: типы контекстов

 

Особенности контекста «Место»

Контекст «Место», как уже упоминалось, активизируется, когда смартфон находится в некотором радиусе от указанной на карте точки. Можно выбрать, использовать ли GPS или же данные от сети, а также нужный радиус, значение которого можно указать от 30 метров до 999 километров. Для относительно большого радиуса в пределах города, где точность данных из сети достаточно высока, лучше не использовать GPS, который жрет батарею совсем не по-детски. Также запомни, что если точность определения положения больше, чем радиус срабатывания, то контекст не активизируется.

Выбираем пункт «Состояние» и видим несколько категорий (скриншот 3). Нам нужна категория «Sensor», а в ней пункт «Ориентация». Далее в выпадающем списке нужно выбрать необходимую ориентацию устройства. В нашем случае следует выбрать «Экраном вниз» и нажать на зеленую галочку. Выскочит меню выбора задачи для заданного контекста. Так как задач у нас пока нет, нажимаем «Новая задача». Вводим название задачи (можно не вводить, но рекомендую) и попадаем в меню редактирования задачи.

Скриншот 3: разделы контекста «Состояние»
Скриншот 3: разделы контекста «Состояние»
 

Создание задач

Как я уже говорил, задачи — это последовательности действий. Чтобы добавить к задаче действие, следует нажать кнопку «плюс» (скриншот 4). Все действия разбиты на несколько категорий, названия которых говорят сами за себя. Для цели, поставленной нами, нужно выбрать пункт «Аудио», затем выбрать настройку «Громкая связь» и в выпадающем списке — «Включить». Галочка «Если» позволяет навесить дополнительные условия на конкретную задачу (если интересно, подробнее тут. Нажимаем зеленую галочку — действие добавлено к задаче. Можно добавить еще несколько действий, но в нашем случае это не требуется, так что еще раз нажимаем зеленую галочку, и только что созданная задача становится начальной задачей профиля. Так как громкая связь является настройкой, то после дезактивации контекста она будет отключена.

Скриншот 4: экран создания задачи
Скриншот 4: экран создания задачи

Теперь наш первый профиль готов, но пока еще малоэффективен; постоянная проверка положения смартфона быстро «выест» батарею. Чтобы обойти эту проблему, добавим к профилю еще один контекст: долгое нажатие на уже существующем контексте, «Добавить -> Состояние -> Телефон». Выбираем контекст «Call», который активен во время звонка. В выпадающем меню можно выбрать тип звонка, выбираем «Any», конкретный номер не указываем. Теперь, когда в профиле два контекста, Tasker выполняет их проверку в порядке увеличения энергоемкости, то есть сначала будет проверен «Call» и, если он неактивен, проверка остановится, что сохранит нам батарею. Профиль готов! Можешь проверить. Позвони, а затем положи телефон экраном вниз, и вуаля — громкая связь включилась, теперь подними — выключилась. Захватывающе, правда?

 

Переключение музыки в плеере встряхиванием телефона

В этом примере я обещал рассказать об особенностях контекста «Событие». Контекст «Событие» активизируется только на короткий промежуток времени, запуская привязанную задачу, и сразу дезактивируется. Поэтому в профиле может быть только один контекст такого типа и у профиля с событием не может быть конечной задачи. Также для профилей с событием настройки не возобновляют своего значения.

Приступим к реализации нашего профиля. Добавляем новый профиль (не забываем дать ему имя) и выбираем для него контекст «Событие». Выбираем категорию событий «Sensor», а затем «Shake». Выставляем нужные нам значения осей, чувствительности и продолжительности. Для этого профиля нам нужно создать новую задачу — создаем! В окне редактирования задачи нажимаем плюс; нам нужна категория «Медиа» и действие «Упр. Медиаплеером». Выбираем нужную команду управления и заканчиваем создание задачи. Добавим еще один контекст к профилю (на этот раз это контекст «Приложение») и выберем из списка наш плеер. Теперь опрос сенсора будет происходить только при включенном плеере. Все, данный профиль готов, можешь проверить.

 

Scripting Level for Android

Я описал лишь основные фичи Tasker. Этих знаний тебе вполне хватит для создания самых простых профилей, но возможности этой замечательной программы этим не ограничиваются. В Tasker встроены средства создания и анализа переменных, можно реализовать условные операторы, циклы и даже создавать UI для запроса данных от пользователя (именно для этого и предназначены «Scenes»). Но и это еще не все, возможности Tasker можно существенно расширить, используя в качестве действий скрипты, созданные с помощью SL4A.

SL4A (Scripting Level for Android) — это среда исполнения (и создания) скриптов для Android на языках Python, JavaScript, Perl, Ruby, Lua, BeanShell и Tcl. В скриптах может быть использован API Android через специальную обвязку вокруг стандартного JSON RPC платформы Android, благодаря чему из скриптов можно вызывать функции телефонии, отправлять SMS, получать данные с GPS, камеры и акселерометров, формировать GUI. Скриптовым языком де-факто для этой платформы считается Python, и мы возьмем на вооружение именно его.

Для начала работы необходимо скачать и установить SL4A и Python. После установки Python запускаем его и нажимаем на кнопку «Install», чтобы скачались все необходимые библиотеки для работы на Android.

Для примера напишем несколько простых скриптов. Можно делать это прямо на устройстве, но можно писать и на обычном компе, а потом скидывать код в каталог SL4A/Scripts на карте памяти. Для создания нового скрипта запускаем SL4A, вызываем меню и нажимаем «Add», в появившемся списке выбираем «Python». Попадаем в окно создания скрипта. В верхнее поле вводим имя, внизу у нас уже написано две строчки кода:

import android
droid = android.Android()

Этот код просто импортирует библиотеку для работы с API и создает объект, с помощью которого API будет нам доступен. Разобрать все функции API или даже их четверть нереально в одной статье, поэтому будем рассматривать необходимые нам функции в процессе создания скриптов (полное описание API есть во встроенной справке SL4A или же здесь. Первой функцией, которую мы рассмотрим, будет makeToast: она просто отображает уведомление. Дописываем две строки к коду:

# Выводим уведомление и сообщение в консоль
droid.makeToast("Hello world!")
print("Hi from Python")

Далее сохраняем скрипт и запускаем его, тапнув по его имени. Появится меню, показанное на скриншоте 5. Первый пункт означает запуск скрипта с консолью, второй — в фоновом режиме.

Скриншот 5: запуск SL4A-скриптов
Скриншот 5: запуск SL4A-скриптов
Скриншот 6: результат работы HelloWorld.py
Скриншот 6: результат работы HelloWorld.py
 

Уровнем выше

Теперь заскриптим что-нибудь поинтересней. Давай попробуем научить смартфон анализировать последнее входящее SMS-сообщение на наличие некоторых команд, выполнять их и выдавать ответ об успешно выполненной операции. Для примера пусть у нас будет всего одна команда play music, после получения которой будет проигран определенный медиафайл.

import android
droid = android.Android()

# Получаем список всех сообщений
msgs = droid.smsGetMessages(False).result
# Нас интересует последнее полученное сообщение
lastmessage = msgs[0]
# Ищем команду в тексте сообщения
if "play music" in lastmessage['body']:
  # Проигрываем указанный файл
  droid.mediaPlay('/sdcard/music/track.mp3')
  # Отправляем ответ об успешном выполнении
  # Первым параметром является номер абонента,
  # вторым — текст сообщения
  droid.smsSend(last.address, "Command complete")

Можно зациклить эту проверку, но гораздо эффективнее получится, если связать выполнение этого скрипта с событием Tasker «Получено текст. сообщ.» из раздела «Телефон».

Рассмотрим более полезный скрипт. Знаю, что у многих (в том числе у меня) есть проблема с отображением кириллических символов в ID3-тегах MP3-файлов. Удобного решения этой проблемы я так и не нашел, поэтому и написал скрипт. Для его работы мне потребовалась сторонняя библиотека Stagger. Кстати, из SL4A можно использовать любые сторонние pure Python библиотеки, просто копируя их в каталог com.googlecode.python.python3forandroid/extras/python3 на карте памяти. Полный код скрипта с подробными комментариями можно найти на прилагаемом к журналу диске, здесь же ограничусь только кодом, который перебирает MP3-файлы на карте памяти:

# Перебираем все MP3-файлы на карте
for(dirName, dirs, files) in os.walk(r'/sdcard'):
  for filename in files:
try:
  if filename.endswith('.mp3'):
pathname = os.path.join(dirName, filename)
# Ну а дальше идет работа с тегами…

Этот скрипт можно запускать вручную, когда потребуется, но я привязал выполнение этого скрипта к событию «Кар. памяти доступна» из раздела «Аппаратура» Tasker.

 

INFO

  • Количество контекстов и действий Tasker можно существенно расширить, используя плагины. Найти их можно, вбив в поиске Маркета «Locale plugin».
  • SL4A — не единственный скриптовый движок для Android. Рекомендую также обратить внимание на Kivy.
  • Если ты пишешь скрипты на компьютере, то тебе не обязательно каждый раз копировать скрипт на устройство. Есть средства удаленного выполнения.
  • Профили, созданные в Tasker, можно упаковывать в APK-пакеты с помощью Tasker App Factory. Аналогичное решение для SL4A.
  • Если функции SL4A возвращают абракадабру, попробуй проделать со строкой такой трюк: .encode(‘cp1251’).decode(‘utf8’).
 

Взаимодействие с пользователем

SL4A предоставляет нам разные способы взаимодействия с пользователем: webViews (HTML5 + JavaScript), fullScreenAPI (подробнее можно почитать в моей статье и dialogAPI, который мы вкратце и рассмотрим. Опять же полный код примера можно увидеть на диске, а здесь только часть, касающаяся dialogAPI. Я не сказал, что за скрипт? Он отправляет выбранные пользователем фотки на FTP-сервер.

# Используем модуль glob для извлечения списка изображений в filesNames
...

# Создаем диалог, указывая его заголовок и текст
droid.dialogCreateAlert("Выбор файлов", "Выберите файлы для отправки")
# Следующей строкой добавляем к диалогу флажки
droid.dialogSetMultiChoiceItems(filesNames)
# А здесь добавляем кнопки
droid.dialogSetPositiveButtonText("OK")
droid.dialogSetNegativeButtonText("Отмена")
# И наконец, показываем диалог
droid.dialogShow()

# Проверяем, какая кнопка была нажата (positive, negative или neutral)
if droid.dialogGetResponse().result['which'] == "positive":
  # Получаем индексы выбранных флажков
  res = droid.dialogGetSelectedItems().result

# Используя ftplib, отправляем файлы на сервер
...
 

Что дальше?

Благодаря Tasker и SL4A возможности автоматизировать пользовательские действия на Android становятся просто безграничными. Сам же SL4A предоставляет мощный потенциал для скриптинга Android. В этой статье я описал лишь самую малость из всех возможностей программ. Остальную информацию ищи по ссылкам, приведенным в боковых выносах, или же жди от меня новых, более специализированных статей.

 

Оставить мнение

Check Also

Энкодеры msfvenom. Разбираемся с кодированием боевой нагрузки при бинарной эксплуатации

Генерация полезной нагрузки — неотъемлемая часть эксплуатации. При использовании модулей M…