Tasker - Od první funkce k Android aplikaci (2.část)

V prvním díle jsme naší aplikaci vytvořili jednoduché grafické prostředí a dnes se pustíme do části funkční. Na konci tohoto dílu bude projekt již plně funkční v rámci aplikace Tasker a budete si tak moct vyzkoušet vaše dílo v praxi... :-) Export projektu do souboru APK probereme až v díle posledním...

Zopakujme si, jaké požadavky jsme si na naší aplikaci vymysleli:
  1. jediná obrazovka (scéna)
  2. zobrazit aktuální GPS souřadnice (v závislosti na přesnosti polohy ze sítě i bez použití GPS)
  3. zobrazit aktuální adresu
  4. zobrazit náhled mapy s aktuální polohou, který po kliknutí otevře aplikaci Mapy na aktuální poloze
  5. tlačítko, kterým se aktuální GPS souřadnice zkopírují do schránky
  6. tlačítko, kterým se aktuální adresa zkopíruje do schránky
  7. tlačítko, kterým se aplikace přenese na pozadí a vytvoří v oznamovací liště notifikaci, ve které se budou v daném intervalu pravidelně aktualizovat údaje o aktuální poloze
Pro vytvoření funkční části projektu využijeme zbylé 3 záložky v Taskeru - PROFILES, TASKS, VARIABLES. Stejně, jako jsme v záložce SCENES vytvořili novou scénu tlačítkem + a následně jí pojmenovali, se také vytváří nový profil v záložce PROFILES a nový TASK v záložce TASKS.


Záložka PROFILES

Zde vytváříme profily, což není nic jiného, než určování podmínek, za kterých se má konkrétní profil aktivovat a těmto profilům potom přiřazujeme ENTER TASK (seznam funkcí, který se má provést při aktivaci profilu) a popřípadě EXIT TASK (seznam funkcí, který se má provést při deaktivaci profilu).

Podmínek je v Taskeru k dispozici opravdu velké množství a proto jsou rozděleny podle svého charakteru do několika skupin (APPLICATION, DAY, EVENT, LOCATION, STATE, TIME). Myslím, že není třeba vysvětlovat k čemu jaká skupina slouží, jen dvě z nich bych rád blíže popsal - STATE a EVENT.



Kategorie STATE v sobě obsahuje hromadu jednotlivých podmínek opět rozdělených do kategorií. Důležité ovšem je, že se používají pro definování podmínek, které mají jisté trvání. Jako příklad může posloužit podmínka POWER - ta je splněna ve chvíli, kdy zařízení začnete nabíjet a pomine ve chvíli, kdy nabíjení ukončíte, takže jasně definovaný začátek a konec platnosti podmínky. S tím je také spojen fakt, že profilům, obsahujícím podmínky typu STATE (a neobsahujícím podmínky typu EVENT) lze definovat jak ENTER TASK, tak i EXIT TASK.

Kategorie EVENT vypadá na první pohled velmi podobně, ale je tu jeden velký a zásadní rozdíl - tyto podmínky mají charakter platnosti pouze v daný okamžik. Dobrým příkladem je podmínka TEXT RECIEVED - podmínka platí pouze v okamžik, kdy do zařízení dorazí zpráva (SMS, nebo MMS). Jinak řečeno - ENTER TASK, který je přiřazen profilu s podmínkou typu EVENT, se provede stejně jako v případě podmínky typu STATE, ale už tu není prostor pro EXIT TASK, jelikož okamžik začátku platnosti profilu se prakticky rovná okamžiku konce platnosti profilu. Žádný EXIT TASK  tak logicky není možné v případě podmínky EVENT nastavit.


Záložka TASKS

Zde vytváříme jednotlivé TASKY, které obsahují seznam funkcí. Tyto funkce se provádějí vždy jedna po druhé v pořadí, v jakém jsou v TASKU vytvořeny.

Záložka VARIABLES

Tato záložka obsahuje všechny proměnné, které během tvorby projektu vytvoříte.


Důležité je také vysvětlit si rozdíl mezi globálními a lokálními proměnnými. Nic vám teoreticky nebrání v tom, aby jste v celém projektu používali proměnné globální, ale v dost případech je použití lokálních proměnných daleko výhodnější.

Globální proměnné

Jsou to takové proměnné, v jejichž názvu je alespoň jedno velké písmeno. V rámci projektu je jejich hodnota nastavena globálně - to znamená, že když v jednom TASKu nastavíte globální proměnnou %Promenna , máte pak tuto proměnnou a její hodnotu k dispozici v jakémkoliv jiném TASKu a její hodnota přetrvává dokud není cíleně vymazána, nebo změněna.

Výhodou globálních proměnných je právě možnost reagovat na jejich hodnoty napříč celým projektem a to je vlastně také jejich nevýhoda, protože se vám pak v projektu hromadí a musíte si dobře rozmýšlet kdy je nutné jejich hodnoty mazat atd...

Lokální proměnné

Jsou to takové proměnné, v jejichž názvu jsou pouze malá písmena. V rámci projektu je jejich hodnota nastavena lokálně - to znamená, že když v konkrétním TASKu vytvoříte lokální proměnnou %promennamáte pak tuto proměnnou a její hodnotu k dispozici pouze v rámci běhu toho konkrétního TASKu, kde byla tato proměnná vytvořena. Její hodnota přetrvává pouze dokud v konkrétním TASKu zbývají funkce k provedení, jakmile je seznam funkcí v TASKu kompletně proveden, tato lokální proměnná přestává existovat.

Výhodou lokálních proměnných je to, že se nehromadí v projektu a jejich existence je omezena pouze na konkrétní TASK v projektu.

Systémové proměnné

Jsou všechny globální, mají pevně daný název a jejich hodnoty nelze uživatelsky nikterak měnit. Tyto proměnné jsou základem jakékoliv tvorby v Taskeru, protože jejich hodnoty vyjadřují stav systému. Například systémová proměnná %BATT obsahuje vždy aktuální hodnotu nabití baterie zařízení v procentech. Jejich přehled je velmi přehledně zpracován ve webovém manuálu Taskeru

Tak, to by bylo trochu té teorie. Původně jsem měl v plánu podrobně popsat každou funkci v projektu, ale když jsem projekt dokončil, uvědomil jsem si, že by to zabralo neskutečné množství času a článek bych dokončil někdy na podzim... :-). Udělám to tedy trochu jinak. Nastíním zde nejdůležitější body, poskytnu vám ke stažení celý projekt a vy se potom můžete pod článkem v komentářích postupně ptát na věci, které vám nejsou jasné. Vytvořit a pojmenovat TASK, či profil již jistě zvládnete sami, takže tyto detaily vynechám.


TASK spusteni


V našem projektu se jedná o základní TASK, který bude spouštět aplikaci. To znamená, že až dojdeme do fáze, že náš projekt vyexportujeme do APK souboru a aplikaci nainstalujeme, tento TASK se spustí po kliknutí na ikonu aplikace. Popis jednotlivých funkcí pojmu formou příkazů, které pomocí těchto funkcí Taskeru dáváte...





1. Zruš určenou scénu - touto funkcí doporučuji začínat každý TASK, jehož výsledkem je zobrazení scény. Zajistí, že je scéna ukončena i v případě, že zůstane před tím na pozadí a všechny prvky scény a jejich hodnoty se zobrazí tak, jak mají.

2.-5. Pokud proměnná %TRUN obsahuje text *,zahajit.monitorovani,* , vykonej všechny funkce, dokud nenarazíš na funkci END IF, nebo konec TASKu - je zde použita systémová proměnná %TRUN (Tasks running), která obsahuje čárkami oddělený seznam aktuálně běžících TASKů. Hvězdičky na začátku a na konci jsou zde pro to, že v daný okamžik nevíme, jestli námi dotazovaný TASK bude jediný, který poběží a tudíž jediný, který bude vypsán v proměnné %TRUN - používání pomocných znaků je velmi dobře vysvětleno zde.

3. Zastav určený TASK - pokud je definovaný, ukončí se konkrétní TASK, pokud ne, ukončí se ten, ve kterém je tato funkce provedena.

4. Zruš notifikaci - pokud je definovaný text, který notifikace v nadpisu zobrazuje, ukončí ta konkrétní notifikace, pokud ne, ukončí se všechny, které jsou aktuálně zobrazeny v notifikační liště a byly vytvořeny Taskerem (vygenerovanou aplikací).

6. Vytvoř adresář - vytvoříme si tak při prvním spuštění adresář Kde_Prave_Jsem pro naší aplikaci. Toto je vhodné jen u aplikací, které za běhu shromažďují nějaká data (textové soubory, obrázky, ...), naše aplikace bude "za sebou nechávat" jen jeden obrázek - použil jsem tuto funkci hlavně pro demonstraci. Důležité je při editaci této funkce zaškrtnout volbu "Continue task after error", protože se bude funkce provádět při každém spuštění aplikace - poprvé vytvoří adresář, potom už vyústí v chybu (adresář již existue), která by zastavila průběh TASKu, pokud bychom nepoužili tuto volbu.

7. Získej síťovou polohu - nastaví systémovou proměnnou %LOCN na hodnotu  souřadnic aktuální polohy pomocí sítě. Na rozdíl od volby GPS má okamžitý efekt, logicky je nutné aktivní datové připojení.




8. - 29. Pokud je hodnota proměnné %LOCNACC menší než 151, vykonej všechny funkce, dokud nenarazíš na funkci END IF, nebo konec TASKu - tato systémová proměnná obsahuje číselnou hodnotu udávající přesnost posledního zaměření polohy pomocí sítě v meterech. Jinak řečeno tato podmínka platí v případě, že přesnost polohy, kterou jsme získali ve funkci č.7, je do 150 metrů.

9. Zobraz určenou scénu jako "aktivitu, přes celý displej" 

10. Zjisti aktuální adresu pomocí souřadnic ze sítě - zde využijeme Google API pomocí funkce HTTP GET (manuál zde). Jak už jsem se zmiňoval v prvním díle, Google API nabízí poměrně široké možnosti i jen skrze funkci HTTP GET a napříkald pomocí této URL: maps.google.com/maps/api/geocode/json?latlng=%LOCN&sensor=false  získáme adresu, na které se právě nacházíme, za použití proměnné %LOCN, jejíž hodnota obsahuje požadované souřadnice získané ve funkci č.7. Data, která se nám vrátí z internetu jsou uložena do proměnné %HTTPD. Ve funkci je ještě potřeba určit, jaký druh dat očekáváme - položku Mime Type nastavit na text/xml.

11. Nastav hodnotu proměnné %adresa na "Chyba připojení" , pokud se hodnota proměnné %HTTPR nerovná 200 - v případě, že je pokus o získání dat z internetu neúspěšný, HTTP kód se tak nerovná hodnotě 200 (která naopak značí úspěšný pokus). Tento kód je automaticky ukládán jako hodnota systémové proměnné %HTTPR po použití funkce HTTP GET, nebo HTTP POST. Oštříme si tak případ, kdy se nepodaří úspěšně získat adresu z internetu.

12.-17. Pokud se hodnota proměnné %HTTPR rovná 200, vykonej všechny funkce, dokud nenarazíš na funkci END IF, nebo konec TASKu - podmínka platí v případě úspěšného pokusu o získání adresy z internetu

13. Nastav hodnotu proměnné %adresa na hodnotu proměnné %HTTPD - všechna získaná data pomocí funkce HTTP GET se tak uloží do námi definované lokální proměnné %adresa

14. Rozděl hodnotu proměnné %adresa pomocí určeného textu - nastává čas pro upravení získaného textu - "vypreparování" samotné adresy. Jednoduše řečeno jde o ořezání a rozdělení textu podle toho, jaké znaky obsahuje tak, aby ve výsledných kouscích zbyl jen text, který požadujeme (v našem případě adresa). Podrobné vysvětlení by bylo na samostatný článek, zde si musíte domyslet účel jednotlivých kroků. Výsledkem funkce VARIABLE SPLIT je řada proměnných (%adresa1, %adresa2, %adresa3, ...) a jejich počet se odvíjí od toho, kolikrát se v textu vyskytuje řetězec, pomocí kterého text dělíte (SPLITTER), tudíž od počtu kousků, na které text pomocí SPLITTERu rozdělíte.




15. Rozděl hodnotu proměnné %adresa1 pomocí určeného textu - funkcí č.14 jsme adresu v textu "odřízli" z jedné strany, teď jí "odřízneme" z druhé a výsledkem bude proměnná %adresa21 , která již bude obsahovat čistě jen adresu

16. Nastav hodnotu proměnné %adresa na hodnotu proměnné %adresa21 - toto už je pouze kosmetický krok, kterým docílíme toho, že budeme mít adresu uloženou v proměnné %adresa.

18. Získej statický obrázek aktuální polohy pomocí souřadnic ze sítě - pomocí této URL: maps.googleapis.com/maps/api/staticmap?center=%LOCN&zoom=15&size=400x400&markers=color:blue|%LOCN&sensor=false  získáme opět pomocí Google API statický obrázek naší aktuální polohy za použití proměnné %LOCN, jejíž hodnota obsahuje požadované souřadnice získané ve funkci č.7 . Zde nastavíme pouze položku Output File na Kde_Prave_Jsem/mapa.png

19.-23. Pokud se hodnota proměnné %HTTPR rovná 200, vykonej všechny funkce, dokud nenarazíš na funkci END IF, nebo konec TASKu - pokus o získání statického obrázku aktuální polohy byl úspěšný

20. Ulož do určené proměnné (proměnných) cesty ke všem souborům, které obsahuje adresář Kde_Prave_Jsem - funkce LIST FILES prohledá určený adresář a vytvoří řadu proměnných a jejich počet se bude odvíjet od toho, kolik souborů se v určeném adresáři nachází. Lze také nastavit položku Match, což je jednoduchý filtr, který zajistí, že bude funkce akceptovat pouze soubory, které obsahují daný text. V tomto případě vycházíme ze skutečnosti, že filtru mapa.png bude v daném adresáři odpovídat pouze jeden soubor, takže cesta k uloženému obrázku (funkce č.18) bude uložena v proměnné %mapa1.

21. Nastav hodnotu proměnné %mapa na hodnotu proměnné %mapa1 - toto už je pouze kosmetický krok, kterým docílíme toho, že budeme mít cestu k obrázku uloženou v proměnné %mapa.

22. Nastav hodnotu proměnné %MAPA_SOURADNICE na hodnotu proměnné %LOCN - uložíme si souřadnice do globální proměnné, protože budeme potřebovat tuto hodnotu později při nastavování TASKu, který se má provést při kliknutí na obrázek mapy ve scéně.




24. Pokud hodnota proměnné %adresa neobsahuje text Chyba připojení, nastav text prvku Text.hlavni.gps ve scéně Hlavni na hodnotu proměnné %LOCN - jinými slovy, nastav text pole určeného pro zobrazení souřadnic ve scéně Hlavni na hodnotu souřadnic získaných ve funkci č.7 v případě, že byl pokus o získání adresy z internetu úspěšný. Na první pohled možná nevidíte souvislost mezi zobrazením souřadnic a adresy, ale pokud nebyla adresa úspěšně získána, značí to problém s připojením k internetu, tudíž nebyla ani řádně nastavena proměnná %LOCN a vzhledem k tomu, že tato proměnná obsahuje vždy poslední získané souřadnice ze sítě, mohlo by se při opomenutí této podmínky stát, že se do pole ve scéně vyplní neaktuální souřadnice.

25. Pokud hodnota proměnné %adresa obsahuje text Chyba připojení, nastav text prvku Text.hlavni.gps ve scéně Hlavni na hodnotu Chyba připojení - tímto krokem si ošetříme opačný případ, než ve funkci č.24.

26. Nastav text prvku Text.hlavni.adresa ve scéně Hlavni na hodnotu proměnné %adresa - zde není třeba již dalších podmínek, hodnota proměnné %adresa je již z předchozích kroků určena v závislosti na tom, zda se podařilo získat adresu z internetu.

27. Nastav obrázek pro prvek Image.hlavni.mapa ve scéně Hlavni a jako cestu k němu použij hodnotu proměnné %mapa, pokud nějakou hodnotu tato proměnná obsahuje - v předchozích krocích jsme si do této proměnné uložili cestu k obrázku mapy a také ošetřili případ, kdy nedojde k úspěšnému stažení obrázku - v tu chvíli se hodnota této proměnné nenastaví a tato funkce tudíž neproběhne.

28. Zastav průběh TASKu





30. Nastav hodnotu Globální proměnné %POUZIT_gps na hodnotu 1 - k této funkci TASK dojde pouze v případě, že přesnost polohy ze sítě, kterou jsme si vyžádali ve funkci č.7, je nad 150 metrů, tudíž chceme, aby aplikace použila pro přesnější určení polohy GPS. Tímto krokem pouze dáme aplikaci znamení, že tato situace nastala. Důsledek nastavení této proměnné pochopíte dále.



TASK pouzit.gps

Nyní si vytvoříme druhý TASK, který obstará použití GPS v případě, že poloha ze sítě nedosahuje námi určené přesnosti do 150 metrů. To, jakým způsobem se spustí, bude vysvětleno dále.





1. Získej GPS polohu - nastaví systémovou proměnnou %LOC na hodnotu  souřadnic aktuální polohy pomocí GPS. Na rozdíl od volby NET nemá okamžitý efekt a TASK pokračuje až ve chvíli, kdy se vystaví GPS poloha (pokud není zaškrtnuta volba Continue Task Immediately.

2. Vymaž hodnotu proměnné %POUZIT_gps

3. Zobraz určenou scénu jako "aktivitu, přes celý displej"

4.-21. Zde jsou použity naprosto stejné funkce a ve stejném sledu jako v TASKu spusteni (funkce č.10 - 27.), pouze se zde použije proměnná %LOC, na místo proměnné %LOCN, protože právě v této proměnné jsou uloženy souřadnice získané pomocí GPS.






TASK zahajit.monitorovani

Nyní si vytvoříme TASK, který bude reprezentovat funkci tlačítka pro aktivaci monitorování polohy (Button.hlavni.monitorovani).






1. Zruš určenou scénu

2. Vytvoř notifikaci s nadpisem Aktuální poloha a popisem Čekám na polohu

3. Získej síťovou polohu a nastav popisku funkce na smycka - popisku lze nastavit každé funkci a v tomto případě nám bude sloužit jako identifikátor toho, kam se má průběh TASKu vrátit v určité fázi průběhu.

4.-15. Pokud je hodnota proměnné %LOCNACC menší než 151, vykonej všechny funkce, dokud nenarazíš na funkci END IF, nebo konec TASKu

5. Zjisti aktuální adresu pomocí souřadnic ze sítě

6.-11. Zde je použit již dříve vysvětlený postup "vypreparování" adresy z textu






12. Vytvoř notifikaci s nadpisem Aktuální poloha a popisem %adresa - v tuto chvíli máme již adresu v proměnné, tak použijeme stejnou funkci jako je funkce č.2, jen změníme popis na hodnotu proměnné.

13. Počkej 20 vteřin

14. Přeskoč na funkci s popiskou smycka - tím docílíme toho, že se každých 20 vteřin nastaví popis notifikace na aktuální adresu





16. Získej GPS polohu - sem se dostane průběh TASKu pouze pokud poloha ze sítě nedosahuje námi určené přesnosti do 150 metrů.

17.-26. Zde jsou použity naprosto stejné funkce a ve stejném sledu jako ve funkcích č.5.-14.



TASK zrusit.monitorovani

Tento TASK využijeme ve chvíli, kdy budeme chtít přerušit průběh TASKu zahajit.monitorovani a zrušit notifikaci.





1. Zastav průběh TASKu zahajit.monitorovani

2. Zruš notifikaci - pokud je definovaný text, který notifikace v nadpisu zobrazuje, ukončí ta konkrétní notifikace, pokud ne, ukončí se všechny, které jsou aktuálně zobrazeny v notifikační liště a byly vytvořeny Taskerem (vygenerovanou aplikací). V tomto případě je jedno, zda nadpis definujeme, naše aplikace generuje jen jednu notifikaci.



TASK mapa.otevrit

Tento TASK bude reprezentovat funkci, která se provede po kliknutí na prvek Image.hlavni.mapa ve scéně Hlavni.




1. Pošli signál systému, že potřebuji použít aplikaci, která je schopna zobrazit určená data - funkce SEND INTENT by si také zasloužila obsáhlejší vysvětlování, nyní si vystačíte s tímto popisem a faktem, že se do položky Data musí vyplnit text: geo:0,0?q=%MAPA_SOURADNICE a do položky Action tento text: android.intent.action.VIEW . Proměnná %MAPA_SOURADNICE obsahuje v tuto chvíli souřadnice nastavené v TASKu spusteni



TASK kopirovat.gps

Tento TASK bude reprezentovat funkci, která se provede po kliknutí na prvek Text.hlavni.gps ve scéně Hlavni.





1. Zjisti, jaký text aktuálně obsahuje prvek Text.hlavni.gps ve scéně Hlavni a ulož ho do proměnné %souradnice

2. Vlož do systémové schránky text, který obsahuje proměnná %souradnice

3. Zobraz krátkou oznamovací zprávu s textem Souřadnice zkopírovány do schránky



TASK kopirovat.adresa

Tento TASK bude reprezentovat funkci, která se provede po kliknutí na prvek Text.hlavni.adresa ve scéně Hlavni.





1. Zjisti, jaký text aktuálně obsahuje prvek Text.hlavni.adresa ve scéně Hlavni a ulož ho do proměnné %adresa

2. Vlož do systémové schránky text, který obsahuje proměnná %adresa

3. Zobraz krátkou oznamovací zprávu s textem Adresa zkopírována do schránky



Tak a tím máme všechny TASKy hotové, ale zatím to nedává moc smysl, ještě bychom měli vytvořit profily, konkrétně dva. Jeden, který bude reagovat na situaci, kdy je globální proměnná %POUZIT_gps nastavena na hodnotu 1 a druhý, který bude reagovat na to, když uživatel klikne na notifikaci v průběhu monitorování.


PROFIL Pouzit.gps



Jako jedinou podmínku tohoto profilu nastavíme v kategorii STATE, podmínku VARIABLE VALUE a hodnotu logicky na 1. Tasker si od nás ihned po potvrzení podmínky vyžádá, jaký TASK má použít při aktivaci profilu (ENTER TASK) a protože již máme všechny hotové, vybereme z listu TASK pouzit.gps. Takže nyní jsme pomocí tohoto profilu zajistili, že jakmile se hodnota proměnné %POUZIT_gps nastaví na hodnotu 1, automaticky se provede TASK pouzit.gps .



PROFIL Notifikace.klik





Jako jedinou podmínku tohoto profilu nastavíme v kategorii EVENT a podkategorii UI podmínku NOTIFICATION CLICK. Pravidlo pro vyplnění nadpisu notifikace platí úplně stejně, jako v případě funkcí NOTIFICATION nebo NOTIFICATION CANCEL.


PROJEKT PO FUNKČNÍ STRÁNCE MÁTE HOTOVÝ!!! :-)

Chápu, že jsem vše nevysvětlil zcela podrobně a proto vám zde poskytnu celý projekt ke stažení, vy si ho v Taskeru jednoduše naimportujete (kliknout na jakoukoliv kartu existujícího projektu a zvolit import), prozkoumáte a v diskusi pod článkem můžeme probírat detaily, které vám i pak nebudou jasné.

Jinak v této fázi můžete projekt naprosto bez problémů otestovat a to tak, že si zapnete Tasker (ikona Taskeru vlevo nahoře musí být barevná - zapíná se a vypíná dlouhým podržením na této ikonce) a vytvoříte si zástupce TASKu spusteni na ploše. Tento zástupce se přidává na plochu stejně jako widget, stačí v seznamu dostupných widgetů najít položku Task Shortcut, vybrat ze seznamu TASK spusteni, ten se vám v tu chvíli zobrazí v editačním okně a jen potvrdíte systémovou šipkou zpět. Tento zástupce se nyní (pokud bude Tasker zapnutý) bude chovat úplně stejně, jako budoucí ikona vyexportované aplikace...

Projekt stahujte ZDE