<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5723209725752603760</id><updated>2024-11-01T11:07:52.482+01:00</updated><category term="Tasker"/><category term="If"/><category term="Variable Set"/><category term="aktualizacja"/><category term="End If"/><category term="Flash"/><category term="Stop"/><category term="Variable Split"/><category term="wyrażenia regularne"/><category term="Else"/><category term="Goto"/><category term="Toast"/><category term="Variable Clear"/><category term="Wifi Connected"/><category term="profil"/><category term="task"/><category term="zmienne"/><category term="AutoContacts"/><category term="AutoContacts Details"/><category term="AutoVoice"/><category term="AutoVoice Recognize"/><category term="Call"/><category term="Run Shell"/><category term="Say"/><category term="Variable Add"/><category term="Variable Search Replace"/><category term="WiFi"/><category term="akcja"/><category term="kontekst"/><category term="plugin"/><category term="2G/3G"/><category term="Android"/><category term="Array Process"/><category term="Array Push"/><category term="AutoNotification"/><category term="AutoNotifications"/><category term="Automagic"/><category term="Browse URL"/><category term="Cell Near"/><category term="Compose SMS"/><category term="Delete File"/><category term="Display Unlocked"/><category term="End For"/><category term="For"/><category term="Google Inbox"/><category term="Inbox"/><category term="Llama"/><category term="Locale"/><category term="OpenVPN"/><category term="Read File"/><category term="Run Log"/><category term="Send SMS"/><category term="Status Bar"/><category term="TTS"/><category term="Toggle Network Type"/><category term="VPN"/><category term="Variable Join"/><category term="Write File"/><category term="backup"/><category term="eksport"/><category term="import"/><category term="instrukcje warunkowe"/><category term="interfejs"/><category term="log"/><category term="lokalizacja"/><category term="operatory logiczne"/><category term="projekt"/><category term="scena"/><category term="strefa WiFi"/><category term="szukanie błędów"/><category term="text-to-speech"/><category term="zaproszenia"/><category term="znaki specjalne"/><title type='text'>Tasker &amp;amp; Android</title><subtitle type='html'>Czyli wszystko o automatyzacji urządzeń z Androidem</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://tasker-android.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://tasker-android.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05046866348300228265</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>20</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5723209725752603760.post-5887228880258976612</id><published>2015-06-09T22:08:00.000+02:00</published><updated>2015-06-09T22:08:15.606+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="aktualizacja"/><category scheme="http://www.blogger.com/atom/ns#" term="Tasker"/><title type='text'>Tasker - aktualizacja do wersji 4.7</title><content type='html'>&lt;p&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrv2T5cbFkfvWO_jWQhI-vO9sFAGqOA9VrpBKQWJ6sMkTCPMAGIi-MDX1bzLmbUfpSCOeI_YNwUanAdEOk_VP5jA-NTao3VbRUEJCaw1PWNoJl-ljpFte9P2o5Wd-63hJUNQwq4x3p_70/s1600/update.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: none; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrv2T5cbFkfvWO_jWQhI-vO9sFAGqOA9VrpBKQWJ6sMkTCPMAGIi-MDX1bzLmbUfpSCOeI_YNwUanAdEOk_VP5jA-NTao3VbRUEJCaw1PWNoJl-ljpFte9P2o5Wd-63hJUNQwq4x3p_70/s400/update.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Wczoraj, po długim okresie beta testów, pojawiła się nowa wersja Taskera &lt;b&gt;4.7&lt;/b&gt;. Zachęcam do aktualizacji.&lt;/p&gt;
&lt;h3&gt;Lista zmian&lt;/h3&gt;
&lt;p&gt;&lt;ul&gt;
  &lt;li&gt;Prefs / Misc: Android Backup&lt;/li&gt;
&lt;li&gt;action Tasker / Import Data&lt;/li&gt;
&lt;li&gt;action Array Process: Sort Numeric Integer and Sort Numeric Floating-Point&lt;/li&gt;
&lt;li&gt;action Send Intent: Extra fields: support for parcelable Java objects created with Java Function&lt;/li&gt;
&lt;li&gt;action Send Intent: Extra fields: support for Uris via casting of value&lt;/li&gt;
&lt;li&gt;action Send Intent: extra Extra field (also for JS function)&lt;/li&gt;
&lt;li&gt;file selection: text box for specification&lt;/li&gt;
&lt;li&gt;file selection for local data backup and restore&lt;/li&gt;
&lt;li&gt;scene element WebView: Background tab&lt;/li&gt;
&lt;li&gt;action Test System: added Android ID test type&lt;/li&gt;
&lt;li&gt;action Test Display / Orientation: added landscape-reverse and portrait-reverse values&lt;/li&gt;
&lt;li&gt;per-action log access in task edit screen after test runs&lt;/li&gt;
&lt;li&gt;action Vibrate/Vibrate Pattern: Continue On Error param&lt;/li&gt;
&lt;li&gt;action Zip: Target File parameter&lt;/li&gt;
&lt;li&gt;action Media Control: option to send the command to a specific app&lt;/li&gt;
&lt;li&gt;main screen profile/task/scene list: multi-select mode action: Move To Top (when items are user-sorted)&lt;/li&gt;
&lt;li&gt;main screen profile/task/scene: sort by age&lt;/li&gt;
&lt;li&gt;action Zip: Target File parameter&lt;/li&gt;
&lt;li&gt;action Media Control: option to send the command to a specific app&lt;/li&gt;
&lt;li&gt;scene element TextEdit: Focus event&lt;/li&gt;
&lt;li&gt;action Element Text: parameter Selection (TextEdit elements only)&lt;/li&gt;
&lt;li&gt;JS: function Say: parameters Respect Audio Focus and Use Network&lt;/li&gt;
&lt;li&gt;scene element Web: Support Popups parameter for e.g. form selection elements&lt;/li&gt;
&lt;li&gt;state Net / Auto Sync&lt;/li&gt;
&lt;li&gt;action Launch App: parameter Always Start New Copy, default is now to use existing copy of app when possible&lt;/li&gt;
&lt;li&gt;Music Play Dir: Audio Only: extra file extensions&lt;/li&gt;
&lt;li&gt;display-off monitoring: use of significant motion sensor where available (no power usage when stationary,&lt;/li&gt;
&lt;li&gt;Prefs / Monitor / Display Off / Motion Detection (enabled by default)&lt;/li&gt;
&lt;li&gt;BODY_SENSORS permission for Heart Rate&lt;/li&gt;
&lt;li&gt;State / Heart Rate (untested)&lt;/li&gt;
&lt;li&gt;variable: %HEART (Heart Rate) (untested)&lt;/li&gt;
&lt;li&gt;action Net / HTTP Head&lt;/li&gt;
&lt;li&gt;events Variables / Variable Cleared/Set: parameter User Variables Only&lt;/li&gt;
&lt;li&gt;event Tasker / Timer Change (when Task Timer status changes)&lt;/li&gt;
&lt;li&gt;Tasker / Test Tasker: type Timer Widget Remaining&lt;/li&gt;
&lt;li&gt;Prefs / UI / List Item Drag Margin / Disable option&lt;/li&gt;
&lt;li&gt;variable %TNET: try using getprop as workaround when Android doesn&#39;t return a value&lt;/li&gt;
&lt;li&gt;action Get Voice: parameter Language&lt;/li&gt;
&lt;li&gt;actions File / GZip and File / GUnzip&lt;/li&gt;
&lt;li&gt;state Power / Battery Temperature&lt;/li&gt;
&lt;li&gt;state Power Save Mode (Android 5.0+)&lt;/li&gt;
&lt;li&gt;task edit screen: test buttons: log display when action fails&lt;/li&gt;
&lt;li&gt;Search Tasker: matches also against action parameters which have a set of strings to choose for the value&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;h3&gt;Pobieranie&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm&quot; title=&quot;Tasker&quot; rel=&quot;nofollow&quot;&gt;Google Play&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;http://tasker.dinglisch.net/download.html&quot; title=&quot;Tasker for Android&quot; rel=&quot;nofollow&quot;&gt;Strona Taskera&lt;/a&gt;&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/5887228880258976612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/5887228880258976612'/><link rel='alternate' type='text/html' href='http://tasker-android.blogspot.com/2015/06/tasker-aktualizacja-do-wersji-47.html' title='Tasker - aktualizacja do wersji 4.7'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05046866348300228265</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrv2T5cbFkfvWO_jWQhI-vO9sFAGqOA9VrpBKQWJ6sMkTCPMAGIi-MDX1bzLmbUfpSCOeI_YNwUanAdEOk_VP5jA-NTao3VbRUEJCaw1PWNoJl-ljpFte9P2o5Wd-63hJUNQwq4x3p_70/s72-c/update.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-5723209725752603760.post-1492575675789599551</id><published>2015-03-18T12:06:00.002+01:00</published><updated>2015-04-06T21:41:55.498+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Array Process"/><category scheme="http://www.blogger.com/atom/ns#" term="Array Push"/><category scheme="http://www.blogger.com/atom/ns#" term="AutoNotifications"/><category scheme="http://www.blogger.com/atom/ns#" term="Cell Near"/><category scheme="http://www.blogger.com/atom/ns#" term="lokalizacja"/><category scheme="http://www.blogger.com/atom/ns#" term="strefa WiFi"/><category scheme="http://www.blogger.com/atom/ns#" term="Variable Join"/><category scheme="http://www.blogger.com/atom/ns#" term="Wifi Connected"/><title type='text'>Energooszczędna lokalizacja w Taskerze</title><content type='html'>&lt;p&gt;Dziś zajmę się tematem bardzo często poruszanym przez użytkowników Taskera. Mianowicie chodzi o lokalizację i zmianę ustawień/uruchamianie tasków w zależności od miejsca, w którym przebywa użytkownik wraz z urządzeniem. Lokalizacja bazująca na GPS i usługach lokalizacyjnych Google nie należy do zbyt energooszczędnych dlatego ja zaproponuję swoje rozwiązanie, które dopieszczam od wielu lat. Pewne aspekty tego projektu zapożyczone są z rozwiązań kolegi &lt;a href=&quot;https://plus.google.com/u/0/116957486018122295424&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Mariusza Turka&lt;/a&gt; oraz użytkownika YouTube &lt;a href=&quot;https://www.youtube.com/channel/UC7V__uBIaZotHn_smHJShGQ&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;PolePosition&lt;/a&gt;.&lt;br&gt;
Projekt bazuje na dwóch etapach lokalizacji. W pierwszym poszukiwana jest strefa WiFi (czyli obszar gdzie w urządzeniu jest włączana łączność WiFi) na podstawie działających w tej strefie nadajników GSM. Drugi etap to poszukiwanie sieci WiFi, która jednoznacznie identyfikuje dane miejsce (przykładowo połączenie z siecią domową Tasker interpretuje jako obecność użytkownika w domu). Dopełnieniem całości jest profil skanujący nadajniki w celu tworzenia danych dla poszukiwania strefy WiFi. W tym przypadku posłużę się aplikacją &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.painless.pc&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Power Toggles&lt;/a&gt;, która umożliwia tworzenie przycisków w panelu notyfikacji.&lt;/p&gt;
&lt;h3&gt;Wymagania&lt;/h3&gt;
&lt;p&gt;&lt;ul&gt;
&lt;li&gt;wtyczka &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.joaomgcd.autonotification&quot; title=&quot;AutoNotifications&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot; &gt;AutoNotifications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;aplikacja &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.painless.pc&quot; title=&quot;Power Toggles&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot; &gt;Power Toggles&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;h3&gt;Opis wykonania&lt;/h3&gt;
&lt;p&gt;Zaczynamy od dodania do wcześniejszego profilu &lt;b&gt;Połączone WiFi&lt;/b&gt; zmiennej &lt;span class=&quot;code&quot;&gt;%WIFIC&lt;/span&gt;, która będzie otrzymywać wartość &lt;span class=&quot;code&quot;&gt;1&lt;/span&gt; gdy urządzenie będzie miało połączenie z siecią WiFi oraz czyszczona, gdy tego połączenia nie będzie.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWTv-ysXNf2wWi4Tqt3_A1mN8gl3oNHxRu3FeQAZsdE7WnVN7fdUG8VZruijCg6iGSFNSi9sHSKNwolAMNjfxSoLpvGDePyrwDIlKaXSSsOqWKmPlv9ZTWzX303x2n9E7jK4D_QFTFkYY/s1600/lokalizacja01.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWTv-ysXNf2wWi4Tqt3_A1mN8gl3oNHxRu3FeQAZsdE7WnVN7fdUG8VZruijCg6iGSFNSi9sHSKNwolAMNjfxSoLpvGDePyrwDIlKaXSSsOqWKmPlv9ZTWzX303x2n9E7jK4D_QFTFkYY/s640/lokalizacja01.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;
Kolejnym krokiem jest stworzenie profilu, który będzie zapisywał do zmiennej numery nadajników GSM. Wykorzystam do tego zmienną &lt;span class=&quot;code&quot;&gt;%CELLID&lt;/span&gt;, w której przechowywany jest numer nadajnika GSM. Profil opiera się o pętlę, która odczytuje zawartość zmiennej 6 razy co 30 sekund co pozwoli zebrać więcej danych. Obróbka danych wykonana będzie poprzez stworzenie z nich tablicy, w której usunięte zostaną duplikaty, puste elementy tablicy oraz na koniec elementy zostaną posortowane. Następnie elementy tablicy oddzielone znakiem końca linii zostają zapisane do zmiennej &lt;span class=&quot;code&quot;&gt;%NadajnikiStrefyWiFi&lt;/span&gt;.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiu6-cqzow4PcJup9DlkkQg7nVwOjvWNsvKv2nPtnRQ8vY_lCJjMD50jwS5lpncCPQQLz6VvXbLimkQD8z2gQOODFC1w80kwhB3ofnFkPJRBkauoikK0CvxdTxJIeeYiilkv9G71qXaVz4/s1600/lokalizacja02.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiu6-cqzow4PcJup9DlkkQg7nVwOjvWNsvKv2nPtnRQ8vY_lCJjMD50jwS5lpncCPQQLz6VvXbLimkQD8z2gQOODFC1w80kwhB3ofnFkPJRBkauoikK0CvxdTxJIeeYiilkv9G71qXaVz4/s640/lokalizacja02.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Ze zmienną &lt;span class=&quot;code&quot;&gt;%CELLID&lt;/span&gt; wiąże się dziwna przypadłość. Zmienna ta zawiera wartość tylko wtedy gdy użyta jest w tasku uruchomionym poprzez profil. Z tego względu musiałem stworzyć dodatkowy profil &lt;b&gt;PT Skanowanie nadajników&lt;/b&gt;, który uruchamia task skanowania gdy zmienna &lt;span class=&quot;code&quot;&gt;%SkanNadajników&lt;/span&gt; otrzyma wartość 1. Wartość tą nadaję taskiem &lt;b&gt;PT Skan nadajników&lt;/b&gt;, który jest uruchamiany poprzez klawisz &lt;b&gt;Power Toggles&lt;/b&gt;.&lt;br&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjX_5JDhZJlxLt6B8YwW9ORYs32xl8le3bB7IIJabQeds0ZDTRmSVOp7fBuqR6jm16EKKJb23WAhCEQmhxBS0TxQr51z7zrxdKciBCWmAFnsoDnvFBhQMcoaJ4djEDGv6Xlm_IcalWynIE/s1600/lokalizacja03.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjX_5JDhZJlxLt6B8YwW9ORYs32xl8le3bB7IIJabQeds0ZDTRmSVOp7fBuqR6jm16EKKJb23WAhCEQmhxBS0TxQr51z7zrxdKciBCWmAFnsoDnvFBhQMcoaJ4djEDGv6Xlm_IcalWynIE/s640/lokalizacja03.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Poniżej instrukcja jak dodać za pomocą &lt;b&gt;Power Toggles&lt;/b&gt; klawisz w panelu powiadomień uruchamiający task Taskera.
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;360&quot; src=&quot;//www.youtube.com/embed/d2meq2SFxkI&quot; width=&quot;640&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;Teraz tworzymy profil &lt;b&gt;Strefa WiFi&lt;/b&gt;, który odpowiada za pierwszy etap lokalizacji. Profil ten uaktywniać się ma poprzez kontekst &lt;b&gt;Cell Near&lt;/b&gt; z podaną zmienną &lt;span class=&quot;code&quot;&gt;%NadajnikiStrefyWiFi&lt;/span&gt; gdy nieaktywny jest tryb samolotowy oraz zmienna &lt;span class=&quot;code&quot;&gt;%WIFIC&lt;/span&gt; jest różna od &lt;span class=&quot;code&quot;&gt;1&lt;/span&gt;. W tasku wejściowym tego profilu jest tylko jedna akcja - włączenie WiFi.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOx2UmOAKoxiTmlrcygyPvJNkErI3vrZGIUMRH-vZIO3q5UFo7D-8t3XjAQhtZRizGuH46-V2VCWJ2Elo_YOCTXcEG23Gjv4LMA-cYQhxsxX1knuJMseJ0foPMONgy2U-zOqwtRZrSNEs/s1600/lokalizacja04.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOx2UmOAKoxiTmlrcygyPvJNkErI3vrZGIUMRH-vZIO3q5UFo7D-8t3XjAQhtZRizGuH46-V2VCWJ2Elo_YOCTXcEG23Gjv4LMA-cYQhxsxX1knuJMseJ0foPMONgy2U-zOqwtRZrSNEs/s640/lokalizacja04.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;Kolejnym profilem jest &lt;b&gt;Poza strefą WiFi&lt;/b&gt;, którego kontekstami są &lt;b&gt;Cell Near&lt;/b&gt; ze zmienną &lt;span class=&quot;code&quot;&gt;%NadajnikiStrefyWifi&lt;/span&gt; i zaznaczoną zmienną &lt;b&gt;Invert&lt;/b&gt;, brak tryby samolotowego i zmienna &lt;span class=&quot;code&quot;&gt;%WIFIC&lt;/span&gt; różna od &lt;span class=&quot;code&quot;&gt;1&lt;/span&gt;. W tasku wejściowym profilu następuje wyłączenie WiFi po 30 sekundach oczekiwania i sprawdzeniu czy zmienna &lt;span class=&quot;code&quot;&gt;%WIFIC&lt;/span&gt; jest różna od &lt;span class=&quot;code&quot;&gt;1&lt;/span&gt;, a profil &lt;b&gt;Strefa WiFi&lt;/b&gt; nie jest aktywny. Zapobiegnie to wyłączeniu WiFi jeśli użytkownik połączył się z jakąś inną siecią oraz włączaniu i wyłączaniu WiFi gdy jest się na na skraju strefy WiFi.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjToDHveQCkYio6MffZeFDWxuaGrl67IPPze1cyNDL0wKVNo-vMpPlBzl-CqV0NlIVo_h7j1GkmQbOwHeC0ajOP4weDpxVvFaZH9HSYq_v9ufLLzbhCpVOBTIYjkdRpO1BZjYSHB8xpmCo/s1600/lokalizacja05.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjToDHveQCkYio6MffZeFDWxuaGrl67IPPze1cyNDL0wKVNo-vMpPlBzl-CqV0NlIVo_h7j1GkmQbOwHeC0ajOP4weDpxVvFaZH9HSYq_v9ufLLzbhCpVOBTIYjkdRpO1BZjYSHB8xpmCo/s640/lokalizacja05.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;Ostatnim etapem jest stworzenie profili W domu, W pracy, itp. Dla przykładu dodałem do projektu profil &lt;b&gt;W domu&lt;/b&gt;, w którym ustawiam głośność dzwonków i zmieniam ustawienia wibracji. Sposób wykorzystania tych profili każdy musi sam sobie oprogramować. Profile takie są aktywowane kontekstem &lt;b&gt;WiFi Connected&lt;/b&gt; z wpisaną nazwą lub adresem MAC danej sieci WiFi.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgafqMvDCRh7Sy8zOuXy2fCHkhkDdUr8DMY46NoTjqfkRefk4H89Ilv9_tAY3VGiJXNHMP4rf5S9ncXn9XekIdnoG_qMEjgorPZDRbxU3Yo5ZF-hk1xRQf6kzR1uzu2NrpTzhjoO19XmCQ/s1600/lokalizacja06.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgafqMvDCRh7Sy8zOuXy2fCHkhkDdUr8DMY46NoTjqfkRefk4H89Ilv9_tAY3VGiJXNHMP4rf5S9ncXn9XekIdnoG_qMEjgorPZDRbxU3Yo5ZF-hk1xRQf6kzR1uzu2NrpTzhjoO19XmCQ/s640/lokalizacja06.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;
&lt;h3&gt;Rozpisany projekt&lt;/h3&gt;
&lt;p&gt;&lt;div class=&quot;code&quot;&gt;
Profile: Strefa WiFi (2)
&lt;br /&gt;Priority: 7 Restore: no Enforce: no
&lt;br /&gt;State: Cell Near [ Cell Tower / Last Signal:%NadajnikiStrefyWiFi Ignore Cells:* ]
&lt;br /&gt;State: Not Airplane Mode
&lt;br /&gt;State: Variable Value [ %WIFIC != 1 ]
&lt;br /&gt;Enter: Wejście do strefy WiFi (3)
&lt;br /&gt;A1: WiFi [ Set:On ]
&lt;br /&gt;
&lt;br /&gt;Profile: Poza strefą WiFi (277)
&lt;br /&gt;Priority: 7 Restore: no Enforce: no
&lt;br /&gt;State: Not Cell Near [ Cell Tower / Last Signal:%NadajnikiStrefyWiFi Ignore Cells:* ]
&lt;br /&gt;State: Not Airplane Mode
&lt;br /&gt;State: Variable Value [ %WIFIC != 1 ]
&lt;br /&gt;Enter: Wyjście ze strefy WiFi (4)
&lt;br /&gt;A1: If [ %WIFIC = 1 ]
&lt;br /&gt;A2: Stop [ With Error:Off Task: ] 
&lt;br /&gt;A3: Else 
&lt;br /&gt;A4: Wait [ MS:0 Seconds:30 Minutes:0 Hours:0 Days:0 ] 
&lt;br /&gt;A5: WiFi [ Set:Off ] If [ %WIFIC != 1 &amp; %PACTIVE !~ *Strefa WiFi* ]
&lt;br /&gt;A6: End If
&lt;br /&gt;
&lt;br /&gt;Profile: W domu (8)
&lt;br /&gt;Restore: no Enforce: no
&lt;br /&gt;State: Wifi Connected [ SSID:Dom MAC:* IP:* ]
&lt;br /&gt;Enter: Wewnątrz (9)
&lt;br /&gt;A1: Ringer Volume [ Level:5 Display:Off Sound:Off ] 
&lt;br /&gt;A2: Notification Volume [ Level:5 Display:Off Sound:Off ] 
&lt;br /&gt;A3: Vibrate On Ringer [ Set:Off ]
&lt;br /&gt;Exit: Na zewnątrz (10)
&lt;br /&gt;A1: Wait [ MS:0 Seconds:20 Minutes:0 Hours:0 Days:0 ] 
&lt;br /&gt;A2: Stop [ With Error:Off Task: ] If [ %WIFIC = 1 ]
&lt;br /&gt;A3: Ringer Volume [ Level:7 Display:Off Sound:Off ] 
&lt;br /&gt;A4: Notification Volume [ Level:7 Display:Off Sound:Off ] 
&lt;br /&gt;A5: Vibrate On Ringer [ Set:On ]
&lt;br /&gt;
&lt;br /&gt;Profile: Połączone WiFi (177)
&lt;br /&gt;State: Wifi Connected [ SSID:* MAC:* IP:* ]
&lt;br /&gt;Enter: Anon (178)
&lt;br /&gt;A1: Variable Set [ Name:%WIFIC To:1 Do Maths:Off Append:Off ] 
&lt;br /&gt;A2: Variable Set [ Name:%wifiinfo To:%WIFII Do Maths:Off Append:Off ] 
&lt;br /&gt;A3: Variable Search Replace [ Variable:%wifiinfo Search:(?&lt;=(\n)).* Ignore Case:Off Multi-Line:Off One Match Only:Off Store Matches In:%wifiinfo Replace Matches:Off Replace With: ] 
&lt;br /&gt;A4: Variable Search Replace [ Variable:%wifiinfo2 Search:&quot; Ignore Case:Off Multi-Line:Off One Match Only:Off Store Matches In:%wifiinfo2 Replace Matches:On Replace With: ] 
&lt;br /&gt;A5: If [ %SCREEN ~ on ]
&lt;br /&gt;A6: Variable Search Replace [ Variable:%wifiinfo5 Search:IP :  Ignore Case:Off Multi-Line:Off One Match Only:Off Store Matches In:%wifiinfo5 Replace Matches:On Replace With: ] 
&lt;br /&gt;A7: Variable Search Replace [ Variable:%wifiinfo7 Search:Spd:  Ignore Case:Off Multi-Line:Off One Match Only:Off Store Matches In:%wifiinfo7 Replace Matches:On Replace With: ] 
&lt;br /&gt;A8: Flash [ Text:Połączono z siecią %wifiinfo2
&lt;br /&gt;Adres IP: %wifiinfo5
&lt;br /&gt;Prędkość: %wifiinfo7 Long:On ] 
&lt;br /&gt;A9: End If
&lt;br /&gt;Exit: Anon (258)
&lt;br /&gt;A1: Variable Clear [ Name:%WIFIC Pattern Matching:Off ]
&lt;br /&gt;
&lt;br /&gt;Profile: PT Skanowanie nadajników (62)
&lt;br /&gt;Event: Variable Set [ Variable:%SkanNadajników Value:1 ]
&lt;br /&gt;Enter: Skanowanie nadajników (187)
&lt;br /&gt;A1: AutoNotification [ Configuration:Title: Skanowanie nadajników
&lt;br /&gt;Text: Trwa skanowanie nadajników GSM/3G strefy WiFi
&lt;br /&gt;Status Bar Icon: ic_action_signal
&lt;br /&gt;Id: Skan-Wifi
&lt;br /&gt;Persistent: true Package:com.joaomgcd.autonotification Name:AutoNotification Timeout (Seconds):0 ] 
&lt;br /&gt;A2: Goto [ Type:Action Label Number:1 Label:koniec ] If [ %CELLID !Set ]
&lt;br /&gt;A3: Variable Set [ Name:%indeks To:1 Do Maths:Off Append:Off ] 
&lt;br /&gt;A4: If [ %NadajnikiStrefyWiFi Set &amp; %NadajnikiStrefyWiFi !~ *NadajnikiStrefyWiFi&quot; ]
&lt;br /&gt;A5: Variable Search Replace [ Variable:%NadajnikiStrefyWiFi Search:.+ Ignore Case:Off Multi-Line:Off One Match Only:Off Store Matches In:%array Replace Matches:Off Replace With: ] 
&lt;br /&gt;A6: End If 
&lt;br /&gt;&amp;#60;pętla&amp;#62;
&lt;br /&gt;A7: Array Push [ Name:%array Position:1 Value:%CELLID Fill Spaces:Off ] 
&lt;br /&gt;A8: Wait [ MS:0 Seconds:30 Minutes:0 Hours:0 Days:0 ] 
&lt;br /&gt;A9: Variable Add [ Name:%indeks Value:1 Wrap Around:0 ] 
&lt;br /&gt;A10: Goto [ Type:Action Label Number:1 Label:pętla ] If [ %indeks &lt; 7 ]
&lt;br /&gt;A11: Array Process [ Variable:%array Type:Remove Duplicates ] 
&lt;br /&gt;A12: Array Process [ Variable:%array Type:Squash ] 
&lt;br /&gt;A13: Array Process [ Variable:%array Type:Sort Numeric, Integer ] 
&lt;br /&gt;A14: Variable Set [ Name:%enter To:
&lt;br /&gt;Do Maths:Off Append:Off ] 
&lt;br /&gt;A15: Variable Join [ Name:%array Joiner:%enter Delete Parts:Off ] 
&lt;br /&gt;A16: Variable Set [ Name:%NadajnikiStrefyWiFi To:%array Do Maths:Off Append:Off ] 
&lt;br /&gt;&amp;#60;koniec&amp;#62;
&lt;br /&gt;A17: AutoNotification Cancel [ Configuration:Id: Skan-Wifi Package:com.joaomgcd.autonotification Name:AutoNotification Cancel Timeout (Seconds):0 ] 
&lt;br /&gt;A18: Variable Clear [ Name:%SkanNadajników Pattern Matching:Off ]
&lt;br /&gt;
&lt;br /&gt;PT Skan nadajników (69)
&lt;br /&gt;A1: Variable Set [ Name:%SkanNadajników To:1 Do Maths:Off Append:Off ] 
&lt;/div&gt;&lt;/p&gt;

&lt;h3&gt;Pobieranie projektu&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://drive.google.com/file/d/0B9CkGmXTLcF0ajZKak5UMEVQRzg&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Profil Energooszczędna lokalizacja&lt;/a&gt; [Tasker 4.7b4]&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/1492575675789599551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/1492575675789599551'/><link rel='alternate' type='text/html' href='http://tasker-android.blogspot.com/2015/03/energooszczedna-lokalizacja-w-taskerze.html' title='Energooszczędna lokalizacja w Taskerze'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05046866348300228265</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWTv-ysXNf2wWi4Tqt3_A1mN8gl3oNHxRu3FeQAZsdE7WnVN7fdUG8VZruijCg6iGSFNSi9sHSKNwolAMNjfxSoLpvGDePyrwDIlKaXSSsOqWKmPlv9ZTWzX303x2n9E7jK4D_QFTFkYY/s72-c/lokalizacja01.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-5723209725752603760.post-8416167295305878840</id><published>2015-01-16T00:35:00.000+01:00</published><updated>2015-01-16T00:35:59.652+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="log"/><category scheme="http://www.blogger.com/atom/ns#" term="Run Log"/><category scheme="http://www.blogger.com/atom/ns#" term="szukanie błędów"/><category scheme="http://www.blogger.com/atom/ns#" term="Tasker"/><category scheme="http://www.blogger.com/atom/ns#" term="Toast"/><category scheme="http://www.blogger.com/atom/ns#" term="Write File"/><title type='text'>Diagnozowanie błędów w Taskerze</title><content type='html'>&lt;p&gt;Im bardziej skomplikowane profile i taski się tworzy tym większa jest szansa na popełnienie błędu. Jak tego błędu szukać w Taskerze? Z osobistego doświadczenia wiem, że czasem można kilka dni patrzeć na błąd i go nie widzieć dlatego najlepiej od początku wyrobić w sobie nawyki, które pomogą go uniknąć. A jak już błąd się pojawi to trzeba znać sposoby na jego odnalezienie i zdiagnozowanie. Poniżej postaram się przedstawić sposoby jakie sam używam do tego, z lepszym bądź gorszym skutkiem.&lt;/p&gt;
&lt;h3&gt;Skokowe wykonywanie tasków&lt;/h3&gt;
&lt;p&gt;Począwszy od Taskera 4.6 jest możliwość skokowego wykonywania tasków. W dodatku kolorowymi kropkami aplikacja informuje czy dana akcja została wykonana bez błędów (kropka zielona) czy zakończyła się błędem (kropka czerwona). Znakiem &quot;play&quot; oznaczona jest akcja, która zostanie wykonana w następnym kroku.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7qAzbU0Zui05exriYxScNs-LRk20BR8rj5KDJ2qgAVuH65JQmWDdgMT5XZIcOxkMORnoJr1ObymxzB_Ldex_RsaD1xiDUM2oNnir_NwP65a5R7F3YlqDCkaNtJ_0uXPPvv2a0eEiv7hc/s1600/krokowo.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7qAzbU0Zui05exriYxScNs-LRk20BR8rj5KDJ2qgAVuH65JQmWDdgMT5XZIcOxkMORnoJr1ObymxzB_Ldex_RsaD1xiDUM2oNnir_NwP65a5R7F3YlqDCkaNtJ_0uXPPvv2a0eEiv7hc/s640/krokowo.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
W trakcie przerwy pomiędzy kolejnymi akcjami można wyjść z ekranu edycji tasku i na zakładce &lt;b&gt;Zmienne&lt;/b&gt; podejrzeć wartości zmiennych na danym etapie wykonywania tasku.
&lt;/p&gt;
&lt;h3&gt;Wyświetlanie błędów/ostrzeżeń Taskera&lt;/h3&gt;
&lt;p&gt;Prostą metodą na poszukiwanie błędów jest włączenie opcji &lt;b&gt;Popup Errors/Warnings&lt;/b&gt; w Taskerze. Przy każdym wejściu do interfejsu Taskera, aplikacja wyświetli okno z błędami/ostrzeżeniami, które wydarzyły się od ostatniej wizyty w interfejsie. Fakt, że opis tych błędów i ostrzeżeń jest bardzo enigmatyczny i zazwyczaj nic nie mówi poza tym, że błędy są i należy je znaleźć.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLXlvf_wDYsF4p4pv8Px3fk-ncN7KTHmrl0esTAIt55ZL5ob9hHRvdpVT1V3ni9WpujiQBz1_VamJD5jdnjYsGQ77GgV-8Mb5Lv8Xv4FapBymej-cjNSWqu78eFhGu2HWPe0mu9sKLlKY/s1600/popup-errors.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLXlvf_wDYsF4p4pv8Px3fk-ncN7KTHmrl0esTAIt55ZL5ob9hHRvdpVT1V3ni9WpujiQBz1_VamJD5jdnjYsGQ77GgV-8Mb5Lv8Xv4FapBymej-cjNSWqu78eFhGu2HWPe0mu9sKLlKY/s640/popup-errors.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;
&lt;h3&gt;Tosty podczas działania tasku&lt;/h3&gt;
&lt;p&gt;Najprostszym sposobem przeciwdziałania powstawania błędów oraz ich wyszukiwania jest używanie tostów umieszczonych na danym etapie wykonywania tasków. Tekst tostów może być bardzo różny. Ja czasem wstawiam do tostów numer akcji, w której są generowane dzięki czemu wiem jak daleko dotarło wykonywanie tasku. Czasem najlepiej sprawdza się tost z wartością zmiennej, która jest w danym tasku obrabiana. Wszystko zależy od tego co się tworzy i co chce się sprawdzić.&lt;/p&gt;
&lt;h3&gt;Własny log&lt;/h3&gt;
&lt;p&gt;Bardzo dobrym sposobem na kontrolę poprawności pracy profilów których działanie rozciągnięte jest w czasie jest stworzenie własnego loga tekstowego. Tworzy się go za pomocą akcji &lt;b&gt;Write File&lt;/b&gt; z zaznaczonymi opcjami &lt;b&gt;Add Newline&lt;/b&gt; (każdy zapis dodaje nową linię) oraz &lt;b&gt;Append&lt;/b&gt; (zapis nie nadpisuje zawartości pliku). W polu &lt;b&gt;Text&lt;/b&gt; należy podać takie dane jakie będą potrzebne do diagnozowania działania profilu. Najczęściej data i czas są bardzo pomocne. Samo miejsce umieszczenia zapisu do loga też należy dobrze przemyśleć. Zbyt duża ilość danych w logu utrudni jego interpretację zbyt mała nie dostarczy wystarczających danych.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-J8IP8qcAYVb7jY5Yo8z1npmk0YqITLokdxJa17Gem8NSbu2ZP-mQXguk45VIXby4Viefp_IftuQDyJgq3nIYaPRbvXrrP94OtLpZjTKDmII17i51b_u_-ZoQs44a4_vtsId9Ew6cCUM/s1600/own_log.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-J8IP8qcAYVb7jY5Yo8z1npmk0YqITLokdxJa17Gem8NSbu2ZP-mQXguk45VIXby4Viefp_IftuQDyJgq3nIYaPRbvXrrP94OtLpZjTKDmII17i51b_u_-ZoQs44a4_vtsId9Ew6cCUM/s640/own_log.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;
&lt;h3&gt;Run Log&lt;/h3&gt;
&lt;p&gt;Ostatnią metodą, jaką używam, jest Run Log. Jest to funkcja wbudowana w Taskera. Uruchamia się ją z ekranu głównego naciskając &lt;b&gt;menu&lt;/b&gt; / &lt;b&gt;More&lt;/b&gt; / &lt;b&gt;Run Log&lt;/b&gt;.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxZkergKvGS6RjJMYv0J7P3rZ8NJ0iI31didnHsXEJaeeap9FRMJqApn6DA0Gvgwc901cwp_Dv_z4sho4HaA9Uxss5sxa9w_D40w4i8wdefo7xbjRqqI3Oa_9bnjRKHw5a6xehHP6NFrs/s1600/run_log.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxZkergKvGS6RjJMYv0J7P3rZ8NJ0iI31didnHsXEJaeeap9FRMJqApn6DA0Gvgwc901cwp_Dv_z4sho4HaA9Uxss5sxa9w_D40w4i8wdefo7xbjRqqI3Oa_9bnjRKHw5a6xehHP6NFrs/s640/run_log.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Run log po włączeniu pokazuje zmiany statusów profili oraz wykonywanych tasków i akcji. Dla łatwiejszej orientacji wpisy rozróżnione są kolorami:
&lt;ul&gt;&lt;li&gt;fioletowy odpowiada za taski,&lt;/li&gt;
&lt;li&gt;pomarańczowy za profile,&lt;/li&gt;
&lt;li&gt;niebieski za akcje,&lt;/li&gt;
&lt;li&gt;biały/czarny za monitor i usługę Taskera.&lt;/li&gt;
&lt;/ul&gt;
Po dłuższym przytrzymaniu danego elementu pokazuje się menu, które umożliwia przejście do odpowiedniego profilu/tasku/akcji lub filtrowanie loga.&lt;BR&gt;
Analizując log należy pamiętać, że taski oznaczone jako Anon to te, którym nie nadano nazw (właśnie dlatego opłaca się to robić) oraz, że wpisy, w których występuje zmienna pokazują jej wartość &lt;b&gt;po&lt;/b&gt; zakończeniu tej akcji.&lt;br&gt;
&lt;h4&gt;Kolumna ID tabeli loga&lt;/h4&gt;
ID oznacza wewnętrzny numer identyfikacyjny profilu/tasku/akcji jaki nadaje im Tasker.&lt;br&gt;Po kropce w ID akcji umieszczany jest jej numer w tasku, przykładowo akcja o ID &lt;span class=&quot;code&quot;&gt;20.3&lt;/span&gt; to trzecia akcja tasku o ID &lt;span class=&quot;code&quot;&gt;20&lt;/span&gt;.&lt;br&gt;
Po dwukropku w ID tasku umieszczany jest numer kopii tasku równocześnie wykonywanego, przykładowo task o ID &lt;span class=&quot;code&quot;&gt;6:2&lt;/span&gt; to druga kopia tasku o ID &lt;span class=&quot;code&quot;&gt;6&lt;/span&gt; wykonywana równocześnie (dwie kopie tego tasku są wykonywane w tym momencie).
&lt;h4&gt;Kolumna Status tabeli loga&lt;/h4&gt;
Status opisuje nowy status zdarzenia powodującego wpis w logu. Jeśli dany wpis zawiera błąd oznaczany jest kolorem czerwonym.
&lt;br&gt;&lt;br&gt;
&lt;ul&gt;&lt;b&gt;Statusy usługi (Services)&lt;/b&gt;&lt;li&gt;&lt;i&gt;Start&lt;/i&gt; usługa została uruchomiona. Niespodziewane uruchomienie usługi najczęściej jest powodowane przez zabicie jej przez system operacyjny gdy opcja &lt;b&gt;Run In Foreground&lt;/b&gt; była wyłączona.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Stop&lt;/i&gt; usługa została zatrzymana.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Restart&lt;/i&gt; usługa została zrestartowana. Zazwyczaj ma to miejsce gdy nowe dane trzeba doczytać po zmianie konfiguracji przez użytkownika.&lt;/li&gt;&lt;/ul&gt;
&lt;br&gt;
&lt;ul&gt;&lt;b&gt;Statusy profili&lt;/b&gt;
&lt;li&gt;&lt;i&gt;Active&lt;/i&gt; warunki profilu zostały spełnione i stał się on aktywny.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Inactive&lt;/i&gt; nie wszystkie warunki profilu były spełnione i przestał on być aktywny.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Instant&lt;/i&gt; profil typu &lt;b&gt;instant&lt;/b&gt; był na moment aktywowany. Profil typu &lt;b&gt;instant&lt;/b&gt; to nic innego jak profil z kontekstem typu &lt;b&gt;Event&lt;/b&gt;, profil z kontekstem &lt;b&gt;Time&lt;/b&gt; gdzie czas &lt;b&gt;From&lt;/b&gt; i &lt;b&gt;To&lt;/b&gt; jest ustawiony ten sam oraz profil z kontekstem &lt;b&gt;Time&lt;/b&gt; z włączoną opcję &lt;b&gt;Repeat&lt;/b&gt;.&lt;/li&gt;&lt;/ul&gt;
&lt;br&gt;
&lt;ul&gt;&lt;b&gt;Statusy tasków&lt;/b&gt;&lt;li&gt;&lt;i&gt;RejBad&lt;/i&gt; task został odrzucony np. nie miał zadeklarowanych akcji.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;RejCopy&lt;/i&gt; task został odrzucony gdyż uruchomiona jest jego druga kopia z włączoną opcją &lt;b&gt;Abort New Task&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;RejMaxQ&lt;/i&gt; osiągnięto maksymalną długość kolejki tasków, którą można skonfigurować w opcjach.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Running&lt;/i&gt; task został dołączony do kolejki tasków i zaczyna być wykonywany.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;ExitErr&lt;/i&gt; wykonywanie tasku zostało zatrzymane ze względu na pojawienie się błędu.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;ExitOK&lt;/i&gt; wykonano wszystkie akcje tasku.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;ExitRep&lt;/i&gt; task został zatrzymany gdyż uruchomiona została jego druga kopia z włączoną opcją &lt;b&gt;Abort Existing Task&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;ExitKill&lt;/i&gt; task został zatrzymany gdyż usługa Taskera została zatrzymana.&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;ul&gt;&lt;b&gt;Statusy akcji&lt;/b&gt;&lt;li&gt;&lt;i&gt;Disabled&lt;/i&gt; akcja została wyłączona przez użytkownika i pominięta podczas wykonywania tasku.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Err&lt;/i&gt; podczas wykonywania akcji wystąpił błąd, który spowodował przerwanie wykonywania tasku.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;ErrIgnore&lt;/i&gt; podczas wykonywania akcji wystąpił błąd ale wykonywanie tasku nie zostało przerwane, prawdopodobnie przez zaznaczoną opcję &lt;b&gt;Continue On Error&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Exception&lt;/i&gt; wystąpił niespodziewany błąd, prawdopodobnie spowodowany przez system operacyjny lub Taskera, co spowodowało zatrzymanie wykonywania tasku.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;OK&lt;/i&gt; akcja wykonana poprawnie.&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;
To tyle na dziś. Jeśli będziesz miał pytania lub coś wyda Ci się niezrozumiałe to zapraszam do zadawania pytań w komentarzach. Postaram się pomóc.&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/8416167295305878840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/8416167295305878840'/><link rel='alternate' type='text/html' href='http://tasker-android.blogspot.com/2015/01/diagnozowanie-bedow-w-taskerze.html' title='Diagnozowanie błędów w Taskerze'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05046866348300228265</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7qAzbU0Zui05exriYxScNs-LRk20BR8rj5KDJ2qgAVuH65JQmWDdgMT5XZIcOxkMORnoJr1ObymxzB_Ldex_RsaD1xiDUM2oNnir_NwP65a5R7F3YlqDCkaNtJ_0uXPPvv2a0eEiv7hc/s72-c/krokowo.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-5723209725752603760.post-3174472983618077616</id><published>2014-12-19T09:03:00.000+01:00</published><updated>2014-12-19T09:03:18.884+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="aktualizacja"/><category scheme="http://www.blogger.com/atom/ns#" term="Tasker"/><title type='text'>Tasker - aktualizacja do wersji 4.6</title><content type='html'>&lt;p&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrv2T5cbFkfvWO_jWQhI-vO9sFAGqOA9VrpBKQWJ6sMkTCPMAGIi-MDX1bzLmbUfpSCOeI_YNwUanAdEOk_VP5jA-NTao3VbRUEJCaw1PWNoJl-ljpFte9P2o5Wd-63hJUNQwq4x3p_70/s1600/update.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: none; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrv2T5cbFkfvWO_jWQhI-vO9sFAGqOA9VrpBKQWJ6sMkTCPMAGIi-MDX1bzLmbUfpSCOeI_YNwUanAdEOk_VP5jA-NTao3VbRUEJCaw1PWNoJl-ljpFte9P2o5Wd-63hJUNQwq4x3p_70/s400/update.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Wczoraj pojawiła się nowa wersja Taskera &lt;b&gt;4.6&lt;/b&gt;, a kilka godzin później wersja poprawkowa &lt;b&gt;4.6u1&lt;/b&gt;. Zachęcam do aktualizacji.&lt;/p&gt;
&lt;h3&gt;Lista zmian&lt;/h3&gt;
&lt;p&gt;&lt;ul&gt;
  &lt;li&gt;support for direct calling of Java functions integrated in normal task flow, see Java in the userguide&lt;/li&gt;
  &lt;li&gt;test tasks step-by-step and see status of each action as it completes&lt;/li&gt;
  &lt;li&gt;support for interrupt mode on Android 5.0+&lt;/li&gt;
  &lt;li&gt;added: action App / List Apps&lt;/li&gt;
  &lt;li&gt;added: action Script / Java Function, for calling Java functions&lt;/li&gt;
  &lt;li&gt;added: action Script / Java Object, for manipulation of Java objects&lt;/li&gt;
  &lt;li&gt;added: many long selection lists have a filter field&lt;/li&gt;
  &lt;li&gt;added: builtin local var %err (error in last enabled action if set)&lt;/li&gt;
  &lt;li&gt;added: task edit screen: currently executing action and status for past-actions displayed when testing&lt;/li&gt;
  &lt;li&gt;added: task edit screen: step-by-step task execution button&lt;/li&gt;
  &lt;li&gt;added: task tab double-click menu: Kill All option&lt;/li&gt;
  &lt;li&gt;added: monitor notification, set category to service (Lollipop+)&lt;/li&gt;
  &lt;li&gt;added: action Interrupt Mode (Lollipop+)&lt;/li&gt;
  &lt;li&gt;added: variable %UIMODE: watch (Lollipop+)&lt;/li&gt;
  &lt;li&gt;added: Italian translation (not userguide)&lt;/li&gt;
  &lt;li&gt;added: show in profile list whether a profile&#39;s tasks are locked or not&lt;/li&gt;
  &lt;li&gt;added: builtin action plugin list, added AutoInput&lt;/li&gt;
  &lt;li&gt;added: action Net / Test Net: support for bluetooth and ethernet
  &lt;li&gt;bugfix:action list: don&#39;t evaluate conditions for disabled actions&lt;/li&gt;
  &lt;li&gt;bugfix:test display res/DPI: was caching values and therefore reporting wrong ones after a display rotation&lt;/li&gt;
  &lt;li&gt;bugfix:%SILENT: report on when device interrupt mode is priority or none (Lollipop+)&lt;/li&gt;
  &lt;li&gt;bugfix:action Element Text with TextEdit element: couldn&#39;t set to zero-length&lt;/li&gt;
  &lt;li&gt;bugfix:element Button: labels were all uppercase (Lollipop+)&lt;/li&gt;
  &lt;li&gt;bugfix:task edit: rotation animation for opening/closing blocks was messed up (Lollipop+)&lt;/li&gt;
  &lt;li&gt;bugfix:action Beep: Amplitude parameter was being measured in ms instead of %&lt;/li&gt;
  &lt;li&gt;bugfix:action Show Scene / Continue Task Immediately: when deselected sometimes wasn&#39;t respected if scene was hidden&lt;/li&gt;
  &lt;li&gt;bugfix:action List Files: using root, if the dir wasn&#39;t reachable without root in pre-check would fail&lt;/li&gt;
  &lt;li&gt;bugfix:Userguide / Variables / Scene Local: behaviour was incorrectly documented&lt;/li&gt;
  &lt;li&gt;bugfix:swiping Tasker from recent apps list was closing the list (Lollipop+)&lt;/li&gt;
  &lt;li&gt;bugfix:when task was locked in UI, could be accessed via profile list without entering code if profile was locked&lt;/li&gt;
  &lt;li&gt;bugfix:Test Net: needed permission was missing in exported apps&lt;/li&gt;
  &lt;li&gt;bugfix:displayed scenes weren&#39;t generating accessibility events (e.g. for %WIN, Event / Button Widget)
  &lt;li&gt;change: action JavaScript(let): replace variables in Libraries parameter&lt;/li&gt;
  &lt;li&gt;change: action category Script -&gt; Code&lt;/li&gt;
  &lt;li&gt;change: plugin actions/events/states are grouped per plugin app&lt;/li&gt;
  &lt;li&gt;change: action Run Shell: result code is stored in %err (if not 0) (and previously specified for backwards compatibility)&lt;/li&gt;
  &lt;li&gt;change: refreshed French, Spanish and Simplified Chinese translations&lt;/li&gt;
  &lt;li&gt;change: switched app detection to using an Accessibility Service please enable Tasker&#39;s service in Android Accessibility settings (Lollipop+)
  &lt;li&gt;removed: action Take Call: not available on Lollipop+ (Google not granting the needed permission)&lt;/li&gt;
  &lt;li&gt;removed: action Keyguard: apparently causing blackouts (Lollipop+)&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;h3&gt;Pobieranie&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm&quot; title=&quot;Tasker&quot; rel=&quot;nofollow&quot;&gt;Google Play&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;http://tasker.dinglisch.net/download.html&quot; title=&quot;Tasker for Android&quot; rel=&quot;nofollow&quot;&gt;Strona Taskera&lt;/a&gt;&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/3174472983618077616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/3174472983618077616'/><link rel='alternate' type='text/html' href='http://tasker-android.blogspot.com/2014/12/tasker-aktualizacja-do-wersji-46.html' title='Tasker - aktualizacja do wersji 4.6'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05046866348300228265</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrv2T5cbFkfvWO_jWQhI-vO9sFAGqOA9VrpBKQWJ6sMkTCPMAGIi-MDX1bzLmbUfpSCOeI_YNwUanAdEOk_VP5jA-NTao3VbRUEJCaw1PWNoJl-ljpFte9P2o5Wd-63hJUNQwq4x3p_70/s72-c/update.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-5723209725752603760.post-1445323580596683156</id><published>2014-12-11T22:47:00.001+01:00</published><updated>2014-12-11T22:47:44.853+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delete File"/><category scheme="http://www.blogger.com/atom/ns#" term="Flash"/><category scheme="http://www.blogger.com/atom/ns#" term="If"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenVPN"/><category scheme="http://www.blogger.com/atom/ns#" term="Read File"/><category scheme="http://www.blogger.com/atom/ns#" term="Run Shell"/><category scheme="http://www.blogger.com/atom/ns#" term="Tasker"/><category scheme="http://www.blogger.com/atom/ns#" term="Variable Clear"/><category scheme="http://www.blogger.com/atom/ns#" term="Variable Search Replace"/><category scheme="http://www.blogger.com/atom/ns#" term="Variable Set"/><category scheme="http://www.blogger.com/atom/ns#" term="VPN"/><category scheme="http://www.blogger.com/atom/ns#" term="WiFi"/><category scheme="http://www.blogger.com/atom/ns#" term="Wifi Connected"/><title type='text'>Tasker i OpenVPN czyli dbamy o bezpieczeństwo</title><content type='html'>&lt;p&gt;Jako, że od zawsze staram się dbać o bezpieczeństwo swoich danych i prywatności (przynajmniej na ile to możliwe w dzisiejszych czasach) unikam łączenia telefonu z nieszyfrowanymi sieciami &lt;b&gt;WiFi&lt;/b&gt;. Niestety zdarzają się sytuacje, w których, trzeba z takich sieci skorzystać. Nie ma wtedy pewności czy hasła i loginy nie wpadną w łapy jakiegoś domorosłego &quot;hakiera&quot; bawiącego się w podszywanie pod punkt dostępowy. Rozwiązaniem tego problemu jest zastosowanie wirtualnych połączeń prywatnych czyli &lt;a href=&quot;https://pl.wikipedia.org/wiki/Virtual_Private_Network&quot;  title=&quot;VPN&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;VPN&lt;/a&gt;, które tworzą szyfrowany tunel do serwera &lt;b&gt;VPN&lt;/b&gt; i dane, które urządzenie przesyła są bezpieczne. Aby zdobyć dostęp do serwera &lt;b&gt;VPN&lt;/b&gt; można wykupić sobie taką usługę, znaleźć darmowego dostawcę lub zrobić wszystko samemu, którą to opcję polecam. Coraz więcej nowoczesnych routerów posiada możliwość uruchomienia serwera &lt;b&gt;OpenVPN&lt;/b&gt; w oprogramowaniu firmowym. Osobiście preferuję alternatywne oprogramowania dla routerów i praktycznie każdy z dostępnych (&lt;b&gt;DD-WRT&lt;/b&gt;/&lt;b&gt;Tomato&lt;/b&gt;/ &lt;b&gt;OpenWRT&lt;/b&gt;/&lt;b&gt;Gargoyle&lt;/b&gt;) udostępnia taką funkcjonalność. O konfiguracji usługi na routerze bądź wgrywaniu alternatywnego oprogramowania nie będę się tu rozpisywał ale jakby było zapotrzebowanie to chętnie pomogę. Należy tylko pamiętać, że konfigurując serwer należy wybrać opcję przesyłania pełnego ruchu sieciowego przez serwer.&lt;/p&gt;
&lt;h3&gt;Wymagania&lt;/h3&gt;
&lt;p&gt;Zakładam więc, że masz skonfigurowany serwer OpenVPN w routerze i utworzony profil dla telefonu. Co teraz? Potrzebny Ci będzie klient usługi &lt;b&gt;OpenVPN&lt;/b&gt;, plugin do Taskera umożliwiający sterowanie połączeniem &lt;b&gt;VPN&lt;/b&gt; oraz mój profil, który automatycznie będzie uruchamiał szyfrowany tunel w momencie połączenia z nieszyfrowaną siecią &lt;b&gt;WiFi&lt;/b&gt;.&lt;/br&gt;
Jako klienta usługi stosuję &lt;a href=&quot;https://play.google.com/store/apps/details?id=de.blinkt.openvpn&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot; title=&quot;OpenVPN for Android&quot;&gt;OpenVPN for Android&lt;/a&gt;, a &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.ffrog8.openVpnTaskerPlugin&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot; title=&quot;OpenVPN Tasker Plugin&quot;&gt;OpenVPN Tasker Plugin&lt;/a&gt; zapewnia mi współpracę z Taskerem. Konfiguracja &lt;b&gt;OpenVPN for Android&lt;/b&gt; polega na imporcie pliku z rozszerzeniem &lt;span class=&quot;code&quot;&gt;ovpn&lt;/span&gt; po naciśnięciu klawisza &lt;b&gt;Wczytaj&lt;/b&gt;.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEZ9g9-XuqhLuA7VJuZVueyt758mlYsN9Sf2I6VQJcCWIv_tfOGngfrI0Eca1bgdDjGcDKra1A4eMbOuhKtldTAa6WGrp9vEIdNSpC5cD_lcybLTW0sVvLPLZRD9HZu8vdBeOTZvm52hc/s1600/Openvpn.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEZ9g9-XuqhLuA7VJuZVueyt758mlYsN9Sf2I6VQJcCWIv_tfOGngfrI0Eca1bgdDjGcDKra1A4eMbOuhKtldTAa6WGrp9vEIdNSpC5cD_lcybLTW0sVvLPLZRD9HZu8vdBeOTZvm52hc/s640/Openvpn.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
&lt;b&gt;OpenVPN Tasker Plugin&lt;/b&gt; nie wymaga konfiguracji. Po uruchomieniu wtyczka wyświetla status Aplikacji &lt;b&gt;OpenVPN for Android&lt;/b&gt; i &lt;b&gt;Taskera&lt;/b&gt;.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8nXxTAyBV9yD1TYl76dDT9dmBz7sDyRvAFEg3CFx0CXy-7E8H2rR-NOei9laqOf3i8uBCK43cN_BXtxWmhqyT0KbQaa4-6uflxsu_oHpJhKEeYB8mCk6NyHxwx2Chgm90om6QCLdeYRE/s1600/Screenshot_2014-12-08-21-26-25.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8nXxTAyBV9yD1TYl76dDT9dmBz7sDyRvAFEg3CFx0CXy-7E8H2rR-NOei9laqOf3i8uBCK43cN_BXtxWmhqyT0KbQaa4-6uflxsu_oHpJhKEeYB8mCk6NyHxwx2Chgm90om6QCLdeYRE/s640/Screenshot_2014-12-08-21-26-25.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;
&lt;h3&gt;Opis wykonania&lt;/h3&gt;
&lt;p&gt;Jako, że połączenie z serwerem &lt;b&gt;OpenVPN&lt;/b&gt; ma następować w momencie połączenia z niezabezpieczoną siecią &lt;b&gt;WiFi&lt;/b&gt; do realizacji tego zadania wykorzystam profil &lt;a href=&quot;http://tasker-android.blogspot.com/2014/08/profil-tost-z-danymi-sieci-wifi-po.html&quot;&gt;Tost z danymi sieci WiFi po połączeniu&lt;/a&gt;.&lt;br&gt;
Mam więc profil aktywowany poprzez &lt;b&gt;WiFi Connected&lt;/b&gt;. W jego tasku wejściowym wartość zmiennej &lt;span class=&quot;code&quot;&gt;%WIFII&lt;/span&gt; przekazywana jest do zmiennej lokalnej &lt;span class=&quot;code&quot;&gt;%wifiinfo&lt;/span&gt;, za pomocą akcji &lt;b&gt;Variable Search Replace&lt;/b&gt; z warunkiem RegEx &lt;span class=&quot;code&quot;&gt;(?&lt;=(\n)).*&lt;/span&gt; wpisanym w pole &lt;b&gt;Search&lt;/b&gt; i odznaczoną opcją &lt;b&gt;Replace Matches&lt;/b&gt; zawartość zmiennej zostaje podzielona na poszczególne linie, które zostają zachowane w zmiennej &lt;span class=&quot;code&quot;&gt;%wifiinfo&lt;/span&gt; tworząc macierz. Użyte wyrażenie regularne wyszukuje tekst, po którym występuje znak &lt;span class=&quot;code&quot;&gt;\n&lt;/span&gt; czyli znak końca linii. Po tej operacji dostęp do poszczególnych linii jest możliwy poprzez podanie w parametrze numeru elementu macierzy np. &lt;span class=&quot;code&quot;&gt;%wifiinfo(3)&lt;/span&gt; lub &lt;span class=&quot;code&quot;&gt;%wifiinfo3&lt;/span&gt;. Następnie, znów za pomocą akcji &lt;b&gt;Variable Search Replace&lt;/b&gt;, tym razem z zaznaczoną opcję &lt;b&gt;Replace Matches&lt;/b&gt; i pustą zawartością pola &lt;b&gt;Replace With&lt;/b&gt; czyszczę poszczególne linie z niepotrzebnych znaków &lt;span class=&quot;code&quot;&gt;&quot;&lt;/span&gt; i tekstów by za moment wyświetlić tost z danymi sieci WiFi jeśli ekran jest włączony.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9rsAx9qFAT3nj_BwI6AH7j6akmjfjrFAxARG0GikKSg-FCm_1Dp6F-7a7ZJJWy4CebsWmQCpH-wZZak_uzlOlxARJc71z7D_dLnuRFMDW1_D8-kzIuf6N2jy6yi-cq_rI2IgGGNeyFw0/s1600/opnvpn_1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9rsAx9qFAT3nj_BwI6AH7j6akmjfjrFAxARG0GikKSg-FCm_1Dp6F-7a7ZJJWy4CebsWmQCpH-wZZak_uzlOlxARJc71z7D_dLnuRFMDW1_D8-kzIuf6N2jy6yi-cq_rI2IgGGNeyFw0/s640/opnvpn_1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;
&lt;p&gt;
W kolejnym kroku sprawdzane jest czy sieć &lt;b&gt;WiFi&lt;/b&gt;, do której właśnie podłączyło się urządzenie jest siecią domową (lub inną, dla której nie chcesz włączać połączenia &lt;b&gt;VPN&lt;/b&gt;). Oczywiście możesz podać nazwy kilku sieci oddzielone znakiem &lt;span class=&quot;code&quot;&gt;/&lt;/span&gt; oraz podać maskę co zapewni omijanie wszystkich sieci, do których masz zaufanie.&lt;br&gt;
Nastepnie za pomocą komend powłoki systemu umieszczonych w akcji &lt;b&gt;Run Shell&lt;/b&gt; kopiowany jest plik &lt;b&gt;wpa_supplicant.conf&lt;/b&gt; do tymczasowego katalogu Taskera. W pliku tym system przechowuje dane wszystkich znanych mu sieci. Dla akcji tej konieczne jest zaznaczenie opcji &lt;b&gt;Use Root&lt;/b&gt;, a więc właściciele urządzeń bez dostępu do &lt;b&gt;root&lt;/b&gt; nie skorzystają z tego profilu. Po wczytaniu zawartości pliku do zmiennej &lt;span class=&quot;code&quot;&gt;%wpa_supplicant&lt;/span&gt; za pomocą akcji &lt;b&gt;Read File&lt;/b&gt; plik jest kasowany z katalogu tymczasowego za pomocą akcji &lt;b&gt;Delete File&lt;/b&gt;.&lt;br&gt;
Następnym zadaniem jest wyłuskanie z pliku listy nazw zapamiętanych sieci oraz sposobu ich zabezpieczenia. Wykonywane jest to za pomocą akcji &lt;b&gt;Variable Search Replace&lt;/b&gt; bez zaznaczonej opcji &lt;b&gt;Replace Matches&lt;/b&gt;. W pierwszym przypadku użyto wyrażenia regularnego &lt;span class=&quot;code&quot;&gt;(?&lt;=(ssid=&quot;).*(?=(&quot;\n))&lt;/span&gt;, które wyszukuje teksty znajdujące się pomiędzy &lt;span class=&quot;code&quot;&gt;ssid=&quot;&lt;/span&gt;, a &lt;span class=&quot;code&quot;&gt;&quot;\n&lt;/span&gt; i przekazuje je w formie macierzy do zmiennej &lt;span class=&quot;code&quot;&gt;%lista_ssid&lt;/span&gt;. W drugim przypadku wyrażenie regularne &lt;span class=&quot;code&quot;&gt;(?&lt;=(key_mgmt=)).*(?=(\n))&lt;/span&gt; wyszukuje teksty znajdujące się pomiędzy &lt;span class=&quot;code&quot;&gt;key_mgmt=&lt;/span&gt;, a znakiem końca linii i przekazuje je w formie macierzy do zmiennej &lt;span class=&quot;code&quot;&gt;%typy_kluczy&lt;/span&gt;.&lt;br&gt;
Teraz można już za pomocą akcji &lt;b&gt;Variable Set&lt;/b&gt; ustalić jaką pozycję na liście ma sieć, do której podłączone jest urządzenie. Wykonywane to jest za pomocą zapisu &lt;span class=&quot;code&quot;&gt;%lista_ssid(#?%wifiinfo2)&lt;/span&gt;, który zwraca z macierzy &lt;span class=&quot;code&quot;&gt;%lista_ssid&lt;/span&gt; numer wartości odpowiadający &lt;span class=&quot;code&quot;&gt;%wifiinfo2&lt;/span&gt; czyli nazwy aktualnie podłączonej sieci. Wartość ta zapisywana jest do zmiennej &lt;span class=&quot;code&quot;&gt;%indeks&lt;/span&gt;.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpcHjB9EoCupW1MdDO6_pRYBvQ3mQeVg28xfhzeBhNmOPmX5oaL_YMP8Ib_L5Z5Jofo-32AZbXppffqtUievj4gaJB2kNSPZUPyMytu879d7ZnHBwcB4jGpRkOSkAWIQjT0PaCetdhCNw/s1600/opnvpn_2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpcHjB9EoCupW1MdDO6_pRYBvQ3mQeVg28xfhzeBhNmOPmX5oaL_YMP8Ib_L5Z5Jofo-32AZbXppffqtUievj4gaJB2kNSPZUPyMytu879d7ZnHBwcB4jGpRkOSkAWIQjT0PaCetdhCNw/s640/opnvpn_2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;
&lt;p&gt;W tym momencie dostępne są już wszystkie dane niezbędne do sprawdzenia czy obecne połączenie jest szyfrowane. Warunkiem &lt;span class=&quot;code&quot;&gt;if&lt;/span&gt; sprawdzane jest czy &lt;span class=&quot;code&quot;&gt;%typy_kluczy(%indeks)&lt;/span&gt; jest różne od &lt;span class=&quot;code&quot;&gt;WPA-PSK&lt;/span&gt; czyli oznaczenia szyfrowania połączenia kluczem &lt;b&gt;WPA&lt;/b&gt;. Jeśli tak task uruchamia połączenie &lt;b&gt;OpenVPN&lt;/b&gt; za pomocą wtyczki ze skonfigurowaną siecią (w moim przypadku nazywa się ona Dom) oraz nadaje zmiennej &lt;span class=&quot;code&quot;&gt;%OpenVPN&lt;/span&gt; wartość &lt;span class=&quot;code&quot;&gt;1&lt;/span&gt;.&lt;br&gt;
Profil wymaga jeszcze tasku wyjściowego, w którym jeśli wartość &lt;span class=&quot;code&quot;&gt;%OpenVPN&lt;/span&gt; jest równa &lt;span class=&quot;code&quot;&gt;1&lt;/span&gt; wtyczka rozłącza połączenie z serwerem i następnie czyszczona jest zmienna &lt;span class=&quot;code&quot;&gt;%OpenVPN&lt;/span&gt;. &lt;br&gt;
Cały profil wygląda następująco:
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEji3WI-9FJjdsogFYIBYB2kyXkFVxS50_whIHWubZnwk1ozH4rGbrYDl2gTyvnbPJNsS5q2o_n6ZRppePNNnfA5HLOISjno3Oqyl4x1_W2jW9z59uaz8bdrGazDrFGWHf3SBdAmts4F7DI/s1600/opnvpn_3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEji3WI-9FJjdsogFYIBYB2kyXkFVxS50_whIHWubZnwk1ozH4rGbrYDl2gTyvnbPJNsS5q2o_n6ZRppePNNnfA5HLOISjno3Oqyl4x1_W2jW9z59uaz8bdrGazDrFGWHf3SBdAmts4F7DI/s640/opnvpn_3.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioQsBvuLEIfHtnU0O5HLNw_k97L2flC9_fq-tfnWNdb_yn2jZqi32zLKck-IG0hzM48M7H7ckhRKMMzNvTH3F_xDqryTgZwpcLAaGK39Q8VKnlDRi7SPnnr-OD9jw4QxAeQlKticBbYeY/s1600/opnvpn_4.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioQsBvuLEIfHtnU0O5HLNw_k97L2flC9_fq-tfnWNdb_yn2jZqi32zLKck-IG0hzM48M7H7ckhRKMMzNvTH3F_xDqryTgZwpcLAaGK39Q8VKnlDRi7SPnnr-OD9jw4QxAeQlKticBbYeY/s640/opnvpn_4.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;
&lt;h3&gt;Rozpisany profil&lt;/h3&gt;
&lt;p&gt;&lt;div class=&quot;code&quot;&gt;
Profile: Połączone WiFi (177)&lt;br&gt;
State: Wifi Connected [ SSID:* MAC:* IP:* ]&lt;br&gt;
Enter: Anon (178)&lt;br&gt;
A1: Variable Set [ Name:%wifiinfo To:%WIFII Do Maths:Off Append:Off ] &lt;br&gt;
A2: Variable Search Replace [ Variable:%wifiinfo Search:(?&lt;=(\n)).* Ignore Case:Off Multi-Line:Off One Match Only:Off Store Matches In:%wifiinfo Replace Matches:Off Replace With: ] &lt;br&gt;
A3: Variable Search Replace [ Variable:%wifiinfo2 Search:&quot; Ignore Case:Off Multi-Line:Off One Match Only:Off Store Matches In:%wifiinfo2 Replace Matches:On Replace With: ] &lt;br&gt;
A4: If [ %SCREEN ~ on ]&lt;br&gt;
A5: Variable Search Replace [ Variable:%wifiinfo5 Search:IP :  Ignore Case:Off Multi-Line:Off One Match Only:Off Store Matches In:%wifiinfo5 Replace Matches:On Replace With: ] &lt;br&gt;
A6: Variable Search Replace [ Variable:%wifiinfo7 Search:Spd:  Ignore Case:Off Multi-Line:Off One Match Only:Off Store Matches In:%wifiinfo7 Replace Matches:On Replace With: ] &lt;br&gt;
A7: Flash [ Text:Połączono z siecią %wifiinfo2&lt;br&gt;
Adres IP: %wifiinfo5&lt;br&gt;
Prędkość: %wifiinfo7 Long:On ] &lt;br&gt;
A8: End If &lt;br&gt;
A9: If [ %wifiinfo2 !~ Siec_domowa ]&lt;br&gt;
A10: Run Shell [ Command:mkdir -p /sdcard/Tasker/tmp&lt;br&gt;
cp /data/misc/wifi/wpa_supplicant.conf /sdcard/Tasker/tmp Timeout (Seconds):0 Use Root:On Store Output In: Store Errors In: Store Result In: Continue Task After Error:On ] &lt;br&gt;
A11: Read File [ File:/sdcard/Tasker/tmp/wpa_supplicant.conf To Var:%wpa_supplicant ] &lt;br&gt;
A12: Delete File [ File:/sdcard/Tasker/tmp/wpa_supplicant.conf Shred Level:0 Use Root:Off ] &lt;br&gt;
A13: Variable Search Replace [ Variable:%wpa_supplicant Search:(?&lt;=(ssid=&quot;)).*(?=(&quot;\n)) Ignore Case:Off Multi-Line:Off One Match Only:Off Store Matches In:%lista_ssid Replace Matches:Off Replace With: ] &lt;br&gt;
A14: Variable Search Replace [ Variable:%wpa_supplicant Search:(?&lt;=(key_mgmt=)).*(?=(\n)) Ignore Case:Off Multi-Line:Off One Match Only:Off Store Matches In:%typy_kluczy Replace Matches:Off Replace With: ] &lt;br&gt;
A15: Variable Set [ Name:%indeks To:%lista_ssid(#?%wifiinfo2) Do Maths:Off Append:Off ] &lt;br&gt;
A16: If [ %typy_kluczy(%indeks) !~ WPA-PSK ]&lt;br&gt;
A17: OpenVPN [ Configuration:Connect (Dom) Package:com.ffrog8.openVpnTaskerPlugin Name:OpenVPN Timeout (Seconds):0 ] &lt;br&gt;
A18: Variable Set [ Name:%OpenVPN To:1 Do Maths:Off Append:Off ]&lt;br&gt;
&lt;br&gt;
Exit: Anon (258)&lt;br&gt;
A1: If [ %OpenVPN = 1 ]&lt;br&gt;
A2: OpenVPN [ Configuration:Disconnect Package:com.ffrog8.openVpnTaskerPlugin Name:OpenVPN Timeout (Seconds):0 ] &lt;br&gt;
A3: Variable Clear [ Name:%OpenVPN Pattern Matching:Off ] 
&lt;/div&gt;&lt;/p&gt;

&lt;h3&gt;Pobieranie profilu&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://drive.google.com/file/d/0B9CkGmXTLcF0Umd2TlpSZjNMTkE&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;WiFi połączone / OpenVPN&lt;/a&gt; [Tasker 4.6b7]&lt;/p&gt;

&lt;h3&gt;Podziękowania&lt;/h3&gt;
&lt;p&gt;Dziękuję &lt;a href=&quot;https://plus.google.com/u/0/116957486018122295424&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot; title=&quot;Mariusz Turek&quot;&gt;Mariuszowi &quot;mrtur&quot; Turkowi&lt;/a&gt; za pomoc przy testowaniu wykrywania przez Taskera niezabezpieczonych sieci &lt;b&gt;WiFi&lt;/b&gt;.&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/1445323580596683156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/1445323580596683156'/><link rel='alternate' type='text/html' href='http://tasker-android.blogspot.com/2014/12/tasker-openvpn-czyli-dbamy-o-bezpieczenstwo.html' title='Tasker i OpenVPN czyli dbamy o bezpieczeństwo'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05046866348300228265</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEZ9g9-XuqhLuA7VJuZVueyt758mlYsN9Sf2I6VQJcCWIv_tfOGngfrI0Eca1bgdDjGcDKra1A4eMbOuhKtldTAa6WGrp9vEIdNSpC5cD_lcybLTW0sVvLPLZRD9HZu8vdBeOTZvm52hc/s72-c/Openvpn.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-5723209725752603760.post-4726532107613711092</id><published>2014-11-27T16:07:00.001+01:00</published><updated>2014-12-22T09:28:11.411+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="profil"/><category scheme="http://www.blogger.com/atom/ns#" term="task"/><category scheme="http://www.blogger.com/atom/ns#" term="Tasker"/><title type='text'>Właściwości profili i tasków</title><content type='html'>&lt;p&gt;Gdy zaczynałem pisać ten wpis dotyczący właściwości profili i tasków wydawało mi się, że będzie on krótki, zajmie mi mało czasu i napiszę go bez zaglądania do pomocy Taskera. W trakcie pisania okazało się, że temat się rozrósł, a ja muszę przeczytać parę paragrafów pomocy i dowiedzieć się czegoś nowego. Zapraszam do lektury i komentowania.
&lt;h3&gt;Właściwości profili&lt;/h3&gt;
&lt;p&gt;Aby dostać się do właściwości profilu należy dłużej przytrzymać jego nazwę i w górnym pasku pojawią się dodatkowe klawisze, z których drugi od prawej strony prowadzi do właściwości danego profilu. Ekran właściwości prezentuje się następująco: 
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrbM6R1kAwsq93-N6gP7uPNJcPRPWqEQujZxnr5g7l8EQW_cpgE-0aoYpgw7x5TJKB6eIvrgcxf_fMaLBbX3OqcPBKYxYLxRXpjUsI7kGtHepCHf-BnqHp-Q4LwV8u1CQDWbuhBgWywDg/s1600/wlprofi.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrbM6R1kAwsq93-N6gP7uPNJcPRPWqEQujZxnr5g7l8EQW_cpgE-0aoYpgw7x5TJKB6eIvrgcxf_fMaLBbX3OqcPBKYxYLxRXpjUsI7kGtHepCHf-BnqHp-Q4LwV8u1CQDWbuhBgWywDg/s640/wlprofi.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;
&lt;h4&gt;Priorytety tasków&lt;/h4&gt;
&lt;p&gt;Zanim przejdę do omawiania poszczególnych pozycji właściwości profilu muszę nieco przybliżyć sposób w jaki Takser traktuje taski oraz ich priorytety.&lt;br&gt;
Gdy Tasker ma do wykonania jeden task to kolejno wykonuje jego wszystkie akcje. Jeśli jednak w kolejce do wykonania jest więcej tasków Tasker wykonuje je według następujących zasad:
&lt;ul&gt;
  &lt;li&gt;nie może być wykonana więcej niż jedna akcja z danej grupy w tym samym czasie&lt;/li&gt;
  &lt;li&gt;task z wyższym priorytetem jest wykonywany przed taskiem z niższym priorytetem&lt;/li&gt;
  &lt;li&gt;taski o tych samych priorytetach wykonywane są kolejno (ich akcje mogą być wykonywane na przemian) zaczynając od tego, który został dodany do kolejki najwcześniej&lt;/li&gt;
  &lt;li&gt;wyjątek stanowi task będący potomkiem innego tasku, który zostanie wykonany przed pozostałymi taskami czekającymi w kolejce&lt;/li&gt;
&lt;/ul&gt;
Uważny czytelnik zapyta w tym miejscu o wspomniane w pierwszym punkcie grupy akcji. Akcje pod względem prędkości wykonywania i wpływu między sobą zostały podzielone na następujące grupy:
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Speach&lt;/b&gt;: np. akcja &lt;b&gt;Say&lt;/b&gt;&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Javascript&lt;/b&gt;&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Fix&lt;/b&gt;: wszelkie akcje związane z lokalizacją&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Voice&lt;/b&gt;: akcja &lt;b&gt;Get Voice&lt;/b&gt;&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Proxy&lt;/b&gt;: akcje &lt;b&gt;Display Brightness&lt;/b&gt;, &lt;b&gt;Query Action&lt;/b&gt;, &lt;b&gt;Photo&lt;/b&gt;, &lt;b&gt;Photo Series&lt;/b&gt;, &lt;b&gt;Photo Series Time&lt;/b&gt;&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Proxy Scene&lt;/b&gt;: akcje &lt;b&gt;Enter Key&lt;/b&gt;, &lt;b&gt;Menu, Popup&lt;/b&gt;, &lt;b&gt;Popup Task Buttons&lt;/b&gt;, &lt;b&gt;Variable Query&lt;/b&gt;&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Other Scenes&lt;/b&gt;: inne akcje wywołane przez scenę&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Normal&lt;/b&gt;: wszystkie inne akcje&lt;/li&gt;
  &lt;li&gt;akcje &lt;b&gt;Wait&lt;/b&gt; oraz &lt;b&gt;Wait Until&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt; 
Każdy uruchamiany task otrzymuje swój priorytet, który mówi o tym jak szybko będzie wykonany jeśli w kolejce czekają inne taski do wykonania. Im większa wartość priorytetu tym task będzie szybciej wykonany.
&lt;ul&gt;
&lt;li&gt;taski wejściowe profili ustawia się we właściwościach profilu w zakresie 1-10, &lt;b&gt;domyślnie 5&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;taski wyjściowe profili mają priorytet ustawiony na wartość z właściwości profilu plus 11, &lt;b&gt;domyślnie 16&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;taski skrótów i widżetów mają domyślnie ustawiony priorytet na &lt;b&gt;7&lt;/b&gt;, można go zmienić w ustawieniach Taskera&lt;/li&gt;
&lt;li&gt;task uruchomiony przez klawisz Test na ekranie edycji tasku ma priorytet o wartości &lt;b&gt;10&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;task uruchomiony przez element sceny ma priorytet o jeden większy od priorytetu tasku, który wyświetlił scenę&lt;/li&gt;
&lt;/ul&gt;
Jeśli w kolejce czeka kilka tasków pochodzących od tego samego profilu (przykładowo task wejściowy i wyjściowy) to z domyślnymi ustawieniami mamy gwarancję, że task wyjściowy zacznie być wykonywany dopiero po całkowitym zakończeniu tasku wejściowego. Mimo, że task wyjściowy ma większy priorytet. Zachowanie to można zmienić o czym za chwilę.
&lt;/p&gt;
&lt;h4&gt;Launched Task Priority&lt;/h4&gt;
&lt;p&gt;Ustawia wartość priorytetu tasku wejściowego profilu w zakresie 1-10. Domyślna wartość to 5. Od tej wartości zależy też wartość priorytetu tasku wyjściowego, który ustalany jest jako suma wartości ustawionej i 11. Domyślna wartość to 16.&lt;/p&gt;
&lt;h4&gt;Cooldown Time&lt;/h4&gt;
&lt;p&gt;Czas, po którym profil może stać się aktywny mierzony od momentu utraty aktywności przez ten profil. Restart systemu zeruje licznik czasu.&lt;br&gt;
Ja używam tej funkcjonalności dla profilu, który uruchamia mi synchronizację danych z &lt;b&gt;Dropboksem&lt;/b&gt; za pomocą aplikacji &lt;b&gt;DropSync&lt;/b&gt; gdy telefon podłączony jest do ładowarki. &lt;b&gt;Cooldown Time&lt;/b&gt; ustawiłem na 12 godzin i dzięki temu synchronizacja nie jest uruchamiana częściej niż 2 razy na dobę.&lt;/p&gt;
&lt;h4&gt;Limit Repeats&lt;/h4&gt;
&lt;p&gt;Ta opcja włącza limit powtórzeń aktywności profilu.&lt;/p&gt;
&lt;h4&gt;Remaining Repeats&lt;/h4&gt;
&lt;p&gt;W tym miejscu ustawia się limit ilości powtórzeń aktywności profilu.&lt;br&gt;
Przykładowo jeśli ustawisz limit na 10, to za każdym razem gdy dany profil stanie się aktywny licznik ten zmniejszy się o 1, a gdy osiągnie 0, profil mimo spełnionych warunków kontekstów nie stanie się aktywny.&lt;/p&gt;
&lt;h4&gt;Delete On Zero Repeats&lt;/h4&gt;
&lt;p&gt;Zaznaczenie tej opcji spowoduje, że gdy limit ilości powtórzeń aktywności dojdzie do zera, Tasker usunie profil, którego tyczy się to ustawienie.&lt;/p&gt;
&lt;h4&gt;Restore Settings&lt;/h4&gt;
&lt;p&gt;Opcja ta decyduje czy przy dezaktywacji profilu będą przywracane wartości ustawień zmienionych za pomocą akcji typu ustawienie wykonanych w tasku wejściowym.&lt;/p&gt;
&lt;h4&gt;Enforce Task Order&lt;/h4&gt;
&lt;p&gt;Zaznaczenie tej opcji zapewnia zakończenie tasku wejściowego danego profilu przed rozpoczęciem tasku wyjściowego.&lt;br&gt;
Przykładowo profil &lt;b&gt;Test&lt;/b&gt; ma task wejściowy &lt;b&gt;enter1&lt;/b&gt;, a w nim za pomocą akcji &lt;b&gt;Perform Task&lt;/b&gt; uruchamiany jest task &lt;b&gt;enter2&lt;/b&gt;, natomiast taskiem wyjściowym profilu jest &lt;b&gt;exit1&lt;/b&gt;, w którym uruchamiany jest task &lt;b&gt;exit2&lt;/b&gt;. Jeśli opcja Enforce Task Order jest zaznaczona to taski wyjściowe zaczną być wykonywane dopiero po zakończeniu tasków enter1 i enter2. Taski &lt;b&gt;enter1&lt;/b&gt; i &lt;b&gt;enter2&lt;/b&gt; będą wykonywane w zależności od nadanych im priorytetów.&lt;br&gt;
Z wyłączoną opcją &lt;b&gt;Enforce Task Order&lt;/b&gt; taski będą wykonywane w kolejności wynikającej z ich priorytetów, a skoro taski wyjściowe mają priorytety większe zostaną wykonane przed zakończeniem tasków wejściowych.&lt;/p&gt;
&lt;h4&gt;Show In Notification Pulldown&lt;/h4&gt;
&lt;p&gt;Opcja ta odpowiada za wyświetlanie nazwy profilu gdy jest on aktywny na powiadomieniu Taskera.&lt;/p&gt;
&lt;h3&gt;Właściwości tasków&lt;/h3&gt;
&lt;p&gt;Ekan właściwości tasku dostępny jest pod drugim klawiszem od prawej strony na dole ekranu edycji tasku i prezentuje się on tak:
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOViCJsWnaDBaiynNFeaODxsQx23xZz2sE7zovsCTfHejMi6KUCPR0ablaKZjJG-xmwDq99EiDXAP6ORk9mBh4JdeMlIIZHnnjSm18KjUy5cDS51wap-XHBLI2DWGTRQyQwoDGW8Z6KYM/s1600/wlasciwosci_tasku.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOViCJsWnaDBaiynNFeaODxsQx23xZz2sE7zovsCTfHejMi6KUCPR0ablaKZjJG-xmwDq99EiDXAP6ORk9mBh4JdeMlIIZHnnjSm18KjUy5cDS51wap-XHBLI2DWGTRQyQwoDGW8Z6KYM/s640/wlasciwosci_tasku.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h4&gt;Collision Handling&lt;/h4&gt;
&lt;p&gt;Czasami zdarzyć się może, że podczas wykonywania tasku jest on uruchamiany ponownie. Opcja ta decyduje jak Tasker ma postępować w takich sytuacjach. Możliwe są trzy warianty:
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Abort New Task&lt;/b&gt; - Tasker zignoruje nową kopię tasku (to działanie jest domyślne)&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Abort Existing Task&lt;/b&gt; - Tasker zatrzyma obecnie wykonywaną kopię tasku i zacznie wykonywanie nowej kopii&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Run Both Together&lt;/b&gt; - Tasker będzie wykonywał obie kopie tasku równocześnie&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;h4&gt;Keep Device Awake&lt;/h4&gt;
&lt;p&gt;Domyślnie dla każdego tasku gwarantowany jest czas równy jednej minucie kiedy Tasker blokuje procesor urządzenia przed przejściem w stan uśpienia. W przypadku tasków, które mogą trwać dłużej zaznaczenie tej opcji zapewni utrzymanie aktywności procesora aż do pełnego wykonania tasku. Należy pamiętać, że w przypadku błędu w tasku, np. zapętlenia, może dojść do szybkiego rozładowania baterii jeśli ta opcja będzie zaznaczona.&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/4726532107613711092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/4726532107613711092'/><link rel='alternate' type='text/html' href='http://tasker-android.blogspot.com/2014/11/wasciwosci-profili-i-taskow.html' title='Właściwości profili i tasków'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05046866348300228265</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrbM6R1kAwsq93-N6gP7uPNJcPRPWqEQujZxnr5g7l8EQW_cpgE-0aoYpgw7x5TJKB6eIvrgcxf_fMaLBbX3OqcPBKYxYLxRXpjUsI7kGtHepCHf-BnqHp-Q4LwV8u1CQDWbuhBgWywDg/s72-c/wlprofi.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-5723209725752603760.post-3532374721350596620</id><published>2014-11-27T08:52:00.001+01:00</published><updated>2014-11-27T08:52:27.658+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="2G/3G"/><category scheme="http://www.blogger.com/atom/ns#" term="plugin"/><category scheme="http://www.blogger.com/atom/ns#" term="Tasker"/><category scheme="http://www.blogger.com/atom/ns#" term="Toggle Network Type"/><title type='text'>Przełączanie Taskerem trybów transferu danych 2G/3G pod Androidem 5.0</title><content type='html'>&lt;p&gt;Jako, że ostatnio przesiadłem się na Androida 5.0 musiałem stawić czoła dostosowaniu profilów Taskera do nowego systemu. Wcześniej używałem systemu bazującego na CM i AOSP więc możliwości współpracy z Taskerem były dużo większe.&lt;br&gt;
Jedyną funkcją, której przez ostatnie dni nie udało mi się uzyskać było przełączanie trybów transferu danych 2G/3G. Jako, że dla Androida 5.0 nie ma jeszcze aplikacji &lt;b&gt;Xposed&lt;/b&gt; i modów dla niej sprawa wydawała się przegrana.&lt;br&gt;
Jednak przedwczoraj, niespodziewanie, trafiłem na aplikację &lt;b&gt;Toggle Network Type 5.0&lt;/b&gt;. Okazało się, że świetnie ona sobie radzi z przełączeniem 2G/3G pod Lizakiem, ma ładny widżet, a w dodatku jest pluginem do Taskera. Po dwóch dniach testów stwierdzam, że działa bezbłędnie. Polecam.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjO2B4YHlkieP1gu2YH9i7znL9zjUXfuawagpo_cUy8I40eOgl_nIhTzVZ9V8oE0UIn4EfK8lLbCEARG6gxLpLiTYgZUWv9Cptahp1M7VYaqHvxyfuo4l9hPaknTwGdcKizdPhiNiI1W3c/s1600/2g-3g.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjO2B4YHlkieP1gu2YH9i7znL9zjUXfuawagpo_cUy8I40eOgl_nIhTzVZ9V8oE0UIn4EfK8lLbCEARG6gxLpLiTYgZUWv9Cptahp1M7VYaqHvxyfuo4l9hPaknTwGdcKizdPhiNiI1W3c/s640/2g-3g.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;
&lt;h3&gt;Pobieranie&lt;/h3&gt;
Aplikację można pobrać ze sklepu &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.cygery.togglenetworktype&quot;  title=&quot;Toggle Network Type 5.0&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Google Play&lt;/a&gt; gdzie obecnie jest na nią promocja i kosztuje 4,15 zł lub z &lt;a href=&quot;http://forum.xda-developers.com/android/apps-games/widget-toggle-network-type-5-0-xda-t2945406&quot; title=&quot;Toggle Network Type 5.0&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;xda-developers&lt;/a&gt; gdzie rozdawana jest za darmo.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/3532374721350596620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/3532374721350596620'/><link rel='alternate' type='text/html' href='http://tasker-android.blogspot.com/2014/11/przelaczanie-taskerem-2g-3g-android-5.html' title='Przełączanie Taskerem trybów transferu danych 2G/3G pod Androidem 5.0'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05046866348300228265</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjO2B4YHlkieP1gu2YH9i7znL9zjUXfuawagpo_cUy8I40eOgl_nIhTzVZ9V8oE0UIn4EfK8lLbCEARG6gxLpLiTYgZUWv9Cptahp1M7VYaqHvxyfuo4l9hPaknTwGdcKizdPhiNiI1W3c/s72-c/2g-3g.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-5723209725752603760.post-245894094969971852</id><published>2014-11-06T20:28:00.001+01:00</published><updated>2014-11-13T21:33:12.117+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Google Inbox"/><category scheme="http://www.blogger.com/atom/ns#" term="Inbox"/><category scheme="http://www.blogger.com/atom/ns#" term="zaproszenia"/><title type='text'>Zaproszenia do Google Inbox</title><content type='html'>&lt;p&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaujHjJP7PPM9WdTUIiR4kMXTQ5YSy7TBAQ-McTDHYHKp6lUsh4gShe-x5Bqv5_flaeKjujighp6RnU7hSG9BkJzn16gZawhBjqWJBFEqcn6xosnY9Q04aRCDRujzRsxRi-sucHux9zko/s1600/inbox-by-google.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaujHjJP7PPM9WdTUIiR4kMXTQ5YSy7TBAQ-McTDHYHKp6lUsh4gShe-x5Bqv5_flaeKjujighp6RnU7hSG9BkJzn16gZawhBjqWJBFEqcn6xosnY9Q04aRCDRujzRsxRi-sucHux9zko/s640/inbox-by-google.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Jeśli ktoś szuka zaproszeń do &lt;b&gt;Google Inbox&lt;/b&gt; to ja dysponuje trzema i chętnie się podzielę. Wystarczy poprzez Hangouts lub maila podesłać swój adres Gmail (proszę nie zostawiać adresów w komentarzach).
&lt;/p&gt;
&lt;h3&gt;Aktualizacja&lt;/h3&gt;
&lt;p&gt;Obecnie mam 5 zaproszeń do rozdania. Ktoś chętny?&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/245894094969971852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/245894094969971852'/><link rel='alternate' type='text/html' href='http://tasker-android.blogspot.com/2014/11/zaproszenia-do-google-inbox.html' title='Zaproszenia do Google Inbox'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05046866348300228265</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaujHjJP7PPM9WdTUIiR4kMXTQ5YSy7TBAQ-McTDHYHKp6lUsh4gShe-x5Bqv5_flaeKjujighp6RnU7hSG9BkJzn16gZawhBjqWJBFEqcn6xosnY9Q04aRCDRujzRsxRi-sucHux9zko/s72-c/inbox-by-google.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-5723209725752603760.post-7293121383191332710</id><published>2014-11-05T12:03:00.002+01:00</published><updated>2014-12-07T11:16:37.748+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AutoContacts Details"/><category scheme="http://www.blogger.com/atom/ns#" term="AutoVoice"/><category scheme="http://www.blogger.com/atom/ns#" term="AutoVoice Recognize"/><category scheme="http://www.blogger.com/atom/ns#" term="Else"/><category scheme="http://www.blogger.com/atom/ns#" term="End If"/><category scheme="http://www.blogger.com/atom/ns#" term="Goto"/><category scheme="http://www.blogger.com/atom/ns#" term="If"/><category scheme="http://www.blogger.com/atom/ns#" term="Say"/><category scheme="http://www.blogger.com/atom/ns#" term="Send SMS"/><category scheme="http://www.blogger.com/atom/ns#" term="Stop"/><category scheme="http://www.blogger.com/atom/ns#" term="Variable Clear"/><category scheme="http://www.blogger.com/atom/ns#" term="Variable Set"/><category scheme="http://www.blogger.com/atom/ns#" term="Variable Split"/><category scheme="http://www.blogger.com/atom/ns#" term="wyrażenia regularne"/><title type='text'>Profil: Głosowe wysyłanie wiadomości SMS</title><content type='html'>&lt;p&gt;Dziś przedstawię kolejny profil, w którym główne skrzypce odgrywa komunikacja głosowa z urządzeniem. Dokładnie chodzi o podyktowanie i wysłanie wiadomości SMS tylko za pomocą głosu.&lt;br&gt;
Profil uruchamia się następującymi komendami głosowymi:
&lt;ul&gt;
&lt;li&gt;&lt;span class=&quot;code&quot;&gt;wyślij wiadomość do Jan Kowalski&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;code&quot;&gt;wyślij sms do Jan Kowalski&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;code&quot;&gt;wyślij smsa do Jan Kowalski&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;code&quot;&gt;wiadomość do Jan Kowalski&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;code&quot;&gt;sms do Jan Kowalski&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
przy założeniu, że wysłać ma wiadomość do kontaktu Jan Kowalski.&lt;br&gt;
Po uruchomieniu profil sprawdza czy w kontaktach znajduje się kontakt o podanej nazwie oraz czy kontakt ten ma wpisany numer telefonu komórkowego następnie prosi użytkownika o podyktowanie treści wiadomości i jeśli użytkownik zatwierdzi jej poprawność wysyła ją do odbiorcy. W przypadku braku zatwierdzenia poprawności treści wiadomości profil proponuje ponowne jej podyktowanie.&lt;/p&gt;
&lt;h3&gt;Wymagania&lt;/h3&gt;
&lt;p&gt;&lt;ul&gt;
&lt;li&gt;wtyczka &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.joaomgcd.autovoice&quot; title=&quot;AutoVoice&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot; &gt;AutoVoice&lt;/a&gt; w wersji płatnej&lt;/li&gt;
&lt;li&gt;wtyczka &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.joaomgcd.autocontacts&quot; title=&quot;AutoContacts&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot; &gt;AutoContacts&lt;/a&gt; w wersji płatnej&lt;/li&gt;
&lt;li&gt;generator głosu Text-To-Speech, przykładowo &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.ivona.tts&quot; title=&quot;IVONA Text-to-Speech&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;IVONA&lt;/a&gt; lub &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.google.android.tts&quot; title=&quot;Zmiana tekstu na mowę Google&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Google TTS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;do poprawnego działania profilu niezbędny jest porządek w książce adresowej tzn. numery telefonów komórkowych muszą być opisane jako &lt;span class=&quot;code&quot;&gt;komórka&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;h3&gt;Opis wykonania&lt;/h3&gt;
&lt;p&gt;Profil uruchamiany jest za pomocą kontekstu &lt;b&gt;AutoVoice Recognized&lt;/b&gt; z zaznaczoną opcją &lt;b&gt;Event Behavior&lt;/b&gt;, &lt;b&gt;Use Regex&lt;/b&gt; i filtrem komendy ustawionym na &lt;span class=&quot;code&quot;&gt;(?:wyślij )?(?:wiadomość|sms[a]?) do (?&amp;lt;contact&amp;gt;.*)&lt;/span&gt;.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdD-vnaWgR5OCQnEFKL83n5vDPA-MssZ5OcAu_eBea9TXQreogLdwThpJkvRBjUs65p5rkrCTtb6PImOIxZzaJvd6_9pzDpATxZkGewsGGLs4oqduE99pX37yheRo8DPnL0IIOKjWQwg4/s1600/Screenshot_2014-11-05-11-32-17.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdD-vnaWgR5OCQnEFKL83n5vDPA-MssZ5OcAu_eBea9TXQreogLdwThpJkvRBjUs65p5rkrCTtb6PImOIxZzaJvd6_9pzDpATxZkGewsGGLs4oqduE99pX37yheRo8DPnL0IIOKjWQwg4/s640/Screenshot_2014-11-05-11-32-17.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;W tym miejscu spróbuję rozszyfrować ten zapis. Jest to wyrażenie regularne, które pozwala wywołać uruchomienie profilu kilkoma komendami głosowymi według powyższego schematu.&lt;br&gt;
Wyrażenie &lt;span class=&quot;code&quot;&gt;(?:wyślij )?&lt;/span&gt; oznacza, że w komendzie może ale nie musi pojawić się słowo &lt;b&gt;wyślij&lt;/b&gt; ze spacją po nim. Ostatni znak zapytania gwarantuje to, że słowo &lt;b&gt;wyślij&lt;/b&gt; nie jest obligatoryjne. Dzięki temu profil można uruchomić komendą &lt;span class=&quot;code&quot;&gt;wyślij wiadomość do Jan Kowalski&lt;/span&gt; ale również &lt;span class=&quot;code&quot;&gt;wiadomość do Jan Kowalski&lt;/span&gt;.&lt;br&gt;
Zestaw znaków &lt;span class=&quot;code&quot;&gt;(?:   )&lt;/span&gt; tworzy grupę, która w tym przypadku ma tylko jeden element czyli &lt;span class=&quot;code&quot;&gt;wyślij &lt;/span&gt;.&lt;br&gt;
Następna część wyrażenia regularnego &lt;span class=&quot;code&quot;&gt;(?:wiadomość|sms[a]?)&lt;/span&gt; tworzy kolejną grupę, która ma dwa elementy oddzielone znakiem &lt;span class=&quot;code&quot;&gt;|&lt;/span&gt;. Zapis &lt;span class=&quot;code&quot;&gt;sms[a]?&lt;/span&gt; oznacza słowo &lt;b&gt;sms&lt;/b&gt; oraz jeden znak &lt;b&gt;a&lt;/b&gt;, który może ale nie musi wystąpić. Dzięki temu profil zostanie uruchomiony komendą &lt;span class=&quot;code&quot;&gt;wyślij sms do Jan Kowalski&lt;/span&gt; ale także &lt;span class=&quot;code&quot;&gt;wyślij smsa do Jan Kowalski&lt;/span&gt;.&lt;br&gt;
W końcu wyrażenie &lt;span class=&quot;code&quot;&gt;(?&amp;lt;contact&amp;gt;.*)&lt;/span&gt; tworzy parametr, który zostanie przekazany do Taskera w postaci zmiennej &lt;span class=&quot;code&quot;&gt;%contact&lt;/span&gt; czyli w tym przypadku w tej zmiennej znajdzie się wartość &lt;span class=&quot;code&quot;&gt;Jan Kowalski&lt;/span&gt;.&lt;br&gt;
Task zadania zaczyna się od akcji &lt;b&gt;AutoContacts&lt;/b&gt; ze zmienną &lt;span class=&quot;code&quot;&gt;%contact&lt;/span&gt; wpisaną w pole &lt;b&gt;Contact Name or Nickname&lt;/b&gt;. Dzięki temu wtyczka wyszukuje w kontaktach przykładowego &lt;b&gt;Jana Kowalskiego&lt;/b&gt; i wypełnia zmienne danymi jego kontaktu.&lt;br&gt;
Następnie sprawdzana jest zmienna &lt;span class=&quot;code&quot;&gt;%acnumber&lt;/span&gt;, która powinna otrzymać wartość pierwszego numeru telefonu kontaktu. Jeśli nie ma nadanej wartości oznacza task powiadamia głosowo użytkownika o nieznalezieniu kontaktu i zatrzymuje dalsze akcje.&lt;br&gt;
Kolejnym krokiem jest ustalenie, który numer telefonu jest numerem komórkowym. Jeśli numer komórkowy nie zostanie odnaleziony generowana jest głosowa informacja o błędzie, a task zostaje zatrzymany.&lt;br&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5EY3tD3tdOhGLXp83ULKoRFXTtc6oLR2gbfCe5KCDLo4d72WQycIVeHARS73E92yZuDvbzjrFrVbz7tlvnZQmOyLKalUF70dVa9U5OBT-7n3CAeyexlMABgXArFteFpWloTP79LU8NQk/s1600/sms1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5EY3tD3tdOhGLXp83ULKoRFXTtc6oLR2gbfCe5KCDLo4d72WQycIVeHARS73E92yZuDvbzjrFrVbz7tlvnZQmOyLKalUF70dVa9U5OBT-7n3CAeyexlMABgXArFteFpWloTP79LU8NQk/s640/sms1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;Następnie task głosowo prosi o podyktowanie treści wiadomości i za pomocą akcji &lt;b&gt;AutoVoice Recognize&lt;/b&gt; rejestruje co powiedział użytkownik. Kolejnym krokiem jest głosowe odczytanie podyktowanej treści i pytanie czy treść jest poprawna. Jeśli użytkownik potwierdzi poprawność, wiadomość jest wysyłana za pomocą akcji &lt;b&gt;Send SMS&lt;/b&gt;, w której w polu &lt;b&gt;Number&lt;/b&gt; należy podać zmienną &lt;span class=&quot;code&quot;&gt;%komórka&lt;/span&gt;, a w polu &lt;b&gt;Message&lt;/b&gt; &lt;span class=&quot;code&quot;&gt;%sms&lt;/span&gt;. Jeśli użytkownik nie potwierdzi poprawności smsa, task proponuje ponowne podyktowanie wiadomości i wraca do prośby o podyktowanie jej treści.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzGOLmSkJBWlzziZPAVzg0pBPZqmEIU0SETmI21IPyDghDGBxeW9dn-iC2clSSgP0o5dO8fpXRsx3i1G59Za_Jr6bVcNz-vxo0vzLVvVoclGF-U8zFPsz_lXvhLmlyQYBJpwLjgXbJ2Eg/s1600/sms2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzGOLmSkJBWlzziZPAVzg0pBPZqmEIU0SETmI21IPyDghDGBxeW9dn-iC2clSSgP0o5dO8fpXRsx3i1G59Za_Jr6bVcNz-vxo0vzLVvVoclGF-U8zFPsz_lXvhLmlyQYBJpwLjgXbJ2Eg/s640/sms2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;
&lt;h3&gt;Rozpisany profil&lt;/h3&gt;
&lt;p&gt;&lt;div class=&quot;code&quot;&gt;
Profile: Wyślij SMS (193)&lt;br&gt;&lt;br&gt;
State: AutoVoice Recognized [ Configuration:Event Behaviour: true&lt;br&gt;
Command: &quot;(?:wyślij )?(?:wiadomość|sms[a]?) do (?&amp;lt;contact&amp;gt;.+) (regex)&quot; ]&lt;br&gt;
Enter: Anon (200)&lt;br&gt;
A1: AutoContacts [ Configuration:Contact Name or Nickname: %contact Package:com.joaomgcd.autocontacts Name:AutoContacts Timeout (Seconds):1000 Continue Task After Error:On ]&lt;br&gt;
A2: If [ %acnumber !Set ]&lt;br&gt;
A3: Say [ Text:Nie znaleziono kontaktu %contact Engine:Voice:default:default Stream:3 Pitch:5 Speed:5 Respect Audio Focus:Off Network:Off Continue Task Immediately:Off ]&lt;br&gt;
A4: Stop [ With Error:Off Task: ]&lt;br&gt;
A5: End If&lt;br&gt;
A6: Variable Split [ Name:%acallnumbers1 Splitter:, Delete Base:Off ]&lt;br&gt;
A7: Variable Split [ Name:%acallnumbertypes1 Splitter:, Delete Base:Off ]&lt;br&gt;
A8: Variable Set [ Name:%index To:%acallnumbertypes1(#?Komórka) Do Maths:Off Append:Off ]&lt;br&gt;
A9: Variable Split [ Name:%index Splitter:, Delete Base:Off ] If [ %index !~ 0 ]&lt;br&gt;
A10: Variable Set [ Name:%komórka To:%acallnumbers1(%index1) Do Maths:Off Append:Off ] If [ %index !~ 0 ]&lt;br&gt;
A11: If [ %komórka !Set ]&lt;br&gt;
A12: Say [ Text:Nie znaleziono numeru komórkowego kontaktu %acname Engine:Voice:default:default Stream:3 Pitch:5 Speed:5 Respect Audio Focus:Off Network:Off Continue Task Immediately:Off ]&lt;br&gt;
A13: Stop [ With Error:Off Task: ]&lt;br&gt;
A14: End If&lt;br&gt;
&amp;lt;podyktuj&amp;gt;&lt;br&gt;
A15: Say [ Text:Podyktuj wiadomość po sygnale. Engine:Voice:default:default Stream:3 Pitch:5 Speed:5 Respect Audio Focus:Off Network:Off Continue Task Immediately:Off ]&lt;br&gt;
A16: Variable Clear [ Name:%avcomm Pattern Matching:Off ]&lt;br&gt;
A17: AutoVoice Recognize [ Configuration:&lt;br&gt;
Voice command without headset&lt;br&gt;
Command: &quot;all&quot; Package:com.joaomgcd.autovoice Name:AutoVoice Recognize Timeout (Seconds):120 ]&lt;br&gt;
A18: Goto [ Type:Action Label Number:1 Label:podyktuj ] If [ %avcomm !Set ]&lt;br&gt;
A19: Variable Set [ Name:%sms To:%avcomm Do Maths:Off Append:Off ]&lt;br&gt;
A20: Say [ Text:Czy chcesz wysłać wiadomość do %acname o treści: %sms? Engine:Voice:default:default Stream:3 Pitch:5 Speed:5 Respect Audio Focus:Off Network:Off Continue Task Immediately:Off ]&lt;br&gt;
A21: AutoVoice Recognize [ Configuration:&lt;br&gt;
Voice command without headset&lt;br&gt;
Command: &quot;all&quot; Package:com.joaomgcd.autovoice Name:AutoVoice Recognize Timeout (Seconds):120 ]&lt;br&gt;
A22: If [ %avcomm ~ tak ]&lt;br&gt;
A23: Send SMS [ Number:%komórka Message:%sms Store In Messaging App:On ]&lt;br&gt;
A24: Say [ Text:Wiadomość wysłana. Engine:Voice:default:default Stream:3 Pitch:5 Speed:5 Respect Audio Focus:Off Network:Off Continue Task Immediately:Off ]&lt;br&gt;
A25: Else&lt;br&gt;
A26: Say [ Text:Czy chcesz poprawić wiadomość? Engine:Voice:default:default Stream:3 Pitch:5 Speed:5 Respect Audio Focus:Off Network:Off Continue Task Immediately:Off ]&lt;br&gt;
A27: AutoVoice Recognize [ Configuration:&lt;br&gt;
Voice command without headset&lt;br&gt;
Command: &quot;all&quot; Package:com.joaomgcd.autovoice Name:AutoVoice Recognize Timeout (Seconds):120 ]&lt;br&gt;
A28: Goto [ Type:Action Label Number:9 Label:podyktuj ] If [ %avcomm ~ tak ]&lt;br&gt;
A29: End If 
&lt;/div&gt;&lt;/p&gt;

&lt;h3&gt;Pobieranie profilu&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/file/d/0B9CkGmXTLcF0ci16SkVYNGZDTGs&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Profil Głosowe wysyłanie wiadomości sms&lt;/a&gt; [Tasker 4.5u1]&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/7293121383191332710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/7293121383191332710'/><link rel='alternate' type='text/html' href='http://tasker-android.blogspot.com/2014/11/glosowe-wysylanie-wiadomosci-sms.html' title='Profil: Głosowe wysyłanie wiadomości SMS'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05046866348300228265</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdD-vnaWgR5OCQnEFKL83n5vDPA-MssZ5OcAu_eBea9TXQreogLdwThpJkvRBjUs65p5rkrCTtb6PImOIxZzaJvd6_9pzDpATxZkGewsGGLs4oqduE99pX37yheRo8DPnL0IIOKjWQwg4/s72-c/Screenshot_2014-11-05-11-32-17.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-5723209725752603760.post-5863686460733420403</id><published>2014-10-18T21:09:00.001+02:00</published><updated>2014-10-25T12:15:46.294+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AutoContacts"/><category scheme="http://www.blogger.com/atom/ns#" term="AutoContacts Details"/><category scheme="http://www.blogger.com/atom/ns#" term="AutoNotification"/><category scheme="http://www.blogger.com/atom/ns#" term="Browse URL"/><category scheme="http://www.blogger.com/atom/ns#" term="Call"/><category scheme="http://www.blogger.com/atom/ns#" term="Compose SMS"/><category scheme="http://www.blogger.com/atom/ns#" term="End If"/><category scheme="http://www.blogger.com/atom/ns#" term="Goto"/><category scheme="http://www.blogger.com/atom/ns#" term="If"/><category scheme="http://www.blogger.com/atom/ns#" term="Run Shell"/><category scheme="http://www.blogger.com/atom/ns#" term="Status Bar"/><category scheme="http://www.blogger.com/atom/ns#" term="Stop"/><category scheme="http://www.blogger.com/atom/ns#" term="Variable Add"/><category scheme="http://www.blogger.com/atom/ns#" term="Variable Clear"/><category scheme="http://www.blogger.com/atom/ns#" term="Variable Set"/><category scheme="http://www.blogger.com/atom/ns#" term="Variable Split"/><title type='text'>Tasker przypomni Ci o urodzinach, imieninach i rocznicach</title><content type='html'>&lt;p&gt;Odkąd pamiętam mam problem z zapamiętywaniem dat. Z tego powodu zdarza mi się zapomnieć o urodzinach lub imieninach bliskich mi osób. Wpisanie dat do kalendarza częściowo rozwiązuje problem ale zawsze brakowało mi w telefonie przypominajki, którą trudno zignorować. W ten sposób powstał pomysł na projekt Taskera przypominający o urodzinach, imieninach i rocznicach osób z książki adresowej. Projekt codziennie rano i wieczorem wyszukuje w książce adresowej daty urodzin, imienin, rocznic ślubu i rocznic śmierci i jeśli takie występują dla danego dnia wyświetla powiadomienie umożliwiające wysłać wiadomość SMS, zadzwonić lub napisać wiadomość Hangouts do kontaktu. Prezentuje się to następująco.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCEUizUcBEDhBUPyxAc2TN4AaWWlZ3YJyRc49VG9NpvavRXyDGBDpDb9WG4Gbdn_GdBPBkGnNVVWsqnFtIS-jled4PrHCYXPCj-dAKKiGXxShFXF6amEuKZ9Q6OIJ4QxIqIC_n6ld7FFY/s1600/urodziny.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCEUizUcBEDhBUPyxAc2TN4AaWWlZ3YJyRc49VG9NpvavRXyDGBDpDb9WG4Gbdn_GdBPBkGnNVVWsqnFtIS-jled4PrHCYXPCj-dAKKiGXxShFXF6amEuKZ9Q6OIJ4QxIqIC_n6ld7FFY/s640/urodziny.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Jest to trzecia wersja tego projektu. Poprzednie miały braki w funkcjonalności i nie umiały obejść niedoskonałości wtyczki &lt;b&gt;AutoContacts&lt;/b&gt;. Ta wersja zdaje się być kompletna i nie zawierać błędów.&lt;br&gt;
Jeśli coś z opisu lub samego projektu wyda Ci się niezrozumiałe to zachęcam do zadawania pytań. Postaram się na wszystkie odpowiedzieć.
&lt;/p&gt;
&lt;h3&gt;Wymagania&lt;/h3&gt;
&lt;p&gt;&lt;ul&gt;
&lt;li&gt;wtyczka &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.joaomgcd.autocontacts&quot; title=&quot;AutoContacts&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot; &gt;AutoContacts&lt;/a&gt; w wersji płatnej, którą omówiłem we wpisie &lt;a href=&quot;http://tasker-android.blogspot.com/2014/10/profil-gosowe-wywoywanie-poaczenia_4.html&quot; title=&quot;Profil: Głosowe wywoływanie połączenia telefonicznego&quot;&gt;Profil: Głosowe wywoływanie połączenia telefonicznego&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;wtyczka &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.joaomgcd.autonotification&quot; title=&quot;AutoNotification&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot; &gt;AutoNotification&lt;/a&gt; w wersji płatnej&lt;/li&gt;
&lt;li&gt;do poprawnego działania profilu niezbędny jest porządek w książce adresowej tzn. numery telefonów muszą być opisane jako &lt;span class=&quot;code&quot;&gt;komórka&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;domowy&lt;/span&gt;, a daty jako &lt;span class=&quot;code&quot;&gt;Urodziny&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;Imieniny&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;Ślub&lt;/span&gt; i &lt;span class=&quot;code&quot;&gt;Zgon&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;h3&gt;Wtyczka AutoNotification&lt;/h3&gt;
&lt;p&gt;Wtyczka &lt;b&gt;AutoNotification&lt;/b&gt; służy do generowania powiadomień. Oczywiście sam &lt;b&gt;Tasker&lt;/b&gt; to potrafi za pomocą akcji &lt;b&gt;Notify&lt;/b&gt; jednak wtyczka ma dużo większe możliwości konfiguracji tworzonego powiadomienia dlatego ja zdecydowanie wolę z niej korzystać. Poza generowaniem powiadomień wtyczka potrafi przechwytywać notyfikacje innych aplikacji co umożliwia np. zamykanie niechcianych powiadomień, przechwytywanie treści z powiadomień, uruchamianie profili w momencie pojawienia się notyfikacji z danego programu itp.&lt;/p&gt;
&lt;h4&gt;Instalacja i konfiguracja&lt;/h4&gt;
&lt;p&gt;Wtyczkę AutoNotification można pobrać ze sklepu &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.joaomgcd.autonotification&quot; title=&quot;AutoNotification&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Google Play&lt;/a&gt;. Po instalacji i wykupienia wersji Pro wtyczka jest gotowa do działania.&lt;/p&gt;
&lt;h3&gt;Konfiguracja&lt;/h3&gt;
&lt;p&gt;W dwóch pierwszych akcjach tasku &lt;span class=&quot;code&quot;&gt;AC Daty z kontaktów&lt;/span&gt; należy podać ścieżkę dostepu do plików graficznych oraz wybrany dxięk powiadomienia, który ma być odgrywany w momencie pojawienia się przypomnienia.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggUthkXZVQrOQ9hZArwaSw4_l4VHjOQFXhBJQ49ZTlKB9YuiqBRaD6YDw2BnyJN0oG-0Av0VzLiD1Yu6zg8bz92jZJBnGt9nBS1QwSE0MgC2k18LFMzPSEwTm5UcTActXtzW0v6mokmvQ/s1600/Screenshot_2014-10-25-10-43-03.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggUthkXZVQrOQ9hZArwaSw4_l4VHjOQFXhBJQ49ZTlKB9YuiqBRaD6YDw2BnyJN0oG-0Av0VzLiD1Yu6zg8bz92jZJBnGt9nBS1QwSE0MgC2k18LFMzPSEwTm5UcTActXtzW0v6mokmvQ/s640/Screenshot_2014-10-25-10-43-03.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h3&gt;Opis wykonania&lt;/h3&gt;
&lt;p&gt;Projekt składa się z 6 profili. Dwa główne &lt;span class=&quot;code&quot;&gt;AN Przypomnienie o urodzinach [ranek]&lt;/span&gt; i &lt;span class=&quot;code&quot;&gt;AN Przypomnienie o urodzinach [wieczór]&lt;/span&gt; uruchamiają ten sam task &lt;span class=&quot;code&quot;&gt;AC Daty z kontaktów&lt;/span&gt;. Profil ranny uruchamiany jest o godzinie 10tej, wieczorny o 19tej pod warunkiem, że zmienna &lt;span class=&quot;code&quot;&gt;%BIRTHDAYR&lt;/span&gt; ma wartość &lt;span class=&quot;code&quot;&gt;1&lt;/span&gt;. Zmienna ta ma wartość &lt;span class=&quot;code&quot;&gt;1&lt;/span&gt; jeśli użytkownik naciśnie poranne powiadomienie (nie odrzuci).
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirBXc16m8R-F4ZzloeNVC8A2fUM__djb0oDHjPdq18drVzJHAEC0L0CK7_6lB6QGMYlU0RqgrQZXft4UyPhn4zwo-GAdYDtTdi6opDxTtZHv_hbfVhHMKKWxRVInfdVTA84igIsuSI0ss/s1600/urodziny-profile.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirBXc16m8R-F4ZzloeNVC8A2fUM__djb0oDHjPdq18drVzJHAEC0L0CK7_6lB6QGMYlU0RqgrQZXft4UyPhn4zwo-GAdYDtTdi6opDxTtZHv_hbfVhHMKKWxRVInfdVTA84igIsuSI0ss/s640/urodziny-profile.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;
Task &lt;span class=&quot;code&quot;&gt;AC Daty z kontaktów&lt;/span&gt; zaczyna się od konfiguracji ścieżki dostępu do grafik oraz dźwięku powiadomienia, która użytkownik po imporcie projektu musi samemu dostosować do własnego systemu.&lt;br&gt;
Następnie task sprawdza czy danego dnia są jakieś zdarzenia do obsłużenia (zmienna &lt;span class=&quot;code&quot;&gt;%daystoeventc&lt;/span&gt;) i jeśli tak odczytuje za pomocą akcji &lt;span class=&quot;code&quot;&gt;Run Shell&lt;/span&gt; i komend powłoki datę. Później w pętli &lt;span class=&quot;code&quot;&gt;pętla dane kontaktów&lt;/span&gt;porównując datę do listy dat jakie w zmiennej &lt;span class=&quot;code&quot;&gt;%acallevents&lt;/span&gt; otrzymuje od wtyczki AutoContacts task ustala ile dat należy obsłużyć danego dnia i dla tych dat odczytuje nazwiska, daty i typy dat i zapisuje je oddzielając przecinkami do zmiennych odpowiednio &lt;span class=&quot;code&quot;&gt;%nazwy_kontaktów&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;%daty_kontaktów&lt;/span&gt; i &lt;span class=&quot;code&quot;&gt;%typy_dat&lt;/span&gt;. Po tych operacjach wiadomo jest ile dat trzeba obsłużyć i otrzymuję zmienne macierzowe z wszystkimi niezbędnymi danymi.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMWsotuBOa5sbHoyI3_x2j3WEM6VtCMPaaUCdthOju3_TeTfMZo0TDeHByaaBYV60aeZPiunbK_Mr9AmUkV-4o7xmhKrNQdGsXgqKLeWdhfwPjJ47mj3EF3N7hMcv6N5sbT7g11xYktSA/s1600/urodziny01.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMWsotuBOa5sbHoyI3_x2j3WEM6VtCMPaaUCdthOju3_TeTfMZo0TDeHByaaBYV60aeZPiunbK_Mr9AmUkV-4o7xmhKrNQdGsXgqKLeWdhfwPjJ47mj3EF3N7hMcv6N5sbT7g11xYktSA/s640/urodziny01.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVf3R6lDORmbAKTZWl0LIL4Qxed-BW998feq3rZsGxzw3ycZAySn5tM9Zh01z6mCeACf5nmmscGWRQwp-56Xu-oRvFQBECxE48qNXXSNfnYtY6QX8LPVJfgEZVez5sptu4finld_OA57U/s1600/urodziny02.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVf3R6lDORmbAKTZWl0LIL4Qxed-BW998feq3rZsGxzw3ycZAySn5tM9Zh01z6mCeACf5nmmscGWRQwp-56Xu-oRvFQBECxE48qNXXSNfnYtY6QX8LPVJfgEZVez5sptu4finld_OA57U/s640/urodziny02.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;code&quot;&gt;Pętla powiadomienia&lt;/span&gt; odpowiedzialna jest za kolejno dla każdej daty ze zmiennej &lt;span class=&quot;code&quot;&gt;%daty_kontaktów&lt;/span&gt; wyciągnięcie z &lt;b&gt;AutoContacts&lt;/b&gt; zdjęcia kontaktu i numerów telefonów i danych czatu Hangouts, przygotowanie tekstów dla powiadomienia i w końcu wyświetlenie powiadomienia. Przygotowanie tekstów i wyświetlanie powiadomień rozdzielone jest na cztery grupy, które kolejno obsługuję urodziny, imieniny, rocznice ślubów i rocznice śmierci. Oczywiście można stworzyć dodatkowe kategorie i obsłużyć je odpowiednimi powiadomieniami.  
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvMtXZSUC1ZWXRQRa_y6oYwPHJyulbipL1JZ5BdUAAlHycgyd-Z11Kfe4Ct44HR8H1GQFJKJq6rHdHah87GbKh4539XlluhCGk85TDS4SCrlrixbL3Q_UG8L1mY3S1dvtrWh8lNraDgFg/s1600/urodziny03.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvMtXZSUC1ZWXRQRa_y6oYwPHJyulbipL1JZ5BdUAAlHycgyd-Z11Kfe4Ct44HR8H1GQFJKJq6rHdHah87GbKh4539XlluhCGk85TDS4SCrlrixbL3Q_UG8L1mY3S1dvtrWh8lNraDgFg/s640/urodziny03.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPq20XMRJwqLLRQ64D312HhypykQFhjdqzAOR4ZKOM2EzQupUE9XOEWDXgG5PboN_tLcPnXq1cLHsuhI-aiP7JFcjJ2RAhWzm5v-Xmn8CPy4InnhHy2lhbJYudH13otRPeV_5Z29L51mI/s1600/urodziny04.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPq20XMRJwqLLRQ64D312HhypykQFhjdqzAOR4ZKOM2EzQupUE9XOEWDXgG5PboN_tLcPnXq1cLHsuhI-aiP7JFcjJ2RAhWzm5v-Xmn8CPy4InnhHy2lhbJYudH13otRPeV_5Z29L51mI/s640/urodziny04.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDu6f9457kksyt27elD7A3camTknjms0ehDhnEE5BvGhcUCFb9gsM8LjJc1SC1bQbiyqGa32QOr7BVzuktn-ioRv8-5_0d-fWS-arp8pD638ZN7bdSsAM23MKNsqdGyn7o9gbk0HRNBxE/s1600/urodziny05.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDu6f9457kksyt27elD7A3camTknjms0ehDhnEE5BvGhcUCFb9gsM8LjJc1SC1bQbiyqGa32QOr7BVzuktn-ioRv8-5_0d-fWS-arp8pD638ZN7bdSsAM23MKNsqdGyn7o9gbk0HRNBxE/s640/urodziny05.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigW0w9seMJqoxDO8Z07ce7FbKvh9ww3qnyeRvSLRTazYlX8ndg_8Sr28oFk0L3T-6qqSiLTZjGomb1GVHQNtS5VsLxomsioN8RlhlD5W6YvuLoxwpdTXBLJVz_aWf0Hns9aES0ZGPOhVs/s1600/urodziny06.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigW0w9seMJqoxDO8Z07ce7FbKvh9ww3qnyeRvSLRTazYlX8ndg_8Sr28oFk0L3T-6qqSiLTZjGomb1GVHQNtS5VsLxomsioN8RlhlD5W6YvuLoxwpdTXBLJVz_aWf0Hns9aES0ZGPOhVs/s640/urodziny06.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Do poprawnego działania projektu potrzebne są jeszcze profile odpowiedzialne za naciśnięcie powiadomienie przez użytkownika oraz obsługujące naciśnięcie klawiszy powiadomień.&lt;br&gt;
Profil &lt;span class=&quot;code&quot;&gt;AN Przypomnij o urodzinach&lt;/span&gt; ma zadziałać w momencie naciśnięcie przez użytkownika powiadomienia. Dzięki kontekstowi &lt;span class=&quot;code&quot;&gt;AutoNotification&lt;/span&gt; oczekuje on na komendę o składni &lt;span class=&quot;code&quot;&gt;remind birthday=:=&lt;/span&gt;. Komendy takie są specyficzne dla wtyczek &lt;b&gt;AutoNoticifation&lt;/b&gt;, &lt;b&gt;AutoVoice&lt;/b&gt;, &lt;b&gt;AutoRemote&lt;/b&gt; i innych tego samego autora. Zestaw znaków &lt;span class=&quot;code&quot;&gt;=:=&lt;/span&gt; rozdziela na części parametry komendy (może być ich więcej niż 2). W tym przypadku naciśniecie na notyfikacje wysyła komendę &lt;span class=&quot;code&quot;&gt;remind birthday=:=1&lt;/span&gt;, a parametr &lt;span class=&quot;code&quot;&gt;1&lt;/span&gt; komendy zostaje przekazany do zmiennej &lt;span class=&quot;code&quot;&gt;%ancomm&lt;/span&gt; dostępnej w tasku, dzięki temu możemy go przekazać do naszej zmiennej &lt;span class=&quot;code&quot;&gt;%BIRTHDAYR&lt;/span&gt; co zaowocuje ponownym przypomnieniem wieczorem (jeśli taka akcja miała miejsce rano).
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigWMZq614zA-_zvlTubh9Dui_c2tco1h8kA5dAolT3_gpw9-KpqLnjSyD-ETiHX3Mqx47WPkmoUTkgKl1kkjDZuqkdwZ5eqTo7nDG3hQoVomqNb6R3vYkewihOmOiFNncBVcGyO8eYhzI/s1600/ur-pac.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigWMZq614zA-_zvlTubh9Dui_c2tco1h8kA5dAolT3_gpw9-KpqLnjSyD-ETiHX3Mqx47WPkmoUTkgKl1kkjDZuqkdwZ5eqTo7nDG3hQoVomqNb6R3vYkewihOmOiFNncBVcGyO8eYhzI/s640/ur-pac.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt; &lt;/p&gt;
&lt;p&gt;Profil &lt;span class=&quot;code&quot;&gt;AN Wyślij wiadomość&lt;/span&gt; ma za zadanie przygotować wiadomość SMS do wysłania po naciśnięciu przycisku &lt;span class=&quot;code&quot;&gt;Wyślij wiadomość&lt;/span&gt; na powiadomieniu. W tym przypadku naciśnięcie przycisku przekazuje komendę &lt;span class=&quot;code&quot;&gt;composesms=:=%komórka&lt;/span&gt; gdzie &lt;span class=&quot;code&quot;&gt;%komórka&lt;/span&gt; zawiera numer telefonu komórkowego kontaktu.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhm7iOgOLYQDuLRdW0kVkfwu4IThKBbCU9Q8GiDU2rUqKVLm4CIE5w6JdDdqRpebdmahpEo7-Bt52NWM7aZmNqjTfAW0k0pzUjIKVTe3ZSJ9OCQ_tQSoESq6oLg-DiWp5FStUu6OyK_bVg/s1600/sms.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhm7iOgOLYQDuLRdW0kVkfwu4IThKBbCU9Q8GiDU2rUqKVLm4CIE5w6JdDdqRpebdmahpEo7-Bt52NWM7aZmNqjTfAW0k0pzUjIKVTe3ZSJ9OCQ_tQSoESq6oLg-DiWp5FStUu6OyK_bVg/s640/sms.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Profil &lt;span class=&quot;code&quot;&gt;AN Zadzwoń&lt;/span&gt; ma za zadanie zadzwonić na numer kontaktu po naciśnięciu przycisku &lt;span class=&quot;code&quot;&gt;Zadzwoń&lt;/span&gt; na powiadomieniu. W tym przypadku naciśnięcie przycisku przekazuje komendę &lt;span class=&quot;code&quot;&gt;call=:=%komórka&lt;/span&gt; lub &lt;span class=&quot;code&quot;&gt;call=:=%dom&lt;/span&gt; (w zależności od dostępności numeru kontaktu).
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBGcwLI16vcDFfxbqU390LX8nsM8wgW7l_SfhHOEXvhepnyMsK0xwyOMkHCxgvDylQsl33wKQbgrRzL4gE1dkMbgxtjCgkxDoPwhX0cg0Q-LbscKIrYqFrblRYyHCixnLQmdoYRpF_QO0/s1600/call.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBGcwLI16vcDFfxbqU390LX8nsM8wgW7l_SfhHOEXvhepnyMsK0xwyOMkHCxgvDylQsl33wKQbgrRzL4gE1dkMbgxtjCgkxDoPwhX0cg0Q-LbscKIrYqFrblRYyHCixnLQmdoYRpF_QO0/s640/call.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Profil &lt;span class=&quot;code&quot;&gt;AN Hangouts&lt;/span&gt; ma za zadanie rozpocząć czat Hangouts z kontaktem po naciśnięciu przycisku &lt;span class=&quot;code&quot;&gt;Hangouts&lt;/span&gt; na powiadomieniu. W tym przypadku naciśnięcie przycisku przekazuje komendę &lt;span class=&quot;code&quot;&gt;browse=:=%achangouturi&lt;/span&gt;.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSEL7zES2IJDJhBJMB8CWmhvmhDZPsJR7ffj66da36e7CdLtRj1F48k3X8rmNHMtddbICe-yiqsk8mgeaDep6hgnqvhgdcEufkc9ccHU825mBnqkBNppPKIu_5rVi8WLSGEAzdgyiHoPA/s1600/hang.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSEL7zES2IJDJhBJMB8CWmhvmhDZPsJR7ffj66da36e7CdLtRj1F48k3X8rmNHMtddbICe-yiqsk8mgeaDep6hgnqvhgdcEufkc9ccHU825mBnqkBNppPKIu_5rVi8WLSGEAzdgyiHoPA/s640/hang.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;
&lt;h3&gt;Rozpisany profil&lt;/h3&gt;
&lt;p&gt;&lt;div class=&quot;code&quot;&gt;
Profile: AN Przypomnienie o urodzinach [wieczór] (45)&lt;br&gt;
Time: 19:00&lt;br&gt;
State: Variable Value [ %BIRTHDAYR = 1 ]&lt;br&gt;
Enter: AC Daty z kontaktów (220)&lt;br&gt;
&amp;lt;ścieżka do grafik&amp;gt;&lt;br&gt;
A1: Variable Set [ Name:%scieżka_do_grafik To:/storage/emulated/0/Tasker/pictures Do Maths:Off Append:Off ] &lt;br&gt;
&amp;lt;ścieżka do dźwięku&amp;gt;&lt;br&gt;
A2: Variable Set [ Name:%scieżka_do_dźwięku To:content://media/internal/audio/media/246 Do Maths:Off Append:Off ] &lt;br&gt;
A3: Variable Clear [ Name:%BIRTHDAYR Pattern Matching:Off ] &lt;br&gt;
A4: AutoContacts [ Configuration:Order By: Next Event Date Package:com.joaomgcd.autocontacts Name:AutoContacts Timeout (Seconds):1000 ] &lt;br&gt;
A5: Stop [ With Error:Off Task: ] If [ %acdaystoeventc != 0 ]&lt;br&gt;
A6: Variable Set [ Name:%indeks To:1 Do Maths:Off Append:Off ] &lt;br&gt;
A7: Run Shell [ Command:DATUM=$(date &quot;+%m-%d&quot;) &lt;br&gt;
echo $DATUM Timeout (Seconds):1 Use Root:Off Store Output In:%dzisiaj_md Store Errors In: Store Result In: ] &lt;br&gt;
A8: Run Shell [ Command:DATUM=$(date &quot;+%Y&quot;) &lt;br&gt;
echo $DATUM Timeout (Seconds):1 Use Root:Off Store Output In:%dzisiaj_r Store Errors In: Store Result In: ] &lt;br&gt;
&amp;lt;pętla dane kontaktów&amp;gt;&lt;br&gt;
A9: If [ %acallevents(%indeks) ~ *%dzisiaj_md* ]&lt;br&gt;
A10: If [ %acallevents(%indeks) ~ *,* ]&lt;br&gt;
A11: Variable Set [ Name:%daty To:%acallevents(%indeks) Do Maths:Off Append:Off ] &lt;br&gt;
A12: Variable Split [ Name:%daty Splitter:, Delete Base:Off ] &lt;br&gt;
A13: Variable Set [ Name:%licznik To:%daty(#) Do Maths:Off Append:Off ] &lt;br&gt;
&amp;lt;podwójna data&amp;gt;&lt;br&gt;
A14: If [ %daty(%licznik) ~ *%dzisiaj_md* ]&lt;br&gt;
A15: Variable Set [ Name:%nazwy_kontaktów To:%acnames(%indeks), Do Maths:Off Append:On ] &lt;br&gt;
A16: Variable Set [ Name:%daty_kontaktów To:%daty(%licznik), Do Maths:Off Append:On ] &lt;br&gt;
A17: Variable Set [ Name:%typy_dat_temp To:%acalleventtypes(%indeks) Do Maths:Off Append:Off ] &lt;br&gt;
A18: Variable Split [ Name:%typy_dat_temp Splitter:, Delete Base:Off ] &lt;br&gt;
A19: Variable Set [ Name:%typy_dat To:%typy_dat_temp(%licznik), Do Maths:Off Append:On ] &lt;br&gt;
A20: Variable Add [ Name:%ile_dat Value:1 Wrap Around:0 ] &lt;br&gt;
A21: Variable Subtract [ Name:%licznik Value:1 Wrap Around:0 ] &lt;br&gt;
A22: Goto [ Type:Action Label Number:1 Label:podwójna data ] If [ %licznik &amp;gt; 0 ]&lt;br&gt;
A23: Else &lt;br&gt;
A24: Variable Subtract [ Name:%licznik Value:1 Wrap Around:0 ] &lt;br&gt;
A25: Goto [ Type:Action Label Number:1 Label:podwójna data ] If [ %licznik &amp;gt; 0 ]&lt;br&gt;
A26: End If &lt;br&gt;
A27: Else &lt;br&gt;
A28: Variable Set [ Name:%nazwy_kontaktów To:%acnames(%indeks), Do Maths:Off Append:On ] &lt;br&gt;
A29: Variable Set [ Name:%daty_kontaktów To:%acallevents(%indeks), Do Maths:Off Append:On ] &lt;br&gt;
A30: Variable Set [ Name:%typy_dat To:%acalleventtypes(%indeks), Do Maths:Off Append:On ] &lt;br&gt;
A31: Variable Add [ Name:%ile_dat Value:1 Wrap Around:0 ] &lt;br&gt;
A32: End If &lt;br&gt;
A33: Variable Add [ Name:%indeks Value:1 Wrap Around:0 ] &lt;br&gt;
A34: Goto [ Type:Action Label Number:1 Label:pętla dane kontaktów ] &lt;br&gt;
A35: End If &lt;br&gt;
A36: Variable Split [ Name:%daty_kontaktów Splitter:, Delete Base:Off ] &lt;br&gt;
A37: Variable Split [ Name:%typy_dat Splitter:, Delete Base:Off ] &lt;br&gt;
A38: Variable Split [ Name:%nazwy_kontaktów Splitter:, Delete Base:Off ] &lt;br&gt;
&amp;lt;pętla powiadomienia&amp;gt;&lt;br&gt;
A39: If [ %typy_dat(%ile_dat) ~ imieniny/urodziny/birthday/ślub/zgon ]&lt;br&gt;
A40: Variable Clear [ Name:%dom Pattern Matching:Off ] &lt;br&gt;
A41: Variable Clear [ Name:%komórka Pattern Matching:Off ] &lt;br&gt;
A42: Variable Clear [ Name:%acpicturefile Pattern Matching:Off ] &lt;br&gt;
A43: Variable Clear [ Name:%achangouturi Pattern Matching:Off ] &lt;br&gt;
A44: AutoContacts [ Configuration:Contact Name or Nickname: %nazwy_kontaktów(%ile_dat) Package:com.joaomgcd.autocontacts Name:AutoContacts Timeout (Seconds):1000 ] &lt;br&gt;
A45: AutoContacts Details [ Configuration:Contact Id: %acid&lt;br&gt;
Get Picture: true&lt;br&gt;
Full size: true Package:com.joaomgcd.autocontacts Name:AutoContacts Details Timeout (Seconds):1000 ] &lt;br&gt;
A46: Variable Set [ Name:%telefony To:%acallnumbers(1) Do Maths:Off Append:Off ] &lt;br&gt;
A47: Variable Set [ Name:%typy_telefonów To:%acallnumbertypes(1) Do Maths:Off Append:Off ] &lt;br&gt;
A48: Variable Split [ Name:%telefony Splitter:, Delete Base:Off ] &lt;br&gt;
A49: Variable Split [ Name:%typy_telefonów Splitter:, Delete Base:Off ] &lt;br&gt;
&amp;lt;komórka&amp;gt;&lt;br&gt;
A50: Variable Set [ Name:%licznik To:%typy_telefonów(#?Komórka) Do Maths:Off Append:Off ] &lt;br&gt;
A51: Variable Split [ Name:%licznik Splitter:, Delete Base:Off ] If [ %licznik !~ 0 ]&lt;br&gt;
A52: Variable Set [ Name:%komórka To:%telefony(%licznik1) Do Maths:Off Append:Off ] If [ %licznik !~ 0 ]&lt;br&gt;
&amp;lt;dom&amp;gt;&lt;br&gt;
A53: Variable Set [ Name:%licznik To:%typy_telefonów(#?Domowy) Do Maths:Off Append:Off ] &lt;br&gt;
A54: Variable Split [ Name:%licznik Splitter:, Delete Base:Off ] If [ %licznik !~ 0 ]&lt;br&gt;
A55: Variable Set [ Name:%dom To:%telefony(%licznik1) Do Maths:Off Append:Off ] If [ %licznik !~ 0 ]&lt;br&gt;
&amp;lt;urodziny&amp;gt;&lt;br&gt;
A56: If [ %typy_dat(%ile_dat) ~ urodziny/birthday ]&lt;br&gt;
A57: Variable Set [ Name:%data To:%daty_kontaktów(%ile_dat) Do Maths:Off Append:Off ] &lt;br&gt;
A58: Variable Split [ Name:%data Splitter:- Delete Base:Off ] &lt;br&gt;
A59: Variable Set [ Name:%urodziny To:%dzisiaj_r-%data(1) Do Maths:On Append:Off ] &lt;br&gt;
A60: Variable Set [ Name:%nottitle To:Urodziny %nazwy_kontaktów(%ile_dat) Do Maths:Off Append:Off ] &lt;br&gt;
A61: Variable Set [ Name:%nottext To:%nazwy_kontaktów(%ile_dat) świętuje dziś %urodziny urodziny. Do Maths:Off Append:Off ] &lt;br&gt;
A62: If [ %komórka Set &amp; %achangouturi Set ]&lt;br&gt;
A63: AutoNotification [ Configuration:Title: %nottitle&lt;br&gt;
Text: %nottext&lt;br&gt;
Ticker: %nottitle&lt;br&gt;
Action on Touch: cancel=:=birthday&lt;br&gt;
Action on Dismiss: remind birthday=:=1&lt;br&gt;
Icon: %acpicturefile&lt;br&gt;
Status Bar Icon: ic_action_balloon&lt;br&gt;
Id: urodziny_%acid&lt;br&gt;
Dismiss on Touch: true&lt;br&gt;
Priority: 1&lt;br&gt;
Sound: %scieżka_do_dźwięku&lt;br&gt;
Picture: %scieżka_do_grafik/birthday.jpg&lt;br&gt;
Text Expanded: %nottext&lt;br&gt;
Button 1: call=:=%komórka&lt;br&gt;
Label 1: Zadzwoń&lt;br&gt;
Icon 1: ic_action_phone_start&lt;br&gt;
Button 2: composesms=:=%komórka&lt;br&gt;
Label 2: Wyślij wiadomość&lt;br&gt;
Icon 2: ic_action_sms&lt;br&gt;
Button 3: browse=:=%achangouturi&lt;br&gt;
Label 3: Hangouts&lt;br&gt;
Icon 3: ic_action_dialog Package:com.joaomgcd.autonotification Name:AutoNotification Timeout (Seconds):0 ] &lt;br&gt;
A64: Else If [ %dom Set &amp; %achangouturi Set ]&lt;br&gt;
A65: AutoNotification [ Configuration:Title: %nottitle&lt;br&gt;
Text: %nottext&lt;br&gt;
Ticker: %nottitle&lt;br&gt;
Action on Touch: cancel=:=birthday&lt;br&gt;
Action on Dismiss: remind birthday=:=1&lt;br&gt;
Icon: %acpicturefile&lt;br&gt;
Status Bar Icon: ic_action_balloon&lt;br&gt;
Id: urodziny_%acid&lt;br&gt;
Dismiss on Touch: true&lt;br&gt;
Priority: 1&lt;br&gt;
Sound: %scieżka_do_dźwięku&lt;br&gt;
Picture: %scieżka_do_grafik/birthday.jpg&lt;br&gt;
Text Expanded: %nottext&lt;br&gt;
Button 1: call=:=%dom&lt;br&gt;
Label 1: Zadzwoń&lt;br&gt;
Icon 1: ic_action_phone_start&lt;br&gt;
Button 2: browse=:=%achangouturi&lt;br&gt;
Label 2: Hangouts&lt;br&gt;
Icon 2: ic_action_dialog Package:com.joaomgcd.autonotification Name:AutoNotification Timeout (Seconds):0 ] &lt;br&gt;
A66: Else If [ %komórka Set ]&lt;br&gt;
A67: AutoNotification [ Configuration:Title: %nottitle&lt;br&gt;
Text: %nottext&lt;br&gt;
Ticker: %nottitle&lt;br&gt;
Action on Touch: cancel=:=birthday&lt;br&gt;
Action on Dismiss: remind birthday=:=1&lt;br&gt;
Icon: %acpicturefile&lt;br&gt;
Status Bar Icon: ic_action_balloon&lt;br&gt;
Id: urodziny_%acid&lt;br&gt;
Dismiss on Touch: true&lt;br&gt;
Priority: 1&lt;br&gt;
Sound: %scieżka_do_dźwięku&lt;br&gt;
Picture: %scieżka_do_grafik/birthday.jpg&lt;br&gt;
Text Expanded: %nottext&lt;br&gt;
Button 1: call=:=%komórka&lt;br&gt;
Label 1: Zadzwoń&lt;br&gt;
Icon 1: ic_action_phone_start&lt;br&gt;
Button 2: composesms=:=%komórka&lt;br&gt;
Label 2: Wyślij wiadomość&lt;br&gt;
Icon 2: ic_action_sms&lt;br&gt;
Icon 3: ic_action_dialog Package:com.joaomgcd.autonotification Name:AutoNotification Timeout (Seconds):0 ] &lt;br&gt;
A68: Else If [ %dom Set ]&lt;br&gt;
A69: AutoNotification [ Configuration:Title: %nottitle&lt;br&gt;
Text: %nottext&lt;br&gt;
Ticker: %nottitle&lt;br&gt;
Action on Touch: cancel=:=birthday&lt;br&gt;
Action on Dismiss: remind birthday=:=1&lt;br&gt;
Icon: %acpicturefile&lt;br&gt;
Status Bar Icon: ic_action_balloon&lt;br&gt;
Id: urodziny_%acid&lt;br&gt;
Dismiss on Touch: true&lt;br&gt;
Priority: 1&lt;br&gt;
Sound: %scieżka_do_dźwięku&lt;br&gt;
Picture: %scieżka_do_grafik/birthday.jpg&lt;br&gt;
Text Expanded: %nottext&lt;br&gt;
Button 1: call=:=%dom&lt;br&gt;
Label 1: Zadzwoń&lt;br&gt;
Icon 1: ic_action_phone_start&lt;br&gt;
Icon 2: ic_action_phone_start Package:com.joaomgcd.autonotification Name:AutoNotification Timeout (Seconds):0 ] &lt;br&gt;
A70: Else If [ %achangouturi Set ]&lt;br&gt;
A71: AutoNotification [ Configuration:Title: %nottitle&lt;br&gt;
Text: %nottext&lt;br&gt;
Ticker: %nottitle&lt;br&gt;
Action on Touch: cancel=:=birthday&lt;br&gt;
Action on Dismiss: remind birthday=:=1&lt;br&gt;
Icon: %acpicturefile&lt;br&gt;
Status Bar Icon: ic_action_balloon&lt;br&gt;
Id: urodziny_%acid&lt;br&gt;
Dismiss on Touch: true&lt;br&gt;
Priority: 1&lt;br&gt;
Sound: %scieżka_do_dźwięku&lt;br&gt;
Picture: %scieżka_do_grafik/birthday.jpg&lt;br&gt;
Text Expanded: %nottext&lt;br&gt;
Button 1: browse=:=%achangouturi&lt;br&gt;
Label 1: Hangouts&lt;br&gt;
Icon 1: ic_action_dialog&lt;br&gt;
Icon 2: ic_action_phone_start Package:com.joaomgcd.autonotification Name:AutoNotification Timeout (Seconds):0 ] &lt;br&gt;
A72: Else &lt;br&gt;
A73: AutoNotification [ Configuration:Title: %nottitle&lt;br&gt;
Text: %nottext&lt;br&gt;
Ticker: %nottitle&lt;br&gt;
Action on Touch: cancel=:=birthday&lt;br&gt;
Action on Dismiss: remind birthday=:=1&lt;br&gt;
Icon: %acpicturefile&lt;br&gt;
Status Bar Icon: ic_action_balloon&lt;br&gt;
Id: urodziny_%acid&lt;br&gt;
Dismiss on Touch: true&lt;br&gt;
Priority: 1&lt;br&gt;
Sound: %scieżka_do_dźwięku&lt;br&gt;
Picture: %scieżka_do_grafik/birthday.jpg&lt;br&gt;
Text Expanded: %nottext Package:com.joaomgcd.autonotification Name:AutoNotification Timeout (Seconds):0 ] &lt;br&gt;
A74: End If &lt;br&gt;
A75: End If &lt;br&gt;
&amp;lt;imieniny&amp;gt;&lt;br&gt;
A76: If [ %typy_dat(%ile_dat) ~ imieniny ]&lt;br&gt;
A77: Variable Set [ Name:%nottitle To:Imieniny %nazwy_kontaktów(%ile_dat) Do Maths:Off Append:Off ] &lt;br&gt;
A78: Variable Set [ Name:%nottext To:Nie zapomnij złożyć życzeń. Do Maths:Off Append:Off ] &lt;br&gt;
A79: If [ %komórka Set &amp; %achangouturi Set ]&lt;br&gt;
A80: AutoNotification [ Configuration:Title: %nottitle&lt;br&gt;
Text: %nottext&lt;br&gt;
Ticker: %nottitle&lt;br&gt;
Action on Touch: cancel=:=birthday&lt;br&gt;
Action on Dismiss: remind birthday=:=1&lt;br&gt;
Icon: %acpicturefile&lt;br&gt;
Status Bar Icon: ic_action_balloon&lt;br&gt;
Id: imieniny_%acid&lt;br&gt;
Dismiss on Touch: true&lt;br&gt;
Priority: 1&lt;br&gt;
Sound: %scieżka_do_dźwięku&lt;br&gt;
Picture: %scieżka_do_grafik/imieniny.jpg&lt;br&gt;
Text Expanded: %nottext&lt;br&gt;
Button 1: call=:=%komórka&lt;br&gt;
Label 1: Zadzwoń&lt;br&gt;
Icon 1: ic_action_phone_start&lt;br&gt;
Button 2: composesms=:=%komórka&lt;br&gt;
Label 2: Wyślij wiadomość&lt;br&gt;
Icon 2: ic_action_sms&lt;br&gt;
Button 3: browse=:=%achangouturi&lt;br&gt;
Label 3: Hangouts&lt;br&gt;
Icon 3: ic_action_dialog Package:com.joaomgcd.autonotification Name:AutoNotification Timeout (Seconds):0 ] &lt;br&gt;
A81: Else If [ %dom Set &amp; %achangouturi Set ]&lt;br&gt;
A82: AutoNotification [ Configuration:Title: %nottitle&lt;br&gt;
Text: %nottext&lt;br&gt;
Ticker: %nottitle&lt;br&gt;
Action on Touch: cancel=:=birthday&lt;br&gt;
Action on Dismiss: remind birthday=:=1&lt;br&gt;
Icon: %acpicturefile&lt;br&gt;
Status Bar Icon: ic_action_balloon&lt;br&gt;
Id: imieniny_%acid&lt;br&gt;
Dismiss on Touch: true&lt;br&gt;
Priority: 1&lt;br&gt;
Sound: %scieżka_do_dźwięku&lt;br&gt;
Picture: %scieżka_do_grafik/imieniny.jpg&lt;br&gt;
Text Expanded: %nottext&lt;br&gt;
Button 1: call=:=%dom&lt;br&gt;
Label 1: Zadzwoń&lt;br&gt;
Icon 1: ic_action_phone_start&lt;br&gt;
Button 2: browse=:=%achangouturi&lt;br&gt;
Label 2: Hangouts&lt;br&gt;
Icon 2: ic_action_dialog Package:com.joaomgcd.autonotification Name:AutoNotification Timeout (Seconds):0 ] &lt;br&gt;
A83: Else If [ %komórka Set ]&lt;br&gt;
A84: AutoNotification [ Configuration:Title: %nottitle&lt;br&gt;
Text: %nottext&lt;br&gt;
Ticker: %nottitle&lt;br&gt;
Action on Touch: cancel=:=birthday&lt;br&gt;
Action on Dismiss: remind birthday=:=1&lt;br&gt;
Icon: %acpicturefile&lt;br&gt;
Status Bar Icon: ic_action_balloon&lt;br&gt;
Id: imieniny_%acid&lt;br&gt;
Dismiss on Touch: true&lt;br&gt;
Priority: 1&lt;br&gt;
Sound: %scieżka_do_dźwięku&lt;br&gt;
Picture: %scieżka_do_grafik/imieniny.jpg&lt;br&gt;
Text Expanded: %nottext&lt;br&gt;
Button 1: call=:=%komórka&lt;br&gt;
Label 1: Zadzwoń&lt;br&gt;
Icon 1: ic_action_phone_start&lt;br&gt;
Button 2: composesms=:=%komórka&lt;br&gt;
Label 2: Wyślij wiadomość&lt;br&gt;
Icon 2: ic_action_sms&lt;br&gt;
Icon 3: ic_launcher Package:com.joaomgcd.autonotification Name:AutoNotification Timeout (Seconds):0 ] &lt;br&gt;
A85: Else If [ %dom Set ]&lt;br&gt;
A86: AutoNotification [ Configuration:Title: %nottitle&lt;br&gt;
Text: %nottext&lt;br&gt;
Ticker: %nottitle&lt;br&gt;
Action on Touch: cancel=:=birthday&lt;br&gt;
Action on Dismiss: remind birthday=:=1&lt;br&gt;
Icon: %acpicturefile&lt;br&gt;
Status Bar Icon: ic_action_balloon&lt;br&gt;
Id: imieniny_%acid&lt;br&gt;
Dismiss on Touch: true&lt;br&gt;
Priority: 1&lt;br&gt;
Sound: %scieżka_do_dźwięku&lt;br&gt;
Picture: %scieżka_do_grafik/imieniny.jpg&lt;br&gt;
Text Expanded: %nottext&lt;br&gt;
Button 1: call=:=%dom&lt;br&gt;
Label 1: Zadzwoń&lt;br&gt;
Icon 1: ic_action_phone_start&lt;br&gt;
Icon 2: ic_action_phone_start Package:com.joaomgcd.autonotification Name:AutoNotification Timeout (Seconds):0 ] &lt;br&gt;
A87: Else If [ %achangouturi Set ]&lt;br&gt;
A88: AutoNotification [ Configuration:Title: %nottitle&lt;br&gt;
Text: %nottext&lt;br&gt;
Ticker: %nottitle&lt;br&gt;
Action on Touch: cancel=:=birthday&lt;br&gt;
Action on Dismiss: remind birthday=:=1&lt;br&gt;
Icon: %acpicturefile&lt;br&gt;
Status Bar Icon: ic_action_balloon&lt;br&gt;
Id: imieniny_%acid&lt;br&gt;
Dismiss on Touch: true&lt;br&gt;
Priority: 1&lt;br&gt;
Sound: %scieżka_do_dźwięku&lt;br&gt;
Picture: %scieżka_do_grafik/imieniny.jpg&lt;br&gt;
Text Expanded: %nottext&lt;br&gt;
Button 1: browse=:=%achangouturi&lt;br&gt;
Label 1: Hangouts&lt;br&gt;
Icon 1: ic_action_dialog&lt;br&gt;
Icon 2: ic_action_phone_start Package:com.joaomgcd.autonotification Name:AutoNotification Timeout (Seconds):0 ] &lt;br&gt;
A89: Else &lt;br&gt;
A90: AutoNotification [ Configuration:Title: %nottitle&lt;br&gt;
Text: %nottext&lt;br&gt;
Ticker: %nottitle&lt;br&gt;
Action on Touch: cancel=:=birthday&lt;br&gt;
Action on Dismiss: remind birthday=:=1&lt;br&gt;
Icon: %acpicturefile&lt;br&gt;
Status Bar Icon: ic_action_balloon&lt;br&gt;
Id: imieniny_%acid&lt;br&gt;
Dismiss on Touch: true&lt;br&gt;
Priority: 1&lt;br&gt;
Sound: %scieżka_do_dźwięku&lt;br&gt;
Picture: %scieżka_do_grafik/imieniny.jpg&lt;br&gt;
Text Expanded: %nottext Package:com.joaomgcd.autonotification Name:AutoNotification Timeout (Seconds):0 ] &lt;br&gt;
A91: End If &lt;br&gt;
A92: End If &lt;br&gt;
&amp;lt;ślub&amp;gt;&lt;br&gt;
A93: If [ %typy_dat(%ile_dat) ~ ślub ]&lt;br&gt;
A94: Variable Set [ Name:%data To:%daty_kontaktów(%ile_dat) Do Maths:Off Append:Off ] &lt;br&gt;
A95: Variable Split [ Name:%data Splitter:- Delete Base:Off ] &lt;br&gt;
A96: Variable Set [ Name:%ślub To:%dzisiaj_r-%data(1) Do Maths:On Append:Off ] &lt;br&gt;
A97: Variable Set [ Name:%nottitle To:Rocznica ślubu %nazwy_kontaktów(%ile_dat) Do Maths:Off Append:Off ] &lt;br&gt;
A98: Variable Set [ Name:%nottext To:%nazwy_kontaktów(%ile_dat) świętuje dziś %ślub rocznicę ślubu. Do Maths:Off Append:Off ] &lt;br&gt;
A99: If [ %komórka Set &amp; %achangouturi Set ]&lt;br&gt;
A100: AutoNotification [ Configuration:Title: %nottitle&lt;br&gt;
Text: %nottext&lt;br&gt;
Ticker: %nottitle&lt;br&gt;
Action on Touch: cancel=:=birthday&lt;br&gt;
Action on Dismiss: remind birthday=:=1&lt;br&gt;
Icon: %acpicturefile&lt;br&gt;
Status Bar Icon: ic_action_balloon&lt;br&gt;
Id: urodziny_%acid&lt;br&gt;
Dismiss on Touch: true&lt;br&gt;
Priority: 1&lt;br&gt;
Sound: %scieżka_do_dźwięku&lt;br&gt;
Picture: %scieżka_do_grafik/wedding.jpg&lt;br&gt;
Text Expanded: %nottext&lt;br&gt;
Button 1: call=:=%komórka&lt;br&gt;
Label 1: Zadzwoń&lt;br&gt;
Icon 1: ic_action_phone_start&lt;br&gt;
Button 2: composesms=:=%komórka&lt;br&gt;
Label 2: Wyślij wiadomość&lt;br&gt;
Icon 2: ic_action_sms&lt;br&gt;
Button 3: browse=:=%achangouturi&lt;br&gt;
Label 3: Hangouts&lt;br&gt;
Icon 3: ic_action_dialog Package:com.joaomgcd.autonotification Name:AutoNotification Timeout (Seconds):0 ] &lt;br&gt;
A101: Else If [ %dom Set &amp; %achangouturi Set ]&lt;br&gt;
A102: AutoNotification [ Configuration:Title: %nottitle&lt;br&gt;
Text: %nottext&lt;br&gt;
Ticker: %nottitle&lt;br&gt;
Action on Touch: cancel=:=birthday&lt;br&gt;
Action on Dismiss: remind birthday=:=1&lt;br&gt;
Icon: %acpicturefile&lt;br&gt;
Status Bar Icon: ic_action_balloon&lt;br&gt;
Id: urodziny_%acid&lt;br&gt;
Dismiss on Touch: true&lt;br&gt;
Priority: 1&lt;br&gt;
Sound: %scieżka_do_dźwięku&lt;br&gt;
Picture: %scieżka_do_grafik/wedding.jpg&lt;br&gt;
Text Expanded: %nottext&lt;br&gt;
Button 1: call=:=%dom&lt;br&gt;
Label 1: Zadzwoń&lt;br&gt;
Icon 1: ic_action_phone_start&lt;br&gt;
Button 2: browse=:=%achangouturi&lt;br&gt;
Label 2: Hangouts&lt;br&gt;
Icon 2: ic_action_dialog Package:com.joaomgcd.autonotification Name:AutoNotification Timeout (Seconds):0 ] &lt;br&gt;
A103: Else If [ %komórka Set ]&lt;br&gt;
A104: AutoNotification [ Configuration:Title: %nottitle&lt;br&gt;
Text: %nottext&lt;br&gt;
Ticker: %nottitle&lt;br&gt;
Action on Touch: cancel=:=birthday&lt;br&gt;
Action on Dismiss: remind birthday=:=1&lt;br&gt;
Icon: %acpicturefile&lt;br&gt;
Status Bar Icon: ic_action_balloon&lt;br&gt;
Id: urodziny_%acid&lt;br&gt;
Dismiss on Touch: true&lt;br&gt;
Priority: 1&lt;br&gt;
Sound: %scieżka_do_dźwięku&lt;br&gt;
Picture: %scieżka_do_grafik/wedding.jpg&lt;br&gt;
Text Expanded: %nottext&lt;br&gt;
Button 1: call=:=%komórka&lt;br&gt;
Label 1: Zadzwoń&lt;br&gt;
Icon 1: ic_action_phone_start&lt;br&gt;
Button 2: composesms=:=%komórka&lt;br&gt;
Label 2: Wyślij wiadomość&lt;br&gt;
Icon 2: ic_action_sms&lt;br&gt;
Icon 3: ic_action_dialog Package:com.joaomgcd.autonotification Name:AutoNotification Timeout (Seconds):0 ] &lt;br&gt;
A105: Else If [ %dom Set ]&lt;br&gt;
A106: AutoNotification [ Configuration:Title: %nottitle&lt;br&gt;
Text: %nottext&lt;br&gt;
Ticker: %nottitle&lt;br&gt;
Action on Touch: cancel=:=birthday&lt;br&gt;
Action on Dismiss: remind birthday=:=1&lt;br&gt;
Icon: %acpicturefile&lt;br&gt;
Status Bar Icon: ic_action_balloon&lt;br&gt;
Id: urodziny_%acid&lt;br&gt;
Dismiss on Touch: true&lt;br&gt;
Priority: 1&lt;br&gt;
Sound: %scieżka_do_dźwięku&lt;br&gt;
Picture: %scieżka_do_grafik/wedding.jpg&lt;br&gt;
Text Expanded: %nottext&lt;br&gt;
Button 1: call=:=%dom&lt;br&gt;
Label 1: Zadzwoń&lt;br&gt;
Icon 1: ic_action_phone_start&lt;br&gt;
Icon 2: ic_action_phone_start Package:com.joaomgcd.autonotification Name:AutoNotification Timeout (Seconds):0 ] &lt;br&gt;
A107: Else If [ %achangouturi Set ]&lt;br&gt;
A108: AutoNotification [ Configuration:Title: %nottitle&lt;br&gt;
Text: %nottext&lt;br&gt;
Ticker: %nottitle&lt;br&gt;
Action on Touch: cancel=:=birthday&lt;br&gt;
Action on Dismiss: remind birthday=:=1&lt;br&gt;
Icon: %acpicturefile&lt;br&gt;
Status Bar Icon: ic_action_balloon&lt;br&gt;
Id: urodziny_%acid&lt;br&gt;
Dismiss on Touch: true&lt;br&gt;
Priority: 1&lt;br&gt;
Sound: %scieżka_do_dźwięku&lt;br&gt;
Picture: %scieżka_do_grafik/wedding.jpg&lt;br&gt;
Text Expanded: %nottext&lt;br&gt;
Button 1: browse=:=%achangouturi&lt;br&gt;
Label 1: Hangouts&lt;br&gt;
Icon 1: ic_action_dialog&lt;br&gt;
Icon 2: ic_action_phone_start Package:com.joaomgcd.autonotification Name:AutoNotification Timeout (Seconds):0 ] &lt;br&gt;
A109: Else &lt;br&gt;
A110: AutoNotification [ Configuration:Title: %nottitle&lt;br&gt;
Text: %nottext&lt;br&gt;
Ticker: %nottitle&lt;br&gt;
Action on Touch: cancel=:=birthday&lt;br&gt;
Action on Dismiss: remind birthday=:=1&lt;br&gt;
Icon: %acpicturefile&lt;br&gt;
Status Bar Icon: ic_action_balloon&lt;br&gt;
Id: urodziny_%acid&lt;br&gt;
Dismiss on Touch: true&lt;br&gt;
Priority: 1&lt;br&gt;
Sound: %scieżka_do_dźwięku&lt;br&gt;
Picture: %scieżka_do_grafik/wedding.jpg&lt;br&gt;
Text Expanded: %nottext Package:com.joaomgcd.autonotification Name:AutoNotification Timeout (Seconds):0 ] &lt;br&gt;
A111: End If &lt;br&gt;
A112: End If &lt;br&gt;
&amp;lt;zgon&amp;gt;&lt;br&gt;
A113: If [ %typy_dat(%ile_dat) ~ zgon ]&lt;br&gt;
A114: Variable Set [ Name:%data To:%daty_kontaktów(%ile_dat) Do Maths:Off Append:Off ] &lt;br&gt;
A115: Variable Split [ Name:%data Splitter:- Delete Base:Off ] &lt;br&gt;
A116: Variable Set [ Name:%zgon To:%dzisiaj_r-%data(1) Do Maths:On Append:Off ] &lt;br&gt;
A117: Variable Set [ Name:%nottitle To:Rocznica śmierci %nazwy_kontaktów(%ile_dat) Do Maths:Off Append:Off ] &lt;br&gt;
A118: Variable Set [ Name:%nottext To:Dziś jest %zgon rocznica śmierci %nazwy_kontaktów(%ile_dat). Do Maths:Off Append:Off ] &lt;br&gt;
A119: AutoNotification [ Configuration:Title: %nottitle&lt;br&gt;
Text: %nottext&lt;br&gt;
Ticker: %nottitle&lt;br&gt;
Action on Touch: cancel=:=birthday&lt;br&gt;
Action on Dismiss: remind birthday=:=1&lt;br&gt;
Icon: %acpicturefile&lt;br&gt;
Status Bar Icon: ic_action_basket&lt;br&gt;
Id: urodziny_%acid&lt;br&gt;
Dismiss on Touch: true&lt;br&gt;
Priority: 1&lt;br&gt;
Sound: %scieżka_do_dźwięku&lt;br&gt;
Picture: %scieżka_do_grafik&lt;br&gt;&lt;br&gt;/rip.jpg&lt;br&gt;
Text Expanded: %nottext Package:com.joaomgcd.autonotification Name:AutoNotification Timeout (Seconds):0 ] &lt;br&gt;
A120: End If &lt;br&gt;
A121: Variable Subtract [ Name:%ile_dat Value:1 Wrap Around:0 ] &lt;br&gt;
A122: Goto [ Type:Action Label Number:1 Label:pętla powiadomienia ] If [ %ile_dat &amp;gt; 0 ]&lt;br&gt;
A123: End If &lt;br&gt;
&lt;br&gt;
Profile: AN Przypomnij o urodzinach (42)&lt;br&gt;
State: AutoNotification [ Configuration:Event Behaviour&lt;br&gt;
Filter: remind birthday=:= ]&lt;br&gt;
Enter: Anon (43)&lt;br&gt;
A1: AutoNotification Cancel [ Configuration:Id: %anpar2 Package:com.joaomgcd.autonotification Name:AutoNotification Cancel Timeout (Seconds):0 ] &lt;br&gt;
A2: Variable Set [ Name:%BIRTHDAYR To:%ancomm Do Maths:Off Append:Off ] &lt;br&gt;
&lt;br&gt;
Profile: AN Wyślij wiadomość (27)&lt;br&gt;
State: AutoNotification [ Configuration:Event Behaviour&lt;br&gt;
Filter: composesms=:= ]&lt;br&gt;
Enter: Anon (39)&lt;br&gt;
A1: Status Bar [ Set:Collapsed ] &lt;br&gt;
A2: Compose SMS [ Recipient(s):%ancomm Message: ] &lt;br&gt;
A3: AutoNotification Cancel [ Configuration:Id: %anpar2 Package:com.joaomgcd.autonotification Name:AutoNotification Cancel Timeout (Seconds):0 ] &lt;br&gt;
&lt;br&gt;
Profile: AN Zadzwoń (40)&lt;br&gt;
State: AutoNotification [ Configuration:Event Behaviour&lt;br&gt;
Filter: call=:= ]&lt;br&gt;
Enter: Anon (41)&lt;br&gt;
A1: Status Bar [ Set:Collapsed ] &lt;br&gt;
A2: Call [ Number:%ancomm Auto Dial:On ] &lt;br&gt;
A3: AutoNotification Cancel [ Configuration:Id: %anpar2 Package:com.joaomgcd.autonotification Name:AutoNotification Cancel Timeout (Seconds):0 ] &lt;br&gt;
&lt;br&gt;
Profile: AN Hangouts (192)&lt;br&gt;
State: AutoNotification [ Configuration:Event Behaviour&lt;br&gt;
Filter: browse=:= ]&lt;br&gt;
Enter: Anon (201)&lt;br&gt;
A1: Status Bar [ Set:Collapsed ] &lt;br&gt;
A2: Browse URL [ URL:%ancomm ] &lt;br&gt;
A3: AutoNotification Cancel [ Configuration:Id: %anpar2 Package:com.joaomgcd.autonotification Name:AutoNotification Cancel Timeout (Seconds):0 ] 
&lt;/div&gt;&lt;/p&gt;
&lt;h3&gt;Pobieranie profilu&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://drive.google.com/file/d/0B9CkGmXTLcF0VDlOaGlEcWMxR2s&quot; target=&quot;_blank&quot;&gt;Projekt Urodziny&lt;/a&gt; [Tasker 4.5u1]&lt;br&gt;
Pliki JPG należy umieścić w folderze &lt;i&gt;/sdcard/Tasker/pictures/&lt;/i&gt;.&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/5863686460733420403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/5863686460733420403'/><link rel='alternate' type='text/html' href='http://tasker-android.blogspot.com/2014/10/tasker-przypomni-ci-o-urodzinach.html' title='Tasker przypomni Ci o urodzinach, imieninach i rocznicach'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05046866348300228265</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCEUizUcBEDhBUPyxAc2TN4AaWWlZ3YJyRc49VG9NpvavRXyDGBDpDb9WG4Gbdn_GdBPBkGnNVVWsqnFtIS-jled4PrHCYXPCj-dAKKiGXxShFXF6amEuKZ9Q6OIJ4QxIqIC_n6ld7FFY/s72-c/urodziny.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-5723209725752603760.post-6721894108658712671</id><published>2014-10-13T14:30:00.000+02:00</published><updated>2014-10-13T14:30:44.406+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="aktualizacja"/><category scheme="http://www.blogger.com/atom/ns#" term="Tasker"/><title type='text'>Tasker - aktualizacja do wersji 4.5u1</title><content type='html'>&lt;p&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrv2T5cbFkfvWO_jWQhI-vO9sFAGqOA9VrpBKQWJ6sMkTCPMAGIi-MDX1bzLmbUfpSCOeI_YNwUanAdEOk_VP5jA-NTao3VbRUEJCaw1PWNoJl-ljpFte9P2o5Wd-63hJUNQwq4x3p_70/s1600/update.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: none; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrv2T5cbFkfvWO_jWQhI-vO9sFAGqOA9VrpBKQWJ6sMkTCPMAGIi-MDX1bzLmbUfpSCOeI_YNwUanAdEOk_VP5jA-NTao3VbRUEJCaw1PWNoJl-ljpFte9P2o5Wd-63hJUNQwq4x3p_70/s400/update.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Przedwczoraj pojawiła się nowa wersja Taskera &lt;b&gt;4.5u1&lt;/b&gt;. Jest to aktualizacja poprawiająca błędy w wersji 4.5. Zachęcam do aktualizacji.&lt;/p&gt;
&lt;h3&gt;Lista zmian&lt;/h3&gt;
&lt;p&gt;&lt;ul&gt;
    &lt;li&gt;change: listMarginWidthPercent is written to prefs file so user doesn&#39;t need to create new entry&lt;/li&gt;
    &lt;li&gt;change: app creation: Debug Version option no longer causes debuggable to be set in the manifest (prevented Play Store publication)&lt;/li&gt;
    &lt;li&gt;bugfix: Text element in scene: links were causing crash&lt;/li&gt;
    &lt;li&gt;bugfix: BT Near: bugged in some earlier Android versions&lt;/li&gt;
    &lt;li&gt;bugfix: scene destruction: wasn&#39;t tidying up event handlers correctly which was producing warnings&lt;/li&gt;
    &lt;li&gt;bugfix: scene element TextEdit: crash due to cursor movement in some circumstance&lt;/li&gt;
    &lt;li&gt;bugfix: catch exception selecting sub-activities for some apps&lt;/li&gt;
    &lt;li&gt;bugfix: catch exception when state plugin result comes in for profile that doesn&#39;t exist anymore&lt;/li&gt;
    &lt;li&gt;bugfix: better handle exceptions that can occur loading bad config data&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;h3&gt;Pobieranie&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm&quot; title=&quot;Tasker&quot; rel=&quot;nofollow&quot;&gt;Google Play&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;http://tasker.dinglisch.net/download.html&quot; title=&quot;Tasker for Android&quot; rel=&quot;nofollow&quot;&gt;Strona Taskera&lt;/a&gt;&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/6721894108658712671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/6721894108658712671'/><link rel='alternate' type='text/html' href='http://tasker-android.blogspot.com/2014/10/tasker-aktualizacja-do-wersji-45u1.html' title='Tasker - aktualizacja do wersji 4.5u1'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05046866348300228265</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrv2T5cbFkfvWO_jWQhI-vO9sFAGqOA9VrpBKQWJ6sMkTCPMAGIi-MDX1bzLmbUfpSCOeI_YNwUanAdEOk_VP5jA-NTao3VbRUEJCaw1PWNoJl-ljpFte9P2o5Wd-63hJUNQwq4x3p_70/s72-c/update.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-5723209725752603760.post-5215826183093919277</id><published>2014-10-07T22:38:00.000+02:00</published><updated>2014-10-07T22:38:03.276+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="aktualizacja"/><category scheme="http://www.blogger.com/atom/ns#" term="Tasker"/><title type='text'>Tasker - aktualizacja do wersji 4.5</title><content type='html'>&lt;p&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrv2T5cbFkfvWO_jWQhI-vO9sFAGqOA9VrpBKQWJ6sMkTCPMAGIi-MDX1bzLmbUfpSCOeI_YNwUanAdEOk_VP5jA-NTao3VbRUEJCaw1PWNoJl-ljpFte9P2o5Wd-63hJUNQwq4x3p_70/s1600/update.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: none; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrv2T5cbFkfvWO_jWQhI-vO9sFAGqOA9VrpBKQWJ6sMkTCPMAGIi-MDX1bzLmbUfpSCOeI_YNwUanAdEOk_VP5jA-NTao3VbRUEJCaw1PWNoJl-ljpFte9P2o5Wd-63hJUNQwq4x3p_70/s400/update.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Właśnie pojawiła się nowa wersja Taskera &lt;b&gt;4.5&lt;/b&gt;. Zachęcam do aktualizacji.&lt;/p&gt;
&lt;h3&gt;Lista zmian&lt;/h3&gt;
&lt;p&gt;&lt;ul&gt;
  &lt;li&gt;switched to Google Maps API v2&lt;/li&gt;
  &lt;li&gt;app creation: users of maps in scenes will need to get a Google Maps API v2 key&lt;/li&gt;
  &lt;li&gt;removed: element Add Geomarker: parameters Label, Label Colour (not supported by new Maps API v2)&lt;/li&gt;
  &lt;li&gt;added: location edit: optionally long-click and drag on current location marker to move it&lt;/li&gt;
  &lt;li&gt;added: map element: toggle parameter for roads&lt;/li&gt;
  &lt;li&gt;added: action Element Map Control: Hide/Show Roads, Enable/Disable Compass/Tilt/Rotation/Zoom Gestures, Hide Zoom Controls modes&lt;/li&gt;
  &lt;li&gt;added: location edit: show lat/lng at top, editable&lt;/li&gt;
  &lt;li&gt;added: %WIFII: channel number when wifi is connected (Android L+)&lt;/li&gt;
  &lt;li&gt;added: actions Timer Widget Control and Timer Widget Set&lt;/li&gt;
  &lt;li&gt;added: action Variable Subtract: Wrap Around parameter&lt;/li&gt;
  &lt;li&gt;added: builtin local array variable %caller (caller trace for current task) (see Variables section of Userguide)&lt;/li&gt;
  &lt;li&gt;added: location Edit: menu option to enter text address&lt;/li&gt;
  &lt;li&gt;added: plugins: action/event/state edit screens: show relevant variables from plugins&lt;/li&gt;
  &lt;li&gt;added: action Element Image: usable for Button and Slider elements&lt;/li&gt;
  &lt;li&gt;added: test Scene: width and height&lt;/li&gt;
  &lt;li&gt;bugfix: patch for Android PRNG bug (may improve random number generation on some devices)&lt;/li&gt;
  &lt;li&gt;bugfix: Set Widget Icon/Label: spurious error message when an anonymous widget was present on home screen&lt;/li&gt;
  &lt;li&gt;bugfix: Search: bad bottom button alignment in some languages&lt;/li&gt;
  &lt;li&gt;bugfix: main screen, variables tab: show max 500 characters of a variable contents (longer vars can lock up UI)&lt;/li&gt;
  &lt;li&gt;bugfix: monitor was hanging under high system load sometimes, improved broadcast handling efficiency&lt;/li&gt;
  &lt;li&gt;bugfix: task select list: was generating spurious warning on all Tasker UI themes except Light&lt;/li&gt;
  &lt;li&gt;bugfix: another attempted fix for ANRs during plugin response processing&lt;/li&gt;
  &lt;li&gt;bugfix: BT Near: workaround for Android bug reporting device type as unknown from an LE scan&lt;/li&gt;
  &lt;li&gt;bugfix: event Received Text: MMS wasn&#39;t working on 4.1 and earlier devices&lt;/li&gt;
  &lt;li&gt;bugfix: %WIFII: was not converting many frequencies to the correct channel&lt;/li&gt;
  &lt;li&gt;bugfix: action Test Tasker: action/event/state selection had bad title&lt;/li&gt;
  &lt;li&gt;bugfix: TextEdit element: cursor was not being moved to end when text was set&lt;/li&gt;
  &lt;li&gt;bugfix: action Popup: several local variables weren&#39;t being set on timeout with a default item selected (e.g. %tap_label)&lt;/li&gt;
  &lt;li&gt;bugfix: app creation: JavaScriptlet references to showScene and performTask: include relevant task/scene in kid&lt;/li&gt;
  &lt;li&gt;bugfix: scene element text: Vertical Fit Mode: Reduce Text Size: improved fitting algorithm&lt;/li&gt;
  &lt;li&gt;bugfix: app creation: slider element icons were not being exported or applied correctly&lt;/li&gt;
  &lt;li&gt;bugfix: profile list on/off buttons could have labels in incorrect language&lt;/li&gt;
  &lt;li&gt;bugfix: failure to import old data due to over-enthusiastic data verification checks&lt;/li&gt;
  &lt;li&gt;bugfix: app creation: JS func getLocation: include coarse and fine location permissions, relevant features&lt;/li&gt;
  &lt;li&gt;bugfix: action Element Value: wasn&#39;t setting initial value of spinner that had never been displayed when filled from variable&lt;/li&gt;
  &lt;li&gt;bugfix: %PRESSURE: wasn&#39;t being populated if not pressure state defined&lt;/li&gt;
  &lt;li&gt;bugfix: app creation: images in scene element Layout parameters weren&#39;t being packaged in kid apk&lt;/li&gt;
  &lt;li&gt;bugfix: problem with monitor being killed when UI exited on LG G2 / 4.4.2, possibly other devices&lt;/li&gt;
  &lt;li&gt;bugfix: scene Text elements with Scrolling enabled were blocking input to underlying elements even when hidden&lt;/li&gt;
  &lt;li&gt;bugfix: action Scan Card wasn&#39;t handling absolute paths&lt;/li&gt;
  &lt;li&gt;change: use holo dark for default theme on L devices until a final L ROM is available&lt;/li&gt;
  &lt;li&gt;change: Tasker no longer requires Google Maps (or Play Services) to be installed (but map-based functionality will not be accessible if they are missing)&lt;/li&gt;
  &lt;li&gt;change: multiple map elements are possible in a scene&lt;/li&gt;
  &lt;li&gt;change: state Wifi Near: channel max upped to 196&lt;/li&gt;
  &lt;li&gt;change: profile list on/off in German = Ein/Aus&lt;/li&gt;
  &lt;li&gt;change: read list drag margin width percent from sharedprefs if present, so customizable for root users (integer key listMarginWidthPercent)&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;h3&gt;Pobieranie&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm&quot; title=&quot;Tasker&quot; rel=&quot;nofollow&quot;&gt;Google Play&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;http://tasker.dinglisch.net/download.html&quot; title=&quot;Tasker for Android&quot; rel=&quot;nofollow&quot;&gt;Strona Taskera&lt;/a&gt;&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/5215826183093919277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/5215826183093919277'/><link rel='alternate' type='text/html' href='http://tasker-android.blogspot.com/2014/10/tasker-aktualizacja-do-wersji-45.html' title='Tasker - aktualizacja do wersji 4.5'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05046866348300228265</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrv2T5cbFkfvWO_jWQhI-vO9sFAGqOA9VrpBKQWJ6sMkTCPMAGIi-MDX1bzLmbUfpSCOeI_YNwUanAdEOk_VP5jA-NTao3VbRUEJCaw1PWNoJl-ljpFte9P2o5Wd-63hJUNQwq4x3p_70/s72-c/update.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-5723209725752603760.post-5186211836191596212</id><published>2014-10-04T00:28:00.000+02:00</published><updated>2015-03-27T12:25:21.103+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AutoContacts"/><category scheme="http://www.blogger.com/atom/ns#" term="AutoVoice"/><category scheme="http://www.blogger.com/atom/ns#" term="AutoVoice Recognize"/><category scheme="http://www.blogger.com/atom/ns#" term="Call"/><category scheme="http://www.blogger.com/atom/ns#" term="Else"/><category scheme="http://www.blogger.com/atom/ns#" term="End If"/><category scheme="http://www.blogger.com/atom/ns#" term="If"/><category scheme="http://www.blogger.com/atom/ns#" term="Say"/><category scheme="http://www.blogger.com/atom/ns#" term="Stop"/><category scheme="http://www.blogger.com/atom/ns#" term="text-to-speech"/><category scheme="http://www.blogger.com/atom/ns#" term="TTS"/><category scheme="http://www.blogger.com/atom/ns#" term="Variable Set"/><category scheme="http://www.blogger.com/atom/ns#" term="Variable Split"/><category scheme="http://www.blogger.com/atom/ns#" term="wyrażenia regularne"/><title type='text'>Profil: Głosowe wybieranie numerów</title><content type='html'>&lt;p&gt;Dziś mniej teorii, a więcej praktyki. Zajmiemy się profilem, który umożliwi głosowe wybieranie numerów kontaktów i inicjowanie połączenia głosowego. Niestety sam Tasker nie pozwoli zrealizować takiego profilu. Pomocne będą wtyczki &lt;b&gt;AutoContacts&lt;/b&gt; i &lt;b&gt;AutoVoice&lt;/b&gt;.&lt;br&gt;Profil ma za zadanie odnaleźć dany kontakt w książce adresowej, odczytać jego numery telefonów, zapytać użytkownika, na który numer chce zadzwonić i wywołać połączenie.&lt;/p&gt;
&lt;h3&gt;Wymagania&lt;/h3&gt;
&lt;p&gt;&lt;ul&gt;
&lt;li&gt;wtyczka &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.joaomgcd.autovoice&quot; title=&quot;AutoVoice&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot; &gt;AutoVoice&lt;/a&gt; w wersji płatnej&lt;/li&gt;
&lt;li&gt;wtyczka &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.joaomgcd.autocontacts&quot; title=&quot;AutoContacts&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot; &gt;AutoContacts&lt;/a&gt; w wersji płatnej&lt;/li&gt;
&lt;li&gt;generator głosu Text-To-Speech, przykładowo &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.ivona.tts&quot; title=&quot;IVONA Text-to-Speech&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;IVONA&lt;/a&gt; lub &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.google.android.tts&quot; title=&quot;Zmiana tekstu na mowę Google&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Google TTS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;do poprawnego działania profilu niezbędny jest porządek w książce adresowej tzn. numery telefonów muszą być opisane jako &lt;span class=&quot;code&quot;&gt;komórka&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;domowy&lt;/span&gt; lub &lt;span class=&quot;code&quot;&gt;służbowy&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;h3&gt;Wtyczka AutoVoice&lt;/h3&gt;
&lt;p&gt;Wtyczka &lt;b&gt;AutoVoice&lt;/b&gt;, w wielkim skrócie, pozwala na uruchamianie tasków Taskera za pomocą komend głosowych. Dzięki niej możemy oprogramować głosowo praktycznie wszystkie funkcje telefonu lub tabletu. Do prawidłowego działania wtyczka wymaga połączenia z internetem.&lt;/p&gt;
&lt;h4&gt;Instalacja i konfiguracja&lt;/h4&gt;
&lt;p&gt;Wtyczkę AutoVoice można pobrać ze sklepu &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.joaomgcd.autovoice&quot; title=&quot;AutoVoice&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Google Play&lt;/a&gt;. Po instalacji i wykupienia wersji Pro pozostaje wybór sposobu uruchamiania komend głosowych. Najprostszym rozwiązaniem jest dodanie na pulpit skrótu &lt;b&gt;Recognize&lt;/b&gt;.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6zBPe84coyrotydDcU18fjDg_bXvUWe1skeL2TsSql0MN3tksfGKlipfrxDDD3aJYJ49RaF6nWFBdAwqmNNX41y-sJC_bU8Y_OSugYB7p-SFYaYQ4hhEhVQ2wXnuJovyKmJn_txyyFVo/s1600/Recognize.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6zBPe84coyrotydDcU18fjDg_bXvUWe1skeL2TsSql0MN3tksfGKlipfrxDDD3aJYJ49RaF6nWFBdAwqmNNX41y-sJC_bU8Y_OSugYB7p-SFYaYQ4hhEhVQ2wXnuJovyKmJn_txyyFVo/s400/Recognize.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Trochę wygodniejszym rozwiązaniem jest uruchamianie tego skrótu gestem co można osiągnąć stosując alternatywne launchery np. &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.teslacoilsw.launcher&quot; title=&quot;Nova Launcher&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Nova Launcher&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Wtyczka AutoContacts&lt;/h3&gt;
&lt;p&gt;Wtyczka &lt;b&gt;AutoContacts&lt;/b&gt; daje dostęp Taskerowi do kontaktów z książki adresowej. Dzięki niej możemy dotrzeć do numerów telefonów kontaktu, do którego chcemy zadzwonić.&lt;/p&gt;
&lt;h4&gt;Instalacja i konfiguracja&lt;/h4&gt;
&lt;p&gt;Wtyczkę AutoContacts można pobrać ze sklepu &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.joaomgcd.autocontacts&quot; title=&quot;AutoContacts&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Google Play&lt;/a&gt;. Po instalacji i wykupienia wersji Pro należy w konfiguracji wtyczki uruchomić opcję &lt;b&gt;Force Refresh Contacts&lt;/b&gt; co pozwoli odczytać z książki adresowej dane wszystkich kontaktów.&lt;br&gt;
Aby łatwiej wybierać głosowo kontakty dobrze jest najczęściej używanym nadać ksywki. Po naciśnięcie opcji &lt;b&gt;Manage Contacts&lt;/b&gt; w konfiguracji wtyczki i przytrzymaniu dłużej wybranego kontaktu możemy nadać mu ksywkę (opcja &lt;b&gt;Set Nickname&lt;/b&gt;). Przykładowo kontaktowi &lt;span class=&quot;code&quot;&gt;Jan Kowalski&lt;/span&gt; nadanie ksywki &lt;span class=&quot;code&quot;&gt;Janka&lt;/span&gt; pozwoli na wykonanie połączenia telefonicznego do tego kontaktu poprzez wypowiedzenie komendy &lt;span class=&quot;code&quot;&gt;zadzwoń do Janka&lt;/span&gt; zamiast &lt;span class=&quot;code&quot;&gt;zadzwoń do Jan Kowalski&lt;/span&gt;.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTEoom3FKrncj6Ef4WOMLLduavBiP9_THIYc3xCw9698DvNuqbZ753gpDWlLz1U6HW-O9msD2drQsZKFmEcDJ6417SBMUKFqVO4x78pXRinLppQd37WIoMJgFrdOHCLrztMsAMKx3X0OY/s1600/AutoContacts.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTEoom3FKrncj6Ef4WOMLLduavBiP9_THIYc3xCw9698DvNuqbZ753gpDWlLz1U6HW-O9msD2drQsZKFmEcDJ6417SBMUKFqVO4x78pXRinLppQd37WIoMJgFrdOHCLrztMsAMKx3X0OY/s400/AutoContacts.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h3&gt;Opis wykonania&lt;/h3&gt;
&lt;p&gt;Kontekstem uruchamiającym profil jest &lt;b&gt;State&lt;/b&gt; / &lt;b&gt;Plugin&lt;/b&gt; / &lt;b&gt;AutoVoice Recognized&lt;/b&gt;. W konfiguracji kontekstu należy zaznaczyć opcję &lt;b&gt;Event Behavior&lt;/b&gt; oraz &lt;b&gt;Use Regex&lt;/b&gt; natomiast w polu &lt;b&gt;Command Filter&lt;/b&gt; wpisać &lt;span class=&quot;code&quot;&gt;zadzwoń do (?&amp;lt;contact&amp;gt;.+)&lt;/span&gt;. Taki zapis oznacza, że wszystko co zostanie wypowiedziane po &lt;span class=&quot;code&quot;&gt;zadzwoń do&lt;/span&gt; zostanie przekazane do tasku profila w postacie zmiennej &lt;span class=&quot;code&quot;&gt;%contact&lt;/span&gt;.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI3Ur9ZUVAQlhtUFNA9DQWrMWBEd5Af35hBrbdjPsyWZku09-RQ9isuZWHUE3xcfntOeMsf0G8MVJnXEhqh5stYUWhjkWq1bSY7MwiPRQ6jMcjUKqOxZJ6GHjeLMFlrmD8n2t_fYil9Uk/s1600/AutoVoice-kontekst.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI3Ur9ZUVAQlhtUFNA9DQWrMWBEd5Af35hBrbdjPsyWZku09-RQ9isuZWHUE3xcfntOeMsf0G8MVJnXEhqh5stYUWhjkWq1bSY7MwiPRQ6jMcjUKqOxZJ6GHjeLMFlrmD8n2t_fYil9Uk/s400/AutoVoice-kontekst.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;W edycji tasku zaczynamy od akcji &lt;b&gt;Plugin&lt;/b&gt; / &lt;b&gt;AutoContacts&lt;/b&gt;. W konfiguracji akcji w polu &lt;b&gt;Contact Name or Nickname&lt;/b&gt; wpisujemy &lt;span class=&quot;code&quot;&gt;%contact&lt;/span&gt; czyli każemy wtyczce wyszukać dane kontaktu, którego nazwę/ksywkę dostarczymy w komendzie głosowej.&lt;br&gt;
Następnie sprawdzamy za pomocą akcji &lt;b&gt;If&lt;/b&gt; czy zmienna &lt;span class=&quot;code&quot;&gt;%acnunmber&lt;/span&gt; (czyli przechowująca numer telefonu odnalezionego kontaktu) ma wartość. Jeśli nie za pomocą akcji &lt;b&gt;Say&lt;/b&gt; informujemy użytkownika o błędzie. Akcja &lt;b&gt;Say&lt;/b&gt; używa generatora głosu Text-To-Speech by tekst zamienić na mowę.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqNmDhnvTt_zdlR_2uNcdJ62a7bZLzgvlkey0Lc8QlnkZvT1Xhk8L88KpS4vbJlcEY_idelrmEKfpUkOF_DytDJMlmGBpLqNARn4d2aB_VxWJLhuA7Lq57whigR1gMHUa1B0tI_ZbLr3g/s1600/Say.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqNmDhnvTt_zdlR_2uNcdJ62a7bZLzgvlkey0Lc8QlnkZvT1Xhk8L88KpS4vbJlcEY_idelrmEKfpUkOF_DytDJMlmGBpLqNARn4d2aB_VxWJLhuA7Lq57whigR1gMHUa1B0tI_ZbLr3g/s400/Say.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Następnie musimy użyć akcji &lt;b&gt;Variable Split&lt;/b&gt;, które dzielą ciągi tekstowe na części tworząc zmienną typu macierz. Jako, że &lt;b&gt;AutoContacts&lt;/b&gt; poszczególne wartości oddziela przecinkami to w akcji &lt;b&gt;Variable Split&lt;/b&gt; jako separatora użyjemy właśnie przecinka.&lt;br&gt;
Zmienne &lt;span class=&quot;code&quot;&gt;%acallnumbers&lt;/span&gt; (wszystkie numery telefonów danego kontaktu) i &lt;span class=&quot;code&quot;&gt;%acallnumbertypes&lt;/span&gt; (typy numerów telefonów) są zmiennymi macierzowymi i mogą zawierać wyniki pochodzące od więcej niż jednego kontaktu. Dlatego odczytujemy tylko pierwsze rekordy podając parametr &lt;span class=&quot;code&quot;&gt;1&lt;/span&gt; lub &lt;span class=&quot;code&quot;&gt;(1)&lt;/span&gt;.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEih_mgP-i84l0SWvslPvxb3W31BfLNszl0jqQOY1ElrZbcQg-COs2zQwP7tRrNB8MLV0L2J_7fptfVkDJng1QyJEHV11uyC8csRvArHCiUMZx_ybQBLSQmb-XzSn4jGERZyCDjMh79sxdM/s1600/Var-split.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEih_mgP-i84l0SWvslPvxb3W31BfLNszl0jqQOY1ElrZbcQg-COs2zQwP7tRrNB8MLV0L2J_7fptfVkDJng1QyJEHV11uyC8csRvArHCiUMZx_ybQBLSQmb-XzSn4jGERZyCDjMh79sxdM/s400/Var-split.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Kolejnym krokiem jest przekazanie do zmiennej &lt;span class=&quot;code&quot;&gt;%index&lt;/span&gt; pozycji, na której znajdują się poszczególne typy numerów telefonów. W przypadku telefonu komórkowego będzie to &lt;span class=&quot;code&quot;&gt;%acallnumbertypes1(#?Komórka)&lt;/span&gt;. Dalej za pomocą wyznaczonej wartości przekazujemy do zmiennej &lt;span class=&quot;code&quot;&gt;%komórka&lt;/span&gt; numer telefonu komórkowego za pomocą składni &lt;span class=&quot;code&quot;&gt;%acallnumbers1(%index1)&lt;/span&gt;. Następnie powtarzamy te operacje dla telefonu domowego oraz służbowego.&lt;br&gt;
Należy pamiętać, że w różnych wersjach producenckich systemu Android inaczej mogą być oznaczane typy numerów telefonów. W przypadku &quot;czystego&quot; Androida oraz wszelkich wersji bazujących na AOSP/CM będzie to odpowiednio: &lt;span class=&quot;code&quot;&gt;Komórka&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;Służbowy&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;Domowy&lt;/span&gt;. Jeśli w danym systemie oznaczenie te są inne (przykładowo w telefonach Samsunga numer telefonu komórkowego opisywany jest jako &lt;span class=&quot;code&quot;&gt;Komórkowy&lt;/span&gt;) należy zmienić je w akcjach numer 8, 11 i 14. &lt;br&gt;
Kolejnym krokiem jest połączenie numerów telefonów ze zmiennych &lt;span class=&quot;code&quot;&gt;%komórka&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;%dom&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;%praca&lt;/span&gt; (pod warunkiem, że mają wartości) oddzielonych przecinkami do zmiennej &lt;span class=&quot;code&quot;&gt;%telefony&lt;/span&gt; za pomocą akcji &lt;b&gt;Variable Set&lt;/b&gt; z zaznaczoną opcją &lt;b&gt;Append&lt;/b&gt;. Teraz możemy zamienić tą zmienną w macierz i ilość jej elementów przekazać do zmiennej &lt;span class=&quot;code&quot;&gt;%index&lt;/span&gt;.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeDUM1i3Xw88CGYQM9_MLcnWnL0hRMqNCeja-UbKXaI_8fi5nMKNjm2HPSJVzNiXwjhfdxYMgB4GxlI1XR7ZW_I51p9FHhfIED1bo2vUKj-jSvd3UD2rd4iGjeXVSwsAPyMIoiiXKJldA/s1600/macierz-ile.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeDUM1i3Xw88CGYQM9_MLcnWnL0hRMqNCeja-UbKXaI_8fi5nMKNjm2HPSJVzNiXwjhfdxYMgB4GxlI1XR7ZW_I51p9FHhfIED1bo2vUKj-jSvd3UD2rd4iGjeXVSwsAPyMIoiiXKJldA/s400/macierz-ile.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Jeśli wartość &lt;span class=&quot;code&quot;&gt;%index&lt;/span&gt; ma wartość &lt;span class=&quot;code&quot;&gt;1&lt;/span&gt; czyli kontakt ma tylko jeden numer telefonu za pomocą akcji &lt;b&gt;Call&lt;/b&gt; wywołujemy połączenie głosowe pod dany numer.&lt;br&gt;
Jeśli zmienna &lt;span class=&quot;code&quot;&gt;%index&lt;/span&gt; ma wartość większą od &lt;span class=&quot;code&quot;&gt;1&lt;/span&gt; za pomocą akcji &lt;b&gt;Say&lt;/b&gt; pytamy użytkownika, na który numer ma być wykonane połączenie. Odpowiedź głosową rejestrujemy akcją &lt;b&gt;AutoVoice Recognize&lt;/b&gt;, która trafia do zmiennej &lt;span class=&quot;code&quot;&gt;%avcomm&lt;/span&gt;. Następnie wywołujemy akcję &lt;b&gt;Call&lt;/b&gt; pod wybrany numer w zależności od zawartości tej zmiennej.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNo9OHI5G7fw6lZc5WrnuCf8ianp1zL_J-qPGKESbtrSUoNNRVWx5Mn1gB97GFP3sIlihZrT-pYxdqdws62P3GMMg61lftwMXGwz000CvLGnELgbLiGOzCkPRwpq14Bhi34yiOTMXWPzg/s1600/Call.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNo9OHI5G7fw6lZc5WrnuCf8ianp1zL_J-qPGKESbtrSUoNNRVWx5Mn1gB97GFP3sIlihZrT-pYxdqdws62P3GMMg61lftwMXGwz000CvLGnELgbLiGOzCkPRwpq14Bhi34yiOTMXWPzg/s400/Call.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;I to już koniec. Profil gotowy. Na zrzutach ekranu powinien on wyglądać następująco:
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgv2nN1gxJC6IkthD8NqMkP3UBFlu5KCd3rwV1aHHOC5hCiwjoiREXXG7EYpGVwouOZITRogsqmNLh-n_R-v5Dz-eHyt4KvR4G9QxEj0gC8UOY-ZKhPTyfrgndjFrcfxXHbwwdEjgJ8gQ/s1600/zadzwon01.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgv2nN1gxJC6IkthD8NqMkP3UBFlu5KCd3rwV1aHHOC5hCiwjoiREXXG7EYpGVwouOZITRogsqmNLh-n_R-v5Dz-eHyt4KvR4G9QxEj0gC8UOY-ZKhPTyfrgndjFrcfxXHbwwdEjgJ8gQ/s400/zadzwon01.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLBsX9FsTpNx0kjl1JfYjLYovyUIh2vTgXh_zaHeF08R3SBGqz8ie99ghlC0WuwpmRKB-7cmc0LPIBsvd5WPx-SOIDfCShw8cnUS6tBWZ72M9oIQUOQwB6o2c_2zUqMZleEpN_Xyn5Vu0/s1600/zadzwon02.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLBsX9FsTpNx0kjl1JfYjLYovyUIh2vTgXh_zaHeF08R3SBGqz8ie99ghlC0WuwpmRKB-7cmc0LPIBsvd5WPx-SOIDfCShw8cnUS6tBWZ72M9oIQUOQwB6o2c_2zUqMZleEpN_Xyn5Vu0/s400/zadzwon02.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Aby w przyszłości AutoContacts miał dostęp do dodanych i zmienionych kontaktów należy stworzyć profil, który będzie odświeżał dane wtyczki. U mnie taki profil uruchamia się codziennie o drugiej godzinie w nocy pod warunkiem podłączneia telefonu do ładowarki. W tasku tego profilu należy dodać akcję &lt;b&gt;AutoContacts&lt;/b&gt; z zaznaczoną opcją &lt;b&gt;Refresh&lt;/b&gt;.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVMW50LfFLBgfdNwZSpIn-PFj5WTS6DqXoK-HmmPj22fsdNn_bkWoYWDlDeVRo9bThvPLYidNtJ08ZHY2zGw-90-xK14WYzdJjKxDonLUPznOjyt76xOfe60etlN7jc1IsDbbvd4gdTEU/s1600/refresh.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVMW50LfFLBgfdNwZSpIn-PFj5WTS6DqXoK-HmmPj22fsdNn_bkWoYWDlDeVRo9bThvPLYidNtJ08ZHY2zGw-90-xK14WYzdJjKxDonLUPznOjyt76xOfe60etlN7jc1IsDbbvd4gdTEU/s400/refresh.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;
&lt;h3&gt;Rozpisany profil&lt;/h3&gt;
&lt;p&gt;&lt;div class=&quot;code&quot;&gt;
Profile: Zadzwoń do (195)&lt;br&gt;
State: AutoVoice Recognized [ Configuration:Event Behaviour: true Command: &quot;zadzwoń do (?&amp;lt;contact&amp;gt;.+) (regex)&quot; ]&lt;br&gt;
Enter: Anon (196)&lt;br&gt;
A1: AutoContacts [ Configuration:Contact Name or Nickname: %contact Package:com.joaomgcd.autocontacts Name:AutoContacts Timeout (Seconds):1000 Continue Task After Error:On ]&lt;br&gt;
A2: If [ %acnumber !Set ]&lt;br&gt;
A3: Say [ Text:Nie znaleziono kontaktu %contact Engine:Voice:default:default Stream:5 Pitch:5 Speed:5 Respect Audio Focus:On Network:Off Continue Task Immediately:Off ]&lt;br&gt;
A4: Stop [ With Error:Off Task: ]&lt;br&gt; 
A5: End If&lt;br&gt;
A6: Variable Split [ Name:%acallnumbers1 Splitter:, Delete Base:Off ]&lt;br&gt;
A7: Variable Split [ Name:%acallnumbertypes1 Splitter:, Delete Base:Off ] &amp;lt;komórka&amp;gt;&lt;br&gt;
A8: Variable Set [ Name:%index To:%acallnumbertypes1(#?Komórka) Do Maths:Off Append:Off ]&lt;br&gt;
A9: Variable Split [ Name:%index Splitter:, Delete Base:Off ] If [ %index !~ 0 ]&lt;br&gt;
A10: Variable Set [ Name:%komórka To:%acallnumbers1(%index1) Do Maths:Off Append:Off ] If [ %index !~ 0 ] &amp;lt;praca&amp;gt;&lt;br&gt;
A11: Variable Set [ Name:%index To:%acallnumbertypes1(#?Służbowy) Do Maths:Off Append:Off ]&lt;br&gt;
A12: Variable Split [ Name:%index Splitter:, Delete Base:Off ] If [ %index !~ 0 ]&lt;br&gt;
A13: Variable Set [ Name:%praca To:%acallnumbers1(%index1) Do Maths:Off Append:Off ] If [ %index !~ 0 ] &amp;lt;dom&amp;gt;&lt;br&gt;
A14: Variable Set [ Name:%index To:%acallnumbertypes1(#?Domowy) Do Maths:Off Append:Off ]&lt;br&gt;
A15: Variable Split [ Name:%index Splitter:, Delete Base:Off ] If [ %index !~ 0 ]&lt;br&gt;
A16: Variable Set [ Name:%dom To:%acallnumbers1(%index1) Do Maths:Off Append:Off ] If [ %index !~ 0 ]&lt;br&gt;
A17: Variable Set [ Name:%telefony To:komórka, Do Maths:Off Append:Off ] If [ %komórka Set ]&lt;br&gt;
A18: Variable Set [ Name:%telefony To:dom, Do Maths:Off Append:On ] If [ %dom Set ]&lt;br&gt;
A19: Variable Set [ Name:%telefony To:praca, Do Maths:Off Append:On ] If [ %praca Set ]&lt;br&gt;
A20: Variable Split [ Name:%telefony Splitter:, Delete Base:Off ] &lt;br&gt;
A21: Variable Set [ Name:%index To:%telefony(#) Do Maths:Off Append:Off ] &lt;br&gt;
A22: If [ %index = 1 ]&lt;br&gt;
A23: Call [ Number:%komórka Auto Dial:On ] If [ %komórka Set ]&lt;br&gt;
A24: Call [ Number:%dom Auto Dial:On ] If [ %dom Set ]&lt;br&gt;
A25: Call [ Number:%praca Auto Dial:On ] If [ %praca Set ]&lt;br&gt;
A26: Else&lt;br&gt;
A27: Say [ Text:Na który numer %acname chcesz zadzwonić: %telefony Engine:Voice:default:default Stream:3 Pitch:5 Speed:5 Respect Audio Focus:On Network:Off Continue Task Immediately:Off ]&lt;br&gt;
A28: AutoVoice Recognize [ Configuration: Voice command without headset Command: &quot;all&quot; Package:com.joaomgcd.autovoice Name:AutoVoice Recognize Timeout (Seconds):120 ]&lt;br&gt; 
A29: Call [ Number:%komórka Auto Dial:On ] If [ %avcomm ~ *komórka* ]&lt;br&gt;
A30: Call [ Number:%dom Auto Dial:On ] If [ %avcomm ~ *dom* ]&lt;br&gt;
A31: Call [ Number:%praca Auto Dial:On ] If [ %avcomm ~ *praca* ]&lt;br&gt;
A32: End If&lt;br&gt;
&lt;br&gt;
Profile: Odświeżanie kontaktów (197)&lt;br&gt;
Time: 02:00&lt;br&gt;
State: Power [ Source:AC ]&lt;br&gt;
Enter: Anon (198)&lt;br&gt;
A1: AutoContacts [ Configuration:Refresh: true Package:com.joaomgcd.autocontacts Name:AutoContacts Timeout (Seconds):1000 ]&lt;br&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;h3&gt;Pobieranie profilu&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://drive.google.com/file/d/0B9CkGmXTLcF0S1lQV0ZZYjRpcTQ&quot; target=&quot;_blank&quot;&gt;Profil Głosowe wybieranie połączenia telefonicznego&lt;/a&gt; [Tasker 4.5u1]&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/5186211836191596212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/5186211836191596212'/><link rel='alternate' type='text/html' href='http://tasker-android.blogspot.com/2014/10/profil-gosowe-wywoywanie-poaczenia_4.html' title='Profil: Głosowe wybieranie numerów'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05046866348300228265</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6zBPe84coyrotydDcU18fjDg_bXvUWe1skeL2TsSql0MN3tksfGKlipfrxDDD3aJYJ49RaF6nWFBdAwqmNNX41y-sJC_bU8Y_OSugYB7p-SFYaYQ4hhEhVQ2wXnuJovyKmJn_txyyFVo/s72-c/Recognize.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-5723209725752603760.post-4526833984714141600</id><published>2014-08-30T00:35:00.002+02:00</published><updated>2014-08-30T00:35:06.214+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Else"/><category scheme="http://www.blogger.com/atom/ns#" term="End For"/><category scheme="http://www.blogger.com/atom/ns#" term="End If"/><category scheme="http://www.blogger.com/atom/ns#" term="Flash"/><category scheme="http://www.blogger.com/atom/ns#" term="For"/><category scheme="http://www.blogger.com/atom/ns#" term="Goto"/><category scheme="http://www.blogger.com/atom/ns#" term="If"/><category scheme="http://www.blogger.com/atom/ns#" term="instrukcje warunkowe"/><category scheme="http://www.blogger.com/atom/ns#" term="Stop"/><category scheme="http://www.blogger.com/atom/ns#" term="Tasker"/><category scheme="http://www.blogger.com/atom/ns#" term="Toast"/><category scheme="http://www.blogger.com/atom/ns#" term="Variable Add"/><category scheme="http://www.blogger.com/atom/ns#" term="zmienne"/><title type='text'>Zapętlony Tasker</title><content type='html'>&lt;p&gt;Prędzej czy później (raczej prędzej) tworząc profile w Taskerze potrzebne nam będzie skorzystanie z instrukcji warunkowych i pętli. Dla niewtajemniczonych pewnie brzmi to dość strasznie ale postaram się wszystko łopatologicznie wytłumaczyć. Przed pętlami omówię akcje &lt;b&gt;Goto&lt;/b&gt;, &lt;b&gt;Stop&lt;/b&gt; oraz &lt;b&gt;etykiety&lt;/b&gt; akcji, które będą nam za chwilę potrzebne.&lt;br&gt;Oczywiście zachęcam do komentowania i zadawania pytań jeśli coś będzie niejasne.&lt;/p&gt;
&lt;h3&gt;Akcje Goto, Stop oraz etykiety&lt;/h3&gt;
&lt;p&gt;Zazwyczaj akcje tasku wykonywane są kolejno jeden po drugim. Dzięki akcji &lt;b&gt;Goto&lt;/b&gt; możemy wykonać skok do innych części tasku. Skok taki można wykonać do:
&lt;ul&gt;&lt;li&gt;akcji o wybranym numerze&lt;/li&gt;
&lt;li&gt;akcji o wprowadzonej &lt;b&gt;etykiecie&lt;/b&gt; (label)&lt;/li&gt;
&lt;li&gt;początku pętli&lt;/li&gt;
&lt;li&gt;końca pętli&lt;/li&gt;
&lt;li&gt;końca instrukcji warunkowej &lt;b&gt;If&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Etykieta&lt;/b&gt; akcji to nazwa nadana przez użytkownika. Tworzy się ją w konfiguracji danej akcji zaznaczając checkbox &lt;b&gt;Label&lt;/b&gt; i wpisując nazwę etykiety.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiq_F4zj1jjOKKAvAR8XZMENOd4qhhKgnXKlVJQTYEHO-5yNAqYBTDheAnR2K8K75ozeSNNcdL___RglN7UW64qpHUUDFKNmvFhYjTlRtdfssOrOYJQ_LdXz_yRT3Rcu5SzPw7ydGh7fBE/s1600/GOTO-LABEL.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiq_F4zj1jjOKKAvAR8XZMENOd4qhhKgnXKlVJQTYEHO-5yNAqYBTDheAnR2K8K75ozeSNNcdL___RglN7UW64qpHUUDFKNmvFhYjTlRtdfssOrOYJQ_LdXz_yRT3Rcu5SzPw7ydGh7fBE/s400/GOTO-LABEL.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Akcja &lt;b&gt;Stop&lt;/b&gt; powoduje natychmiastowe zakończenie przetwarzania tasku.
&lt;/p&gt;
&lt;h3&gt;Instrukcja warunkowa If...Else...End If&lt;/h3&gt;
&lt;p&gt;Instrukcja warunkowa &lt;b&gt;If&lt;/b&gt; jest elementem, który pozwala wykonać pewne akcje w zależności od tego czy zdefiniowane wyrażenie logiczne jest spełnione lub nie.&lt;br&gt;
Instrukcję tą tworzymy za pomocą akcji &lt;b&gt;If&lt;/b&gt;, &lt;b&gt;Else&lt;/b&gt; oraz &lt;b&gt;End If&lt;/b&gt;. W konfiguracji akcji &lt;b&gt;If&lt;/b&gt; dokonujemy porównania wartości. Jeśli jest ono spełnione wykonują się akcje po akcji &lt;b&gt;If&lt;/b&gt;, jeśli nie, wykonują się akcje po akcji &lt;b&gt;Else&lt;/b&gt; (jeśli takowa jest dodana). Jeżeli po instrukcji warunkowej mają być umieszczone inne akcje, nie związane z instrukcją warunkową, trzeba zakończyć ją akcją &lt;b&gt;End If&lt;/b&gt;.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4dyVtDmj2WwlzRLnEAHtLuQnGGrhsSiHWPyvcQ4bxa7zRPGppv0mmy8ayBV5kEnISRg_TElJ58q4VwdD-qWOmBdtbmSfCLOCataLD-ozlfCN40X6FaY75r8tyfVv-kL5wel8lCobEPU0/s1600/if-else.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4dyVtDmj2WwlzRLnEAHtLuQnGGrhsSiHWPyvcQ4bxa7zRPGppv0mmy8ayBV5kEnISRg_TElJ58q4VwdD-qWOmBdtbmSfCLOCataLD-ozlfCN40X6FaY75r8tyfVv-kL5wel8lCobEPU0/s400/if-else.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Warunek &lt;b&gt;If&lt;/b&gt; można też stosować w konfiguracji każdej akcji. Pozwala to uprościć warunki. W powyższym przykładzie warunek &lt;b&gt;If&lt;/b&gt; dodany jest w konfiguracji akcji &lt;b&gt;Else&lt;/b&gt; dzięki czemu otrzymujemy podwójną instrukcję warunkową. Dla zmiennej &lt;span class=&quot;code&quot;&gt;%BATT&lt;/span&gt; (globalna zmienna Taskera przechowująca poziom naładowania baterii) większej od &lt;span class=&quot;code&quot;&gt;90&lt;/span&gt; zostanie wyświetlony tost z tekstem &lt;span class=&quot;code&quot;&gt;Bateria naładowana&lt;/span&gt;. Jeśli wartość zmiennej &lt;span class=&quot;code&quot;&gt;%BATT&lt;/span&gt; będzie mniejsza niż &lt;span class=&quot;code&quot;&gt;90&lt;/span&gt; ale większa niż &lt;span class=&quot;code&quot;&gt;20&lt;/span&gt; (dodatkowy warunek&lt;b&gt; If&lt;/b&gt; w konfiguracji akcji &lt;b&gt;Else&lt;/b&gt;) wyświetlony zostanie tost &lt;span class=&quot;code&quot;&gt;Bateria: powyżej 20%&lt;/span&gt;. Jeśli żaden z powyższych warunków nie będzie spełniony zostanie wyświetlony tost &lt;span class=&quot;code&quot;&gt;Bateria bliska rozładowaniu&lt;/span&gt;.&lt;/p&gt;
&lt;h3&gt;Pętla warunkowa For each...Loop&lt;/h3&gt;
&lt;p&gt;Pętla warunkowa &lt;b&gt;For each&lt;/b&gt; umożliwia wykonanie zestawu akcji dla wybranych wartości nadawanych zmiennej. Akcja &lt;b&gt;For each&lt;/b&gt; może przyjmować następujące zestawy wartości:
&lt;ul&gt;&lt;li&gt;wartości tekstowe oddzielone przecinkami np. &lt;span class=&quot;code&quot;&gt;dom,drzewo,koń,samochód&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;wartości liczbowe oddzielone przecinkami np. &lt;span class=&quot;code&quot;&gt;3,5,8,9&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;zakres wartości liczbowych np. 2:8 co jest równoznaczne z &lt;span class=&quot;code&quot;&gt;2,3,4,5,6,7,8&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;zakres wartości liczbowych ze zdefiniowanym skokiem np. 0:10:2 co jest równoznaczne z 0,2,4,6,8,10&lt;/li&gt;
&lt;li&gt;część zmiennej typu macierz np. &lt;span class=&quot;code&quot;&gt;%macierz(1:2)&lt;/span&gt; co jest równoznaczne z &lt;span class=&quot;code&quot;&gt;%macierz1,%macierz2&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
Jeśli jako zestaw wydajności podana zostanie zmienna typu macierz w takim zapisie &lt;span class=&quot;code&quot;&gt;%macierz()&lt;/span&gt; to pętla zostanie wykonana dla jej wszystkich elementów.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiX5u5ibI54RtOxBmjPyqdj9JDvvJw_iJ08mpethYpBiYT9adefw_HmLd7omYipW_3zX4dKfLqQ50aGzoXgb0OotWrP3IFPKQ7h3cdUujsPBII6C83Hd4UXmC89sHk4leeMfuPf7E3pgak/s1600/for-each.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiX5u5ibI54RtOxBmjPyqdj9JDvvJw_iJ08mpethYpBiYT9adefw_HmLd7omYipW_3zX4dKfLqQ50aGzoXgb0OotWrP3IFPKQ7h3cdUujsPBII6C83Hd4UXmC89sHk4leeMfuPf7E3pgak/s400/for-each.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Na powyższym przykładzie zdefiniowano zakres wartości od &lt;span class=&quot;code&quot;&gt;0&lt;/span&gt; do &lt;span class=&quot;code&quot;&gt;8&lt;/span&gt; ze skokiem &lt;span class=&quot;code&quot;&gt;2&lt;/span&gt;. Pierwsza akcja &lt;b&gt;Goto&lt;/b&gt; powoduje przeskok do następnego elementu serii bez wykonania pozostałych akcji pętli jeśli zmienna &lt;span class=&quot;code&quot;&gt;%licznik&lt;/span&gt; ma wartość &lt;span class=&quot;code&quot;&gt;4&lt;/span&gt;. Druga akcja &lt;b&gt;Goto&lt;/b&gt; spowoduje przeskok do końca pętli jeśli zmienna &lt;span class=&quot;code&quot;&gt;%licznik&lt;/span&gt; ma wartość większą od &lt;span class=&quot;code&quot;&gt;6&lt;/span&gt;. Jako wynik tego tasku otrzymamy tosty z wartościami kolejno &lt;span class=&quot;code&quot;&gt;0&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;2&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;6&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;8&lt;/span&gt;.&lt;/p&gt;
&lt;h3&gt;Pętla warunkowa Until...Loop&lt;/h3&gt;
&lt;p&gt;Pętla warunkowa &lt;b&gt;Until&lt;/b&gt; pozwala na wykonanie pewnych akcji dopóki dana zmienna nie spełni założonego warunku. Tasker nie ma specjalnej akcji &lt;b&gt;Until&lt;/b&gt; ale można ją zrealizować poprzez akcję &lt;b&gt;Goto&lt;/b&gt;.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJ9OYRLXwLkQixfmZypbWRUscvYleQPTbYi1UyNjv3MLfmHQ-HCp5C7wiDFS7uU4iKddE4DsG6L_UnALRKtGsi_cn1ZpusKzNZGqIEqz24Xn56O0ZNM5rHI6zRx2iTf38ntVLCNCjE1Sk/s1600/until.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJ9OYRLXwLkQixfmZypbWRUscvYleQPTbYi1UyNjv3MLfmHQ-HCp5C7wiDFS7uU4iKddE4DsG6L_UnALRKtGsi_cn1ZpusKzNZGqIEqz24Xn56O0ZNM5rHI6zRx2iTf38ntVLCNCjE1Sk/s400/until.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Dopóki zmienna &lt;span class=&quot;code&quot;&gt;%licznik&lt;/span&gt; będzie mniejsza od &lt;span class=&quot;code&quot;&gt;12&lt;/span&gt; akcja &lt;b&gt;Goto&lt;/b&gt; będzie wykonywała przeskoki do akcji numer &lt;span class=&quot;code&quot;&gt;2&lt;/span&gt; czyli akcje pętli warunkowej będą powtarzane. Akcja &lt;b&gt;Variable Add&lt;/b&gt; za każdym razem zwiększa zmienną &lt;span class=&quot;code&quot;&gt;%licznik&lt;/span&gt; o &lt;span class=&quot;code&quot;&gt;3&lt;/span&gt; (możliwe jest zdefiniowanie innej wartości w konfiguracji akcji). Gdy po czterech powtórzeniach pętli wartość zmiennej &lt;span class=&quot;code&quot;&gt;%licznik&lt;/span&gt; będzie wynosił &lt;span class=&quot;code&quot;&gt;12&lt;/span&gt;, pętla zostanie zakończona.&lt;/p&gt;
&lt;h3&gt;Pętla warunkowa While...Loop&lt;/h3&gt;
&lt;p&gt;Pętla warunkowa &lt;b&gt;While&lt;/b&gt; pozwala na wykonanie pewnych akcji w czasie gdy dana zmienna spełnia założony warunek. Tasker nie ma specjalnej akcji &lt;b&gt;While&lt;/b&gt; ale można ją zrealizować poprzez akcje &lt;b&gt;Goto&lt;/b&gt; i &lt;b&gt;Stop&lt;/b&gt;.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpyQbYuBBgFElgHbXIhRigF8b8SaPjrpJfUyPgyODx7gSMp-M5G4KV4bNBdWWvquKenVIJguVLdpJGUaek9IdOiPcFstgPSCTSLZrqDir0dfbgPI4kjpWvwlRZm8v7e5mUZZAWgme-f-4/s1600/while.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpyQbYuBBgFElgHbXIhRigF8b8SaPjrpJfUyPgyODx7gSMp-M5G4KV4bNBdWWvquKenVIJguVLdpJGUaek9IdOiPcFstgPSCTSLZrqDir0dfbgPI4kjpWvwlRZm8v7e5mUZZAWgme-f-4/s400/while.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
W czasie gdy zmienna &lt;span class=&quot;code&quot;&gt;%licznik&lt;/span&gt; nie będzie równa &lt;span class=&quot;code&quot;&gt;12&lt;/span&gt; akcja &lt;b&gt;Goto&lt;/b&gt; będzie dokonywała skoków do akcji &lt;b&gt;Stop&lt;/b&gt; z &lt;b&gt;etykietą&lt;/b&gt; &lt;span class=&quot;code&quot;&gt;pętla&lt;/span&gt;, która sprawdza warunek co spowoduje powtarzanie akcji pętli (&lt;b&gt;Flash&lt;/b&gt; oraz &lt;b&gt;Variable Add&lt;/b&gt; zwiększające wartość zmiennej o &lt;span class=&quot;code&quot;&gt;3&lt;/span&gt;). Gdy zmienna &lt;span class=&quot;code&quot;&gt;%licznik&lt;/span&gt; osiągnie wartość &lt;span class=&quot;code&quot;&gt;12&lt;/span&gt;, warunek zostanie spełniony i akcja &lt;b&gt;Stop&lt;/b&gt; zatrzyma pętle warunkową oraz cały task. 
&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/4526833984714141600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/4526833984714141600'/><link rel='alternate' type='text/html' href='http://tasker-android.blogspot.com/2014/08/zapetlony-tasker.html' title='Zapętlony Tasker'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05046866348300228265</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiq_F4zj1jjOKKAvAR8XZMENOd4qhhKgnXKlVJQTYEHO-5yNAqYBTDheAnR2K8K75ozeSNNcdL___RglN7UW64qpHUUDFKNmvFhYjTlRtdfssOrOYJQ_LdXz_yRT3Rcu5SzPw7ydGh7fBE/s72-c/GOTO-LABEL.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-5723209725752603760.post-984638244273671978</id><published>2014-08-24T00:27:00.000+02:00</published><updated>2014-11-12T16:07:12.584+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="operatory logiczne"/><category scheme="http://www.blogger.com/atom/ns#" term="Tasker"/><category scheme="http://www.blogger.com/atom/ns#" term="wyrażenia regularne"/><category scheme="http://www.blogger.com/atom/ns#" term="znaki specjalne"/><title type='text'>Operatory logiczne, znaki specjalne i porównywanie wartości</title><content type='html'>&lt;p&gt;Dziś czeka Cię czytelniku trochę teorii. Niestety jest ona niezbędna by sprawnie posługiwać się zmiennymi, instrukcjami warunkowymi i pętlami. Postaram się przedstawić ją w taki sposób byśmy przeszli przez nią bezboleśnie nie przysypiając przed monitorem, a w kolejnym wpisie spróbujemy wykorzystać nowo nabytą wiedzę w praktyce.&lt;/p&gt;
&lt;h3&gt;Operatory logiczne&lt;/h3&gt;
&lt;p&gt;Aby bezproblemowo posługiwać się instrukcjami warunkowymi i pętlami niezbędne jest porównywanie wartości zmiennych. W Taskerze można tego dokonać na dwa sposoby. Pierwszy sposób to tzw. uproszczony, drugi to wyrażenia regularne (RegEx), o którym napiszę przy innej okazji.&lt;br&gt;Dziś zajmiemy się sposobem uproszczonym realizowanym przez operatory logiczne oraz uniwersalne operatory &lt;b&gt;Matches&lt;/b&gt;/&lt;b&gt;Not&amp;nbsp;Matches&lt;/b&gt;. Wykorzystując je porównujemy prawy parametr czyli wzór do wartości po lewej stronie.&lt;br&gt;Wzór (prawy parametr) możemy definiować wykorzystując znaki specjalne.
&lt;/p&gt;
&lt;h4&gt;Znaki specjalne&lt;/h4&gt;
&lt;p&gt;&lt;ul&gt;
&lt;li&gt;&lt;span class=&quot;code&quot;&gt;/&lt;/span&gt; oznacza operator logiczny &lt;b&gt;lub&lt;/b&gt; czyli wzór &lt;span class=&quot;code&quot;&gt;zielony/czerwony&lt;/span&gt; będzie pasował do wartości &lt;span class=&quot;code&quot;&gt;czerwony&lt;/span&gt; lub do wartości &lt;span class=&quot;code&quot;&gt;zielony&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;code&quot;&gt;*&lt;/span&gt; oznacza dowolną ilość dowolnych znaków czyli wzór &lt;span class=&quot;code&quot;&gt;123*&lt;/span&gt; będzie pasował do wartości &lt;span class=&quot;code&quot;&gt;123&lt;/span&gt; ale także do &lt;span class=&quot;code&quot;&gt;123DOM&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;code&quot;&gt;+&lt;/span&gt; oznacza jeden lub więcej dowolnych znaków czyli wzór &lt;span class=&quot;code&quot;&gt;123+&lt;/span&gt; nie będzie pasował do wartości &lt;span class=&quot;code&quot;&gt;123&lt;/span&gt;, a będzie pasował do wartości &lt;span class=&quot;code&quot;&gt;123D&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;code&quot;&gt;!&lt;/span&gt; oznacza negację czyli &lt;span class=&quot;code&quot;&gt;!*zielony*/*czerwony*&lt;/span&gt; będzie pasował do wszystkich wartości poza tymi zawierającymi &lt;span class=&quot;code&quot;&gt;zielony&lt;/span&gt; lub &lt;span class=&quot;code&quot;&gt;czerwony&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;h4&gt;Wielkość liter w porównaniach&lt;/h4&gt;
&lt;p&gt;Wielkość liter nie gra roli przy porównywaniu wartości chyba, że wzór (prawy parametr) ma w zapisie wielkie litery. Wtedy wielkość liter ma znaczenie.
&lt;/p&gt;
&lt;h4&gt;Przykłady porównywania wartości&lt;/h4&gt;
&lt;p&gt;&lt;ul&gt;
&lt;li&gt;&lt;span class=&quot;code&quot;&gt;pomoc&lt;/span&gt; pasuje do &lt;span class=&quot;code&quot;&gt;pomoc&lt;/span&gt; ale nie do &lt;span class=&quot;code&quot;&gt;pomocny&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;code&quot;&gt;pomoc*&lt;/span&gt; pasuje do &lt;span class=&quot;code&quot;&gt;pomoc&lt;/span&gt; i do &lt;span class=&quot;code&quot;&gt;pomocny&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;code&quot;&gt;*nie*&lt;/span&gt; pasuje do każdego ciągu znaków zawierającego &lt;span class=&quot;code&quot;&gt;nie&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;code&quot;&gt;123+&lt;/span&gt; pasuje do &lt;span class=&quot;code&quot;&gt;123&lt;/span&gt; i przynajmniej jednego znaku np. &lt;span class=&quot;code&quot;&gt;1234&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;code&quot;&gt;+&lt;/span&gt; pasuje do przynajmniej jednego znaku (niepusta wartość)&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;code&quot;&gt;nie*domu&lt;/span&gt; pasuje do &lt;span class=&quot;code&quot;&gt;niedaleko domu&lt;/span&gt; i &lt;span class=&quot;code&quot;&gt;nie mam domu&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;code&quot;&gt;Pomoc/*gratis&lt;/span&gt; pasuje do &lt;span class=&quot;code&quot;&gt;Pomoc&lt;/span&gt; lub każdego ciągu znaków kończącego się ciągiem &lt;span class=&quot;code&quot;&gt;gratis&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;h4&gt;Porównywanie numerów telefonów kontaktów&lt;/h4&gt;
&lt;p&gt;W Taskerze porównywanie numerów telefonów kontaktów dostało kilka dodatkowych tagów specjalnych by ułatwić nam nieco życie.
&lt;ul&gt;&lt;li&gt;&lt;span class=&quot;code&quot;&gt;C:ANY&lt;/span&gt; pasuje do numeru telefonu jakiegokolwiek kontaktu&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;code&quot;&gt;C:FAV&lt;/span&gt; pasuje do numeru telefonu jakiegokolwiek kontaktu należącego do ulubionych&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;code&quot;&gt;CG:nazwa_grupy&lt;/span&gt; pasuje do numeru telefonu jakiegokolwiek kontaktu z grupy &lt;span class=&quot;code&quot;&gt;nazwa_grupy&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;h4&gt;Przykłady porównywania numerów telefonów&lt;/h4&gt;
&lt;p&gt;&lt;ul&gt;&lt;li&gt;&lt;span class=&quot;code&quot;&gt;!C:ANY&lt;/span&gt; pasuje do każdego numeru telefonu nie zapisanego w kontaktach&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;code&quot;&gt;025*/Janek*&lt;/span&gt; pasuje do numeru telefonu zaczynającego się &lt;span class=&quot;code&quot;&gt;025&lt;/span&gt; lub do numeru telefonu kontaktu, którego początek to &lt;span class=&quot;code&quot;&gt;Janek&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;code&quot;&gt;C:FAV/0123456789&lt;/span&gt; pasuje do numeru telefonu jakiegokolwiek kontaktu należącego do ulubionych lub numeru &lt;span class=&quot;code&quot;&gt;0123456789&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;code&quot;&gt;CG:*Rodzina*/CG:Praca&lt;/span&gt; pasuje do numerów kontaktów z grupy, która ma w nazwie ciąg &lt;span class=&quot;code&quot;&gt;Rodzina&lt;/span&gt; lub do numerów kontaktów z grupy &lt;span class=&quot;code&quot;&gt;Praca&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;h4&gt;Matches (~)&lt;/h4&gt;
&lt;p&gt;Z operatorem &lt;b&gt;Matches&lt;/b&gt; warunek będzie spełniony jeśli obie wartości będą do siebie pasowały np. &lt;span class=&quot;code&quot;&gt;moje&amp;nbsp;profile&amp;nbsp;~&amp;nbsp;*profil*&lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;Not Matches (!~)&lt;/h4&gt;
&lt;p&gt;Z operatorem &lt;b&gt;Not Matches&lt;/b&gt; warunek będzie spełniony jeśli obie wartości nie będą do siebie pasowały np. &lt;span class=&quot;code&quot;&gt;moje&amp;nbsp;profile&amp;nbsp;!~&amp;nbsp;*profil&lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;Maths: Less Than (&lt;)&lt;/h4&gt;
&lt;p&gt;Oba porównywane parametry muszą być wartościami liczbowymi i pierwszy musi być mniejszy od drugiego np. &lt;span class=&quot;code&quot;&gt;3&amp;nbsp;&lt;&amp;nbsp;6&lt;/span&gt; by warunek był spełniony.&lt;/p&gt;
&lt;h4&gt;Maths: Greater Than (&gt;)&lt;/h4&gt;
&lt;p&gt;Oba porównywane parametry muszą być wartościami liczbowymi i pierwszy musi być większy od drugiego np. &lt;span class=&quot;code&quot;&gt;9&amp;nbsp;&gt;&amp;nbsp;6&lt;/span&gt; by warunek był spełniony.&lt;/p&gt;
&lt;h4&gt;Maths: Equals (=)&lt;/h4&gt;
&lt;p&gt;Oba porównywane parametry muszą być wartościami liczbowymi i obie wartości muszą być sobie równe np. &lt;span class=&quot;code&quot;&gt;3&amp;nbsp;=&amp;nbsp;3&lt;/span&gt; by warunek był spełniony.&lt;/p&gt;
&lt;h4&gt;Maths: Not Equals (!=)&lt;/h4&gt;
&lt;p&gt;Oba porównywane parametry muszą być wartościami liczbowymi i muszą być od siebie różne np. &lt;span class=&quot;code&quot;&gt;3&amp;nbsp;!=&amp;nbsp;6&lt;/span&gt; by warunek był spełniony.&lt;/p&gt;
&lt;h4&gt;Maths: Is Even&lt;/h4&gt;
&lt;p&gt;Parametr musi być wartością liczbową parzystą by warunek był spełniony.&lt;/p&gt;
&lt;h4&gt;Maths: Is Odd&lt;/h4&gt;
&lt;p&gt;Parametr musi być wartością liczbową nieparzystą by warunek był spełniony.&lt;/p&gt;
&lt;h4&gt;Is Set / Isn&#39;t Set&lt;/h4&gt;
&lt;p&gt;Warunek jest spełniony jeśli dana zmienna ma ustawioną wartość/nie ma ustawionej wartości.&lt;/p&gt;

&lt;p&gt;W praktyce można stosować operatory Matches/Not Matches w przypadku wartości liczbowych. Trzeba jedynie pamiętać, że w takim przypadku Tasker nie porównuje wartości liczbowych jako takich ale znaki. Jeśli znaki pasują to warunek będzie spełniony.&lt;/p&gt;

&lt;h3&gt;Warunki wykonania akcji&lt;/h3&gt;
&lt;p&gt;W konfiguracji każdej prawie akcji możliwe jest dodanie warunków, niezbędnych do spełnienia by ta akcja została wykonana.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMt0BwjacDpc9D7NbwglwOJMFK3zuouyb7kYtiurBI906UmIMb7dRUXkcx2UhRMijb6lbGxNqivSqVFwGkiQt_aoXLszHzVz7pQ_r-ug3LeLatPcMqD46pzB_mlUM-1jGCcSMMAacWEdg/s1600/AKCJA-WARUNKI.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMt0BwjacDpc9D7NbwglwOJMFK3zuouyb7kYtiurBI906UmIMb7dRUXkcx2UhRMijb6lbGxNqivSqVFwGkiQt_aoXLszHzVz7pQ_r-ug3LeLatPcMqD46pzB_mlUM-1jGCcSMMAacWEdg/s640/AKCJA-WARUNKI.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Pomiędzy poszczególnymi warunkami wykonania akcji (jeśli jest ich więcej niż jeden) mogą za chodzić zależności &lt;b&gt;And&lt;/b&gt; (wszystkie warunki muszą być spełnione), &lt;b&gt;Or&lt;/b&gt; (przynajmniej jeden warunek musi być spełniony oraz &lt;b&gt;Xor&lt;/b&gt; (dokładnie jeden warunek musi być spełniony).&lt;br&gt;Poza tym są jeszcze do dyspozycji operatory &lt;b&gt;And+&lt;/b&gt;, &lt;b&gt;Or+&lt;/b&gt; oraz &lt;b&gt;Xor+&lt;/b&gt; czyli operatory z większym pierwszeństwem. Ogólnie zasada jest taka, że im bardziej na prawo przesunięty klawisz operatora to ma on większe pierwszeństwo. Dodatek &lt;b&gt;+&lt;/b&gt; do nazwy operatora zwiększa pierwszeństwo danego warunku.&lt;/P&gt;
</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/984638244273671978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/984638244273671978'/><link rel='alternate' type='text/html' href='http://tasker-android.blogspot.com/2014/08/operatory-logiczne-znaki-specjalne-i.html' title='Operatory logiczne, znaki specjalne i porównywanie wartości'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05046866348300228265</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMt0BwjacDpc9D7NbwglwOJMFK3zuouyb7kYtiurBI906UmIMb7dRUXkcx2UhRMijb6lbGxNqivSqVFwGkiQt_aoXLszHzVz7pQ_r-ug3LeLatPcMqD46pzB_mlUM-1jGCcSMMAacWEdg/s72-c/AKCJA-WARUNKI.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-5723209725752603760.post-3231433316216241206</id><published>2014-08-19T10:06:00.002+02:00</published><updated>2014-08-19T11:33:31.574+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="aktualizacja"/><category scheme="http://www.blogger.com/atom/ns#" term="Tasker"/><title type='text'>Tasker - aktualizacja do wersji 4.4u3</title><content type='html'>&lt;p&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrv2T5cbFkfvWO_jWQhI-vO9sFAGqOA9VrpBKQWJ6sMkTCPMAGIi-MDX1bzLmbUfpSCOeI_YNwUanAdEOk_VP5jA-NTao3VbRUEJCaw1PWNoJl-ljpFte9P2o5Wd-63hJUNQwq4x3p_70/s1600/update.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: none; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrv2T5cbFkfvWO_jWQhI-vO9sFAGqOA9VrpBKQWJ6sMkTCPMAGIi-MDX1bzLmbUfpSCOeI_YNwUanAdEOk_VP5jA-NTao3VbRUEJCaw1PWNoJl-ljpFte9P2o5Wd-63hJUNQwq4x3p_70/s400/update.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Wczoraj Tasker został zaktualizowany do wersji &lt;b&gt;4.4u3&lt;/b&gt;. W liście zmian głównie same poprawki.&lt;/p&gt;
&lt;h3&gt;Lista zmian&lt;/h3&gt;
&lt;p&gt;&lt;ul&gt;
  &lt;li&gt;change: increased SD logfile size to 2MB&lt;/li&gt;
  &lt;li&gt;bugfix: catch OOM when scrolling app list&lt;/li&gt;
  &lt;li&gt;bugfix: 2 situations where exe service was occasionally hanging&lt;/li&gt;
  &lt;li&gt;bugfix: menu element: when too many elements to fit on screen, rearrange and delete wasn&#39;t possible&lt;/li&gt;
  &lt;li&gt;bugfix: state Calendar Entry: names with space were being mangled on exiting state edit&lt;/li&gt;
  &lt;li&gt;bugfix: menu element: select mode none: click highlight didn&#39;t match that used elsewhere&lt;/li&gt;
  &lt;li&gt;bugfix: menu element: select mode none: click highlight was sticking&lt;/li&gt;
  &lt;li&gt;bugfix: android L: was crashing on startup with Default theme selected&lt;/li&gt;
  &lt;li&gt;bugfix: UI lock: multi-selecting task/scenes, long-click projects wasn&#39;t requesting code&lt;/li&gt;
  &lt;li&gt;bugfix: UI lock: locked tasks/profiles/scenes could be dragged and thus e.g. deleted&lt;/li&gt;
  &lt;li&gt;bugfix: added help text for State / Display / Display State&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;
&lt;h3&gt;Pobieranie&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm&quot; title=&quot;Tasker&quot; rel=&quot;nofollow&quot;&gt;Google Play&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;http://tasker.dinglisch.net/download.html&quot; title=&quot;Tasker for Android&quot; rel=&quot;nofollow&quot;&gt;Strona Taskera&lt;/a&gt;&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/3231433316216241206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/3231433316216241206'/><link rel='alternate' type='text/html' href='http://tasker-android.blogspot.com/2014/08/tasker-aktualizacja-do-wersji-44u3.html' title='Tasker - aktualizacja do wersji 4.4u3'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05046866348300228265</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrv2T5cbFkfvWO_jWQhI-vO9sFAGqOA9VrpBKQWJ6sMkTCPMAGIi-MDX1bzLmbUfpSCOeI_YNwUanAdEOk_VP5jA-NTao3VbRUEJCaw1PWNoJl-ljpFte9P2o5Wd-63hJUNQwq4x3p_70/s72-c/update.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-5723209725752603760.post-8692446174258332384</id><published>2014-08-16T10:45:00.000+02:00</published><updated>2014-11-04T14:10:08.220+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Flash"/><category scheme="http://www.blogger.com/atom/ns#" term="If"/><category scheme="http://www.blogger.com/atom/ns#" term="Toast"/><category scheme="http://www.blogger.com/atom/ns#" term="Variable Search Replace"/><category scheme="http://www.blogger.com/atom/ns#" term="Variable Set"/><category scheme="http://www.blogger.com/atom/ns#" term="Variable Split"/><category scheme="http://www.blogger.com/atom/ns#" term="WiFi"/><category scheme="http://www.blogger.com/atom/ns#" term="Wifi Connected"/><category scheme="http://www.blogger.com/atom/ns#" term="wyrażenia regularne"/><title type='text'>Profil: Tost z danymi sieci WiFi po połączeniu</title><content type='html'>&lt;p&gt;Mimo, że nie przepadam za nakładką TouchWiz autorstwa Samsunga ma ona kilka ciekawych i przydatnych elementów. Jednym z nich jest tost wyświetlający dane sieci WiFi i szybkość połączenia zaraz po jego nawiązaniu. Dziś zademonstruję w jaki sposób uzyskać podobną funkcjonalność w Taskerze.&lt;/p&gt;
&lt;h3&gt;Opis wykonania&lt;/h3&gt;
&lt;p&gt;Na ekranie głównym Taskera, w zakładce &lt;b&gt;Profile&lt;/b&gt; naciskamy klawisz &lt;b&gt;+&lt;b&gt;&lt;/b&gt;&lt;/b&gt;, z listy kontekstów wybieramy &lt;b&gt;State&lt;/b&gt; / &lt;b&gt;Net&lt;/b&gt; / &lt;b&gt;WiFi Connected&lt;/b&gt;. Na ekranie edycji kontekstu nic nie zmieniamy bo chcemy by tost był wyświetlany przy połączeniu z każdą siecią. Jeśli wypełnimy na tym ekranie pola &lt;b&gt;SSID&lt;/b&gt;, &lt;b&gt;MAC&lt;/b&gt; lub &lt;b&gt;IP&lt;/b&gt; to profil będzie uruchamiany tylko po połączeniu z siecią spełniającą wpisane warunki. Przykładowo podanie nazwy &lt;b&gt;SSID&lt;/b&gt; sieci &lt;span class=&quot;code&quot;&gt;PRZYKLADOWE-WIFI&lt;/span&gt; spowoduje, że połączenie tylko z tą siecią uaktywni profil.&lt;br&gt;Wciskamy klawisz &lt;b&gt;wstecz&lt;/b&gt;, następnie wybieramy &lt;b&gt;New Task&lt;/b&gt; i przechodzimy do edycji tasku wejściowego profilu.&lt;br&gt;Wyświetlanie tostu ma sens tylko w przypadku gdy urządzenie ma włączony ekran. Dlatego zaczniemy task od sprawdzenia jego statusu. Tasker przechowuje dane na temat statusu ekranu w zmiennej &lt;span class=&quot;code&quot;&gt;%SCREEN&lt;/span&gt;. Może on przyjmować wartości &lt;span class=&quot;code&quot;&gt;on&lt;/span&gt; i &lt;span class=&quot;code&quot;&gt;off&lt;/span&gt; czy odpowiednio włączony i wyłączony.&lt;br&gt;Wybieramy klawisz &lt;b&gt;+&lt;/b&gt;, kategorię &lt;b&gt;Task&lt;/b&gt; i akcję &lt;b&gt;If&lt;/b&gt;. W konfiguracji akcji w lewej części obszaru &lt;b&gt;Condition&lt;/b&gt; wpisujemy &lt;span class=&quot;code&quot;&gt;%SCREEN&lt;/span&gt;, w prawej &lt;span class=&quot;code&quot;&gt;on&lt;/span&gt;, a jako operator wybieramy &lt;span class=&quot;code&quot;&gt;Matches&lt;/span&gt;. Czyli dalsze akcje zostaną wykonane jeśli zmienna &lt;span class=&quot;code&quot;&gt;%SCREEN&lt;/span&gt; będzie miała wartość &lt;span class=&quot;code&quot;&gt;on&lt;/span&gt; (ekran włączony).
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhisCmzwYh0e21ehax8ef1JT__h_RmaX5KvEtI3MAxasUrqfwY-dr4QgrtMDhd8fNKi-xuGiMZLhvtzpHYaksUeWCJdKqqJ7QcX7YIqvMKBXZ_sbMD1USp0zFkemXYeuuKKw-C0zi787xw/s1600/screeon_on.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhisCmzwYh0e21ehax8ef1JT__h_RmaX5KvEtI3MAxasUrqfwY-dr4QgrtMDhd8fNKi-xuGiMZLhvtzpHYaksUeWCJdKqqJ7QcX7YIqvMKBXZ_sbMD1USp0zFkemXYeuuKKw-C0zi787xw/s400/screeon_on.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;Po powrocie do ekranu edycji tasku zajmiemy się przygotowaniem danych do naszego tostu. Dane te są przechowywane w zmiennej &lt;span class=&quot;code&quot;&gt;%WIFII&lt;/span&gt;. Można sprawdzić jakie dane są dostępne w zmiennej wybierając klawisz &lt;b&gt;menu&lt;/b&gt; / &lt;b&gt;More&lt;/b&gt; / &lt;b&gt;Run An Action&lt;/b&gt; / &lt;b&gt;Alert&lt;/b&gt; / &lt;b&gt;Flash&lt;/b&gt; i w polu text wpisać &lt;span class=&quot;code&quot;&gt;%WIFII&lt;/span&gt;. Po dotknięciu klawisza &lt;b&gt;wstecz&lt;/b&gt; wyświetli się tost z zawartością zmiennej &lt;span class=&quot;code&quot;&gt;%WIFII&lt;/span&gt;. Nam zależy na nazwie SSID sieci, przyznanym urządzeniu adresie IP oraz prędkości połączenia. Aby wyciągnąć potrzebne nam dane skorzystamy z akcji &lt;b&gt;Variable Split&lt;/b&gt; jednak najpierw wartość zmiennej &lt;span class=&quot;code&quot;&gt;%WIFII&lt;/SPAN&gt; musimy przekazać do innej tymczasowej zmiennej &lt;span class=&quot;code&quot;&gt;%wifiinfo&lt;/span&gt;, którą będziemy mogli edytować. Wybieramy klawisz &lt;b&gt;+&lt;/b&gt; następnie &lt;b&gt;Variables&lt;/b&gt; / &lt;b&gt;Variable Set&lt;/b&gt; i w konfiguracji akcji w pole &lt;b&gt;Name&lt;/b&gt; wpisujemy &lt;span class=&quot;code&quot;&gt;%wifiinfo&lt;/span&gt;, a do pola &lt;b&gt;To&lt;/b&gt; &lt;span class=&quot;code&quot;&gt;%WIFII&lt;/span&gt;. Następnie naciskamy klawisz &lt;b&gt;wstecz&lt;/b&gt;, klawisz &lt;b&gt;+&lt;/b&gt; i wybieramy &lt;b&gt;Variables&lt;/b&gt; / &lt;b&gt;Variable Split&lt;/b&gt;. W konfiguracji akcji w pole &lt;b&gt;Name&lt;/b&gt; wpisujemy &lt;span class=&quot;code&quot;&gt;%wifiinfo&lt;/span&gt; oraz zaznaczamy opcję &lt;b&gt;Delete Base&lt;/b&gt; (czyli usuwamy zmienną &lt;span class=&quot;code&quot;&gt;%wifiinfo&lt;/span&gt; po jej podziale). Akcja &lt;b&gt;Variable Split&lt;/b&gt; dzieli ciąg znaków na części oddzielone wybranym znakiem (&lt;b&gt;Splitter&lt;/b&gt;). W naszym przypadku nie wybraliśmy splittera więc Tasker przyjmie spację jako znak podziału. Każde słowo z oryginalnego tekstu jest teraz dostępne w zmiennej &lt;span class=&quot;code&quot;&gt;%wifiinfoX&lt;/span&gt; gdzie &lt;b&gt;X&lt;/b&gt; to numer słowa w tekście.&lt;br&gt;
Wybieramy klawisz &lt;b&gt;wstecz&lt;/b&gt;, następnie &lt;b&gt;+&lt;/b&gt; i dodajemy akcję &lt;b&gt;Alert&lt;/b&gt; / &lt;b&gt;Flash&lt;/b&gt;. W konfiguracji tej akcji w polu &lt;b&gt;Text&lt;/b&gt; wpisujemy następujący tekst:
&lt;div class=&quot;code&quot;&gt;Połączono z siecią: %wifiinfo4&lt;br&gt;
Adres IP: %wifiinfo9&lt;br&gt;
Prędkość: %wifiinfo13&lt;/div&gt;
oraz zaznaczamy opcję &lt;b&gt;Long&lt;/b&gt; (by tost wyświetlał się dłużej).&lt;br&gt;
Naciskamy teraz dwukrotnie &lt;b&gt;wstecz&lt;/b&gt; i mamy gotowy profil. Powinien on wyglądać następująco:
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQ4H7FcGVXFVB_x2IzaqGttVPSWnNis7aafmNUKefIkt6lavDHKfEkspGhi7J0_alP39w4LsQgY15Zpxk-yj7mDOUKORwFBS78IxwN6Dssw1dlgzTLYUouAv68tbULQKgHt4vJWyOI1lk/s1600/profil_dane_wifi.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQ4H7FcGVXFVB_x2IzaqGttVPSWnNis7aafmNUKefIkt6lavDHKfEkspGhi7J0_alP39w4LsQgY15Zpxk-yj7mDOUKORwFBS78IxwN6Dssw1dlgzTLYUouAv68tbULQKgHt4vJWyOI1lk/s400/profil_dane_wifi.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;
&lt;h3&gt;Rozpisany profil&lt;/h3&gt;
&lt;p&gt;&lt;div class=&quot;code&quot;&gt;
Profile: Połączone WiFi (91)&lt;br&gt;
State: Wifi Connected [ SSID:* MAC:* IP:* ]&lt;br&gt;
Enter: Anon (152)&lt;br&gt;
A1: If [ %SCREEN ~ on ]&lt;br&gt;
A2: Variable Set [ Name:%wifiinfo To:%WIFII Do Maths:Off Append:Off ]&lt;br&gt; 
A3: Variable Split [ Name:%wifiinfo Splitter: Delete Base:On ] &lt;br&gt;
A4: Flash [ Text:Połączono z siecią %wifiinfo4&lt;br&gt;
Adres IP: %wifiinfo9&lt;br&gt;
Prędkość: %wifiinfo13 Long:On ]&lt;br&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;h3&gt;Wideo&lt;/h3&gt;
&lt;p&gt;&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;360&quot; src=&quot;//www.youtube.com/embed/9vTRO0HqaGA&quot; width=&quot;640&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;h3&gt;Pobieranie profilu&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://drive.google.com/file/d/0B9CkGmXTLcF0c3otYnRFQWNlODQ&quot; target=&quot;_blank&quot;&gt;Profil Tost z danymi sieci WiFi po połączeniu&lt;/a&gt; [Tasker 4.4u2]&lt;/p&gt;
&lt;h3&gt;Aktualizacja&lt;/h3&gt;
&lt;p&gt;Jak kolega &lt;b&gt;mrtur&lt;/b&gt; zauważył w komentarzach w przypadku gdy nazwa sieci będzie zawierała spację profil wyświetli niepoprawne dane. Dlatego poniżej przedstawiam poprawioną wersję.&lt;br&gt;
Tym razem posłużyłem się akcją &lt;span class=&quot;code&quot;&gt;Variable Search Replace&lt;/span&gt; z wyszukiwaniem ciągu &lt;span class=&quot;code&quot;&gt;(?&amp;lt;=(\n)).*&lt;/span&gt;, który podzieli tekst na poszczególne linie, które trzeba poprzycinać do odpowiednich długości za pomocą kolejnych akcji &lt;span class=&quot;code&quot;&gt;Variable Search Replace&lt;/span&gt; z odpowiednimi wartościami pola &lt;span class=&quot;code&quot;&gt;Search&lt;/span&gt;.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikATbQ3w2t08qq0UxKcThEMKEvYUy3wyVyNjSSXxc7GjVAqxKNGIq6-RVJjaPld5TtPKPWiLRf8YCdkbISKMq4C72My22ObKXjWnldHAN4BErY1S2KdahVvFxOXLQY1jqgs1-CawS2Cas/s1600/szablon.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikATbQ3w2t08qq0UxKcThEMKEvYUy3wyVyNjSSXxc7GjVAqxKNGIq6-RVJjaPld5TtPKPWiLRf8YCdkbISKMq4C72My22ObKXjWnldHAN4BErY1S2KdahVvFxOXLQY1jqgs1-CawS2Cas/s640/szablon.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/8692446174258332384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/8692446174258332384'/><link rel='alternate' type='text/html' href='http://tasker-android.blogspot.com/2014/08/profil-tost-z-danymi-sieci-wifi-po.html' title='Profil: Tost z danymi sieci WiFi po połączeniu'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05046866348300228265</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhisCmzwYh0e21ehax8ef1JT__h_RmaX5KvEtI3MAxasUrqfwY-dr4QgrtMDhd8fNKi-xuGiMZLhvtzpHYaksUeWCJdKqqJ7QcX7YIqvMKBXZ_sbMD1USp0zFkemXYeuuKKw-C0zi787xw/s72-c/screeon_on.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-5723209725752603760.post-3934714823906813397</id><published>2014-08-06T15:59:00.001+02:00</published><updated>2014-08-16T10:49:55.189+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="akcja"/><category scheme="http://www.blogger.com/atom/ns#" term="Display Unlocked"/><category scheme="http://www.blogger.com/atom/ns#" term="Flash"/><category scheme="http://www.blogger.com/atom/ns#" term="kontekst"/><category scheme="http://www.blogger.com/atom/ns#" term="profil"/><category scheme="http://www.blogger.com/atom/ns#" term="task"/><category scheme="http://www.blogger.com/atom/ns#" term="Tasker"/><category scheme="http://www.blogger.com/atom/ns#" term="Variable Set"/><category scheme="http://www.blogger.com/atom/ns#" term="zmienne"/><title type='text'>Tworzymy pierwszy profil</title><content type='html'>&lt;p&gt;Przyszedł w końcu czas na własnoręczne stworzenie pierwszego profilu. Przedstawię krok po kroku jak stworzyć bardzo prosty profil wyświetlający tzw. tost &quot;Witaj&quot; po odblokowaniu ekranu. Do opisu załączę wyeksportowany plik xml do pobrania, opis wszystkich akcji i kontekstów oraz klip wideo, na którym pokażę, co i jak trzeba po kolei wykonać.&lt;/p&gt;
&lt;h3&gt;Ekran edycji tasku&lt;/h3&gt;
&lt;p&gt;Zaczniemy jednak od omówienia ekranu edycji tasku. Standardowo na dole mamy klawisz &lt;b&gt;+&lt;/b&gt;, który umożliwia dodanie nowej akcji, w dolnym pasku jest jeszcze klawisz ze znakiem &lt;b&gt;Play&lt;/b&gt; umożliwiający uruchomienie tasku. Dłuższe przytrzymanie palca na którejś z dodanych już akcji wyświetla na górze ekranu pasek umożliwiający kopiowanie, wklejanie i wyłączanie tej akcji. Wyłączona akcja oznaczona będzie fioletowym paskiem i nie będzie uruchamiana.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQhR4JDh0KI212LNHbatsHDGEkLNG0Rg1AVE0hj6eOYDQm-A1X8uMeaTSDhaeiqgCr0iC58o9htJjRPINE7Krty0uM32lD0sfqPbjCX3RJhVUh4JwEDLf5dyhFtt5AG2A9XMkriXMau-I/s1600/ekran_tasku.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQhR4JDh0KI212LNHbatsHDGEkLNG0Rg1AVE0hj6eOYDQm-A1X8uMeaTSDhaeiqgCr0iC58o9htJjRPINE7Krty0uM32lD0sfqPbjCX3RJhVUh4JwEDLf5dyhFtt5AG2A9XMkriXMau-I/s400/ekran_tasku.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h3&gt;Profil &quot;Witaj&quot;&lt;/h3&gt;
&lt;p&gt;
Zaczynamy tworzyć profil. Na zakładce profile Taskera naciskamy klawisz &lt;b&gt;+&lt;/b&gt;. Pojawi się lista rodzajów kontekstów. Chcemy by nasz profil uaktywniał się przy odblokowaniu ekranu z listy wybieramy &lt;b&gt;Event&lt;/b&gt;, a następnie z listy &lt;b&gt;Display&lt;/b&gt; / &lt;b&gt;Display Unlocked&lt;/b&gt;. W tym momencie Tasker wyświetli ekran konfiguracji tego kontekstu gdzie można wybrać priorytet kontekstu. Od priorytetu zależy pozycja tasku wejściowego profilu na liście oczekiwania (jeśli akurat wykonują się inne taski). W tym przypadku nie zależy nam na wysokim priorytecie więc pozostawiamy standardowy &lt;b&gt;Normal&lt;/b&gt;.&lt;br&gt;Naciskamy klawisz &lt;b&gt;Back&lt;/b&gt; i z listy, która się pokaże wybieramy &lt;b&gt;New Task&lt;/b&gt;. W tym momencie Tasker zapyta o nazwę tasku. Nie ma konieczności podawania nazwy tasku ale na dłuższą metę dzięki nazwom tasków łatwiej się zorientować co i kiedy się uruchamia. W naszym przypadku nie wpisujemy nazwy zadania. Tasker przenosi nas do ekranu edycji tasku wejściowego.&lt;br&gt;Przy okazji tworzenia tego tasku użyjemy po raz pierwszy zmiennych. Nie są one w tym przypadku konieczne ale im szybciej zaczniesz ich używać tym szybciej je opanujesz. Naciskamy więc klawisz &lt;b&gt;plus&lt;/b&gt;, z listy akcji wybieramy &lt;b&gt;Variables&lt;/b&gt; / &lt;b&gt;Variable Set&lt;/b&gt;. Na ekranie edycji tej akcji w polu &lt;b&gt;Name&lt;/b&gt; wpisujemy &lt;span class=&quot;code&quot;&gt;%tekst&lt;/span&gt; (czyli tworzymy zmienną lokalną o nazwie &lt;span class=&quot;code&quot;&gt;%tekst&lt;/span&gt;), a w polu &lt;b&gt;To&lt;/b&gt; wpisujemy &lt;span class=&quot;code&quot;&gt;Witaj&lt;/span&gt; (czyli nadajemy zmiennej wartość). Naciskamy klawisz &lt;b&gt;wstecz&lt;/b&gt; i wracamy do ekranu edycji tasku. Znów naciskamy klawisz &lt;b&gt;plus&lt;/b&gt; i wybieramy &lt;b&gt;Alert&lt;/b&gt; / &lt;b&gt;Flash&lt;/b&gt;. Na ekranie edycji tej akcji w polu &lt;b&gt;Text&lt;/b&gt; wpisujemy &lt;span class=&quot;code&quot;&gt;%tekst&lt;/span&gt; oraz zaznaczamy opcję &lt;b&gt;Long&lt;/b&gt; (by nasz tost dłużej trwał). Zadaniem akcji &lt;b&gt;Flash&lt;/b&gt; będzie wyświetlenie na ekranie tekstu znajdującego się w zmiennej &lt;span class=&quot;code&quot;&gt;%tekst&lt;/span&gt; czyli słowa &lt;span class=&quot;code&quot;&gt;Witaj&lt;/span&gt;. Naciskamy klawisz wstecz i mamy przed sobą cały task tworzonego profilu. Po ponownym naciśnięciu klawisza wstecz widzimy gotowy profil. Ekrany te powinny wyglądać jak na poniższych zrzutach ekranu.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5pybTxMM5G8T4nmaWgU7qCA32Ct22rxDoBTJqdLcx11N_AGqPmIpBJX-JRn1ZG5tkiEY81NOrdMkOWtrY9d6hAodgFvBxB46LKjEth_E3osgx0SEXXr5AntyK9D43gIOw9ay0YzKkbyI/s1600/profil_witaj.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5pybTxMM5G8T4nmaWgU7qCA32Ct22rxDoBTJqdLcx11N_AGqPmIpBJX-JRn1ZG5tkiEY81NOrdMkOWtrY9d6hAodgFvBxB46LKjEth_E3osgx0SEXXr5AntyK9D43gIOw9ay0YzKkbyI/s400/profil_witaj.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Jeśli wszystko wygląda prawidłowo możemy wyjść z Taskera, wyłączyć i włączyć ekran urządzenia i po odblokowaniu powinien pojawić się tost o treści &quot;Witaj&quot;.
&lt;/p&gt;
&lt;h4&gt;Rozpisany profil&lt;/h4&gt;
&lt;p class=&quot;code&quot;&gt;Profile: Powitanie po odblokowaniu (152)&lt;br&gt;
Event: Display Unlocked&lt;br&gt;
Enter: Anon (160)&lt;br&gt;
A1: Variable Set [ Name:%tekst To:Witaj Do Maths:Off Append:Off ]&lt;br&gt;
A2: Flash [ Text:%tekst Long:On ]&lt;/p&gt; 
&lt;h4&gt;Wideo&lt;/h4&gt;
&lt;p&gt;&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;360&quot; src=&quot;//www.youtube.com/embed/pfyMzn2fyNk&quot; width=&quot;640&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;h4&gt;Pobieranie profilu&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/file/d/0B9CkGmXTLcF0dF9qNnJDdmd2bGM&quot; target=&quot;_blank&quot;&gt;Profil Witaj&lt;/a&gt; [Tasker 4.4u2]&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/3934714823906813397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/3934714823906813397'/><link rel='alternate' type='text/html' href='http://tasker-android.blogspot.com/2014/08/tworzymy-pierwszy-profil.html' title='Tworzymy pierwszy profil'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05046866348300228265</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQhR4JDh0KI212LNHbatsHDGEkLNG0Rg1AVE0hj6eOYDQm-A1X8uMeaTSDhaeiqgCr0iC58o9htJjRPINE7Krty0uM32lD0sfqPbjCX3RJhVUh4JwEDLf5dyhFtt5AG2A9XMkriXMau-I/s72-c/ekran_tasku.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-5723209725752603760.post-2887171016274616904</id><published>2014-07-29T09:34:00.000+02:00</published><updated>2014-11-12T14:47:03.619+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="akcja"/><category scheme="http://www.blogger.com/atom/ns#" term="backup"/><category scheme="http://www.blogger.com/atom/ns#" term="eksport"/><category scheme="http://www.blogger.com/atom/ns#" term="import"/><category scheme="http://www.blogger.com/atom/ns#" term="interfejs"/><category scheme="http://www.blogger.com/atom/ns#" term="kontekst"/><category scheme="http://www.blogger.com/atom/ns#" term="plugin"/><category scheme="http://www.blogger.com/atom/ns#" term="profil"/><category scheme="http://www.blogger.com/atom/ns#" term="projekt"/><category scheme="http://www.blogger.com/atom/ns#" term="scena"/><category scheme="http://www.blogger.com/atom/ns#" term="task"/><category scheme="http://www.blogger.com/atom/ns#" term="Tasker"/><category scheme="http://www.blogger.com/atom/ns#" term="zmienne"/><title type='text'>Podstawowe pojęcia i omówienie interfejsu Taskera</title><content type='html'>&lt;p&gt;Przy pierwszym uruchomieniu Taskera większość użytkowników nie wie jak zacząć na nim pracować. Wbrew temu co mogłoby się wydawać aplikacja ma bardzo przemyślany i logicznie zaprojektowany interfejs. Trzeba go jedynie poznać i się do niego przyzwyczaić. Jeśli ktoś ma ambicję by poznać Taskera to od razu proponuję wyłączyć &lt;b&gt;Beginner Mode&lt;/b&gt;. Bez tego część możliwości aplikacji jest niewidoczna. Opcję tą wyłącza się w ustawieniach &lt;b&gt;Preferences&lt;/b&gt; / &lt;b&gt;UI&lt;/b&gt;.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUbX8N2lEQ1-_W670VMXpo61tAk0tkoO16zrpQfndSlqB5gwBHMZTw4pAjhKHUK1oapeZW3wxcs7-JmTJffzbHLEPpLSJQE8kjHYuNWy9vcR4BbE4-dMpAb_O4ylFqDma0C7B6pVRTj2s/s1600/beginner_mode.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUbX8N2lEQ1-_W670VMXpo61tAk0tkoO16zrpQfndSlqB5gwBHMZTw4pAjhKHUK1oapeZW3wxcs7-JmTJffzbHLEPpLSJQE8kjHYuNWy9vcR4BbE4-dMpAb_O4ylFqDma0C7B6pVRTj2s/s400/beginner_mode.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h3&gt;Podstawowe pojęcia&lt;/h3&gt;
&lt;p&gt;Zanim zaczniemy omawiać wygląd okna i stawiać pierwsze kroki w automatyzacji naszego urządzenia należy zapoznać się z nazewnictwem poszczególnych elementów aplikacji by później łatwiej poruszać się w opisach możliwości Taskera.&lt;/p&gt;
&lt;h4&gt;Profil&lt;/h4&gt;
&lt;p&gt;Profilem nazywa się powiązanie kontekstu (warunków uruchomienia) z taskiem (zadaniem) do wykonania. Profil może mieć kilka kontekstów, pomiędzy którymi występuje operator logiczny &lt;b&gt;ORAZ&lt;/b&gt; czyli muszą być wszystkie spełnione by profil stał się aktywny. Profil może mieć status włączony lub wyłączony. Jeśli jest wyłączony to pomimo spełnienia warunków jego kontekstów nie uaktywni się. Należy pamiętać, że wyłączenie profilu w trakcie jego aktywności spowoduje wykonanie tasku wyjściowego.&lt;/p&gt;
&lt;h4&gt;Task&lt;/h4&gt;
&lt;p&gt;Task (zadanie) jest zbiorem akcji do wykonania. W przypadku tasków powiązanych z profilem rozróżnia się task wejściowy (uruchamiany gdy profil staje się aktywny) i task wyjściowy (uruchamiany gdy profil przestaje być aktywny). Wyjątkiem od tego są profile uruchamiane kontekstem typu event (zdarzenie), które nie trwają w czasie (po prostu wykonywany jest task wejściowy i nie ma tasku wyjściowego). Przykładem kontekstu typu event jest włączenie ekranu. Jest to tylko zdarzenie i nie trwa ileś czasu. Task nie musi być powiązany z profilem. W takim wypadku, odnosząc się do języków programowania, pełni rolę procedury lub funkcji.&lt;/p&gt;
&lt;h4&gt;Scena&lt;/h4&gt;
&lt;p&gt;Scena jest zbudowanym przez użytkownika ekranem umożliwiającym wyświetlanie lub pobieranie danych.&lt;/p&gt;
&lt;h4&gt;Zmienna&lt;/h4&gt;
&lt;p&gt;Zmienna jest to konstrukcja programistyczna charakteryzująca się nazwą, typem oraz wartością, umożliwiająca odwoływanie się do jej wartości za pomocą jej nazwy. Ktoś zrozumiał? Upraszczając mamy sobie zmienna &lt;span class=&quot;code&quot;&gt;%TIME&lt;/span&gt; (nazwy zmiennych w Taskerze zawsze poprzedzane są znakiem &lt;b&gt;%&lt;/b&gt; i muszą mieć długość minimum 3 znaków). Jest to zmienna na stałe wbudowana w Taskera i przez niego aktualizowana na bieżąco, a zawiera aktualny czas. Czyli jeśli projektując task potrzebujemy użyć aktualnej godziny to wystarczy, że odczytamy wartość ze zmiennej &lt;span class=&quot;code&quot;&gt;%TIME&lt;/span&gt;. Zmienne możemy tworzyć samemu i przechowywać w nich dane. Są to zmienne użytkownika. W Taskerze występują dwa rodzaje zmiennych użytkownika: lokalne i globalne. Zmienne globalne (ich nazwy muszą zawierać przynajmniej jedną wielką literę np. &lt;span class=&quot;code&quot;&gt;%Dom&lt;/span&gt; lub &lt;span class=&quot;code&quot;&gt;%doM&lt;/span&gt;) to takie, do których mamy dostęp we wszystkich taskach. We wcześniejszych wersjach Taskera zmienne globalne musiały mieć całe nazwy pisane wielkimi literami i ja z przyzwyczajenia stosuję tą zasadę. Zmienne lokalne (z nazwami pisanymi małymi literami np. &lt;span class=&quot;code&quot;&gt;%liczba&lt;/span&gt;) dostępne są tylko w obrębie jednego tasku. Jeśli nie ma potrzeby by wartość ze zmiennej była dostępna w innych taskach zaleca się stosować zmienne lokalne.
W Taskerze nie ma podziału zmiennych w zależności od typów danych jak w wielu językach programowania. Należy pamiętać, że zmienne &lt;span class=&quot;code&quot;&gt;%Dom&lt;/span&gt; i &lt;span class=&quot;code&quot;&gt;%doM&lt;/span&gt; to całkowicie różne zmienne.&lt;/p&gt;
&lt;h4&gt;Kontekst&lt;/h4&gt;
&lt;p&gt;Kontekst to inaczej warunek aktywacji profilu. Warunkiem tym mogą być bardzo różne zdarzenia, przykładowo: data, czas, połączenie z siecią WiFi, uruchomienie wybranej aplikacji, podłączenie urządzenia do ładowarki czy spadek naładowania baterii do określonego poziomu. Część kontekstów ma określony czas trwania np. gdy poziom naładowania baterii zawiera się w przedziale 10-20%, ale są też konteksty typu event (zdarzenie), które wywołują uruchomienie tylko tasku wejściowego (profil uaktywniany takim kontekstem jest aktywny tylko przez chwilę).&lt;/p&gt;
&lt;h4&gt;Akcja&lt;/h4&gt;
&lt;p&gt;Akcję można opisać jak polecenie. Z akcji składają się taski. Akcją może być komenda warunkowa &lt;span class=&quot;code&quot;&gt;if&lt;/span&gt; albo polecenie włączenia WiFi. W taskerze akcje dzieli się na dwie grupy. Akcje zwykłe oraz akcje typu ustawienie. Te drugie odpowiedzialne są zmiany ustawień systemu (np. poziomu głośności czy włączenia Bluetooth). Akcje ustawień mają dość charakterystyczną cechę. Jeśli wykonane zostaną w tasku wejściowym profilu to po dezaktywacji profilu same przywrócą się do poprzedniej wartości. Przykładowo jeśli stworzymy profil noc, który ma być aktywny miedzy godzinami 23, a 7 rano i w tasku wejściowym dodamy akcję wyłączającą WiFi to rano gdy profil przestanie być aktywny WiFi automatycznie zostanie włączone mimo, że takiej akcji nie ma w tasku wyjściowym profilu. Akcje ustawień oznaczone są ikoną małego trybika.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCImfNLaCrUdQFNubytJkXXzhppkAs2bw-uMDt4zeJVDUMnS6zuNrnRjVrclU2tzejR-7ZyG_NvBS9Z2GX6rUng5i3Rs0V_xbbHG0bZiW_hnC7sjvM2xapBnPxqTVJrNNfGhkwlt4h5hE/s1600/rodzaje_akcji.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCImfNLaCrUdQFNubytJkXXzhppkAs2bw-uMDt4zeJVDUMnS6zuNrnRjVrclU2tzejR-7ZyG_NvBS9Z2GX6rUng5i3Rs0V_xbbHG0bZiW_hnC7sjvM2xapBnPxqTVJrNNfGhkwlt4h5hE/s400/rodzaje_akcji.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h4&gt;Projekt&lt;/h4&gt;
&lt;p&gt;Projekt jest zbiorem profili i tasków, które tworzą jedną całość np. zarządzają ustawieniami telefonu w zależności od lokalizacji. Dzięki podziałowi profili na projekty można zachować porządek w Taskerze i łatwiej jest wyeksportować pliki dla innego użytkownika.&lt;/p&gt;
&lt;h4&gt;Wtyczka&lt;/h4&gt;
&lt;p&gt;Jak wiele innych aplikacji tak i Tasker ma możliwość korzystania z wtyczek dzięki czemu rozszerzane są możliwości programu. Pluginy mogą dodawać nowe akcje, konteksty oraz zmienne.&lt;/p&gt;
&lt;h3&gt;Interfejs Taskera&lt;/h3&gt;
&lt;p&gt;Główny ekran Taskera ma na górze 4 zakładki (z włączonym &lt;b&gt;Beginner Mode&lt;/b&gt; tylko 3 zakładki): Profiles, Tasks, Scenes i Vars (czyli odpowiednio Profile, Taski, Sceny i Zmienne). Na dolnym pasku znajdują się zakładki projektów. W lewym górnym rogu znajduje się ikona Taskera służąca do włączania i wyłączania usługi programu (należy dłużej przytrzymać naciśniętą ikonę). W prawym dolnym rogu ekranu zawsze widoczny jest klawisz &lt;b&gt;+&lt;/b&gt;, za pomocą którego można dodawać nowe profile, taski, sceny lub zmienne w zależności, od tego, która zakładka jest aktywna.&lt;/p&gt;
&lt;p&gt;Oto przykładowy widok zakładki Profile.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhumi-BMQlnLseKLb4cTLNn5-AWHosAVrEmgsWeK0IptfZ0wuOxm35RTZ0ULPuBPzPgOxGAzAtQ9TNunXOGk0GF7_gapwDgCqtUJ4x9KwM2GStEzWpqj-LLufi3INt9e2yGgJoPOP_FkQM/s1600/ekran_glowny.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhumi-BMQlnLseKLb4cTLNn5-AWHosAVrEmgsWeK0IptfZ0wuOxm35RTZ0ULPuBPzPgOxGAzAtQ9TNunXOGk0GF7_gapwDgCqtUJ4x9KwM2GStEzWpqj-LLufi3INt9e2yGgJoPOP_FkQM/s400/ekran_glowny.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Zakładka Zadania oraz Sceny.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAljzxEJ8vjvbLPGx5PN3KTfb0RP5zQ9hVcRMvywf12jP8NL3i1jEUQ77c1BKGI4b-kMhmoJFOo4RP3OEvBA-_htYE9u2y1HrKYnM-zNd5uN0j4D-SU_8_Ss9TJ_VUqYkWWaGyKEtMbFw/s1600/taski_sceny.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAljzxEJ8vjvbLPGx5PN3KTfb0RP5zQ9hVcRMvywf12jP8NL3i1jEUQ77c1BKGI4b-kMhmoJFOo4RP3OEvBA-_htYE9u2y1HrKYnM-zNd5uN0j4D-SU_8_Ss9TJ_VUqYkWWaGyKEtMbFw/s400/taski_sceny.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Zakładka Zmienne
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfAWCrwwFYDOEJT2rAq6CAjcIzmPrgoOdZan-HysT7mi6Ty1VURisf-nuGv0XZTA0kHqbLqSQT9MYV9GVwWf1JLRgP3EPzcGpqTTlKSK32UyHqhP8ah5fNUeNdfViM1PtLoMHbQBki-Jc/s1600/zmienne.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfAWCrwwFYDOEJT2rAq6CAjcIzmPrgoOdZan-HysT7mi6Ty1VURisf-nuGv0XZTA0kHqbLqSQT9MYV9GVwWf1JLRgP3EPzcGpqTTlKSK32UyHqhP8ah5fNUeNdfViM1PtLoMHbQBki-Jc/s400/zmienne.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Dłuższe dotknięcie profilu, tasku, sceny czy zmiennej powoduje wyświetlenie paska z opcjami związanymi z danym elementem. Podobnie dłuższe dotknięcie górnych i dolnych (projektów) zakładek powoduje wyświetlenie dodatkowego menu z opcjami dla tych elementów. W przypadku zakładek projektów pozwala to dodać nowy projekt, importować projekt, usunąć/zmienić nazwę/ikonę/pozycję istniejącego projektu lub go wyeksportować. W przypadku zakładek Profile, Taski i Sceny dłuższe dotknięcie pozwala głównie na import odpowiednio profili, tasków i scen.&lt;/p&gt;
&lt;h3&gt;Importowanie projektów, profili, tasków, scen&lt;/h3&gt;
&lt;p&gt;Omawiając interfejs doszliśmy do bardzo ważnej funkcjonalności Taskera, a mianowicie importu i eksportu jego zawartości. Dzięki temu możemy nasz projekt/profil/task wyeksportować by ktoś mógł wykorzystać go w swoim urządzeniu.&lt;/p&gt;
&lt;p&gt;Eksport elementów polega na dłuższym dotknięciu danego projektu/profilu/tasku/sceny i wybraniu opcji &lt;b&gt;Menu&lt;/b&gt; / &lt;b&gt;Export&lt;/b&gt; / &lt;b&gt;XML to SD&lt;/b&gt;. W trakcie eksportu w pamięci urządzenia tworzone są pliki:
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;xxxxxx.prj.xml&lt;/b&gt; w folderze &lt;i&gt;/sdcard/Tasker/projects/&lt;/i&gt; dla projektów,&lt;/li&gt;
&lt;li&gt;&lt;b&gt;xxxxxx.prf.xml&lt;/b&gt; w folderze &lt;i&gt;/sdcard/Tasker/profiles/&lt;/i&gt; dla profili,&lt;/li&gt;
&lt;li&gt;&lt;b&gt;xxxxxx.tsk.xml&lt;/b&gt; w folderze &lt;i&gt;/sdcard/Tasker/projects/&lt;/i&gt; dla tasków,&lt;/li&gt;
&lt;li&gt;&lt;b&gt;xxxxxx.scn.xml&lt;/b&gt; w folderze &lt;i&gt;/sdcard/Tasker/scenes/&lt;/i&gt; dla scen.&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;W podobny sposób wykonuje się import elementów Taskera. Pliki xml należy skopiować do odpowiednich folderów w zależności od typów i następnie dłużej nacisnąć odpowiednią zakładkę projektu, profilu, tasku lub sceny i wybraniu opcji &lt;b&gt;Import&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;Należy pamiętać, że Tasker zaimportuje dane tylko wtedy gdy wersja aplikacji jest taka sama lub wyższa niż na urządzeniu gdzie przeprowadzono eksport. Czasem powoduje to konieczność zainstalowania Taskera w wersji &lt;a href=&quot;http://tasker-android.blogspot.com/2014/07/zaczynamy-przygode-z-taskerem.html&quot; title=&quot;Zaczynamy przygodę z Taskerem&quot;&gt;beta o czym pisałem w pierwszym wpisie&lt;/a&gt;.
&lt;h3&gt;Kopia zapasowa&lt;/h3&gt;
&lt;p&gt;Mówi się, że &lt;i&gt;&quot;ludzie dzielą się na tych co robią kopie zapasowe i na tych co... będą je robić&quot;&lt;/i&gt;. Kopia zapasowa w przypadku Taskera to bardzo ważna sprawa. Utrata tworzonych przez długie tygodnie profili byłaby katastrofą. Autor Taskera pomyślał o tym i po wybraniu &lt;b&gt;Menu&lt;/b&gt; / &lt;b&gt;Data&lt;/b&gt; mamy dostęp do opcji &lt;b&gt;Backup&lt;/b&gt; i &lt;b&gt;Restore&lt;/b&gt;. W ten sposób utworzony backup zawiera wszystkie projekty, profile, taski i sceny jakie mamy wprowadzone w Taskerze.&lt;/p&gt;
&lt;p&gt;Ja osobiście polecam włączenie jeszcze tworzenie automatycznych kopii bezpieczeństwa. Dokonuje się tego w ustawieniach aplikacji na zakładce &lt;b&gt;MISC&lt;/b&gt;. Opcja nazywa się &lt;b&gt;Maximum Auto-Backup Age&lt;/b&gt; i można wybrać jak stare kopie bezpieczeństwa ma przechowywać aplikacja. Ja ustawiam tą opcję na 2 dni. Mam wtedy pewność, że jeśli coś zmienię bez utworzenia ręcznej kopii bezpieczeństwa to w ciągu 2 dni zauważę, że coś jest nie tak i przywrócę poprzednia wersję.&lt;/p&gt;
&lt;p&gt;Na dziś to koniec. W następnym wpisie zaczniemy tworzyć profile czyli zaczniemy prawdziwą zabawę z Taskerem.&lt;/p&gt;
</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/2887171016274616904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/2887171016274616904'/><link rel='alternate' type='text/html' href='http://tasker-android.blogspot.com/2014/07/podstawowe-pojecia-i-omowienie.html' title='Podstawowe pojęcia i omówienie interfejsu Taskera'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05046866348300228265</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUbX8N2lEQ1-_W670VMXpo61tAk0tkoO16zrpQfndSlqB5gwBHMZTw4pAjhKHUK1oapeZW3wxcs7-JmTJffzbHLEPpLSJQE8kjHYuNWy9vcR4BbE4-dMpAb_O4ylFqDma0C7B6pVRTj2s/s72-c/beginner_mode.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-5723209725752603760.post-7659053140729139866</id><published>2014-07-22T23:42:00.001+02:00</published><updated>2014-08-06T16:03:34.381+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="Automagic"/><category scheme="http://www.blogger.com/atom/ns#" term="Llama"/><category scheme="http://www.blogger.com/atom/ns#" term="Locale"/><category scheme="http://www.blogger.com/atom/ns#" term="Tasker"/><title type='text'>Zaczynamy przygodę z Taskerem</title><content type='html'>&lt;h3&gt;Smartfony za mało &quot;smart&quot;&lt;/h3&gt;
&lt;p&gt;Żyjemy w czasach, w których posiadanie smartfonu jest na porządku dziennym. Czasem jednak ma się wrażenie, że urządzenia te są za mało &quot;smart&quot;. Czemu w, jak wynika z nazwy, inteligentnych telefonach trzeba wciąż powtarzać te same czynności, czemu te urządzenia mają nieraz problemy w &quot;dogadywaniu się&quot; między sobą? Czemu w tak małym stopniu możemy nimi sterować głosem? Odpowiedzią na te pytania jest Tasker. Przynajmniej dla urządzeń pracujących pod kontrolą systemu Android. W czym pomoże nam Tasker? W zautomatyzowaniu wielu powtarzalnych czynności, w dopasowaniu sposobu pracy systemu operacyjnego do naszego trybu życia, w ulepszeniu komunikacji głosowej ze smartfonem czy tabletem i w końcu w ulepszeniu komunikacji między różnymi urządzeniami. Tak naprawdę głównym ograniczenie jest nasza pomysłowość.&lt;/p&gt;
&lt;h3&gt;Dlaczego Tasker?&lt;/h3&gt;
&lt;p&gt;Osoby, które przeglądały zasoby sklepu Google Play zapewne trafiły na programy podobne do Taskera takie jak &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.kebab.Llama&quot; title=&quot;Llama&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Llama&lt;/a&gt;, &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.twofortyfouram.locale&quot; title=&quot;Locale&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Locale&lt;/a&gt; czy &lt;a href=&quot;https://play.google.com/store/apps/details?id=ch.gridvision.ppam.androidautomagic&quot; title=&quot;Automagic&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Automagic&lt;/a&gt;. Czemu więc Tasker? Dla mnie ta aplikacja, mimo trudnego do ogarnięcia interfejsu, jest najprostszy w obsłudze i oferuje najwięcej możliwości. Poza tym najbardziej przypomina mi środowisko programistyczne dzięki czemu jeśli ktoś miał do czynienia z jakimkolwiek językiem programowania szybko się w nim odnajdzie. Kolejnym argumentem jest zwykłe przyzwyczajenie gdyż używam go już od 5 lat.&lt;/p&gt;
&lt;h3&gt;Instalujemy Taskera&lt;/h3&gt;
&lt;p&gt;Taskera można zakupić w sklepie &lt;a href=&quot;https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm&quot; title=&quot;Tasker&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Google Play&lt;/a&gt;. Jego dzisiejsza cena to 14,99 zł.&lt;/p&gt;
&lt;p&gt;Aplikację można też pobrać ze &lt;a href=&quot;http://tasker.dinglisch.net/download.html&quot; title=&quot;Pobierz Taskera&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;strony jego autora&lt;/a&gt;. Wersja ze strony działa przez 7 dni bez konieczności płacenia. Dzięki temu można się porządnie zapoznać z aplikacją i upewnić się czy chcemy wydać na niego pieniądze.
Należy pamiętać, że do zaintalowanie pliku apk pobranego ze strony autora aplikacji konieczne jest włączenie opcji &lt;b&gt;Nieznane źródła&lt;/b&gt;, którą znajdziemy w &lt;b&gt;Ustawiania&lt;/b&gt; / &lt;b&gt;Zabezpieczenia&lt;/b&gt;.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_Y8LF890ytlRrGMNibtJBgp8WHi4PuwZPyKiT7MPwzkrH0WL4GRO9yzhDiRAghyWaTDwFlNU5nb-yx7YJblKhJIP9UsdTNnI5cfrRD9gE8_GpslU5DzssJkj-RA5UVLQvk6_zeEs1bVw/s1600/nieznane_zrodla.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_Y8LF890ytlRrGMNibtJBgp8WHi4PuwZPyKiT7MPwzkrH0WL4GRO9yzhDiRAghyWaTDwFlNU5nb-yx7YJblKhJIP9UsdTNnI5cfrRD9gE8_GpslU5DzssJkj-RA5UVLQvk6_zeEs1bVw/s400/nieznane_zrodla.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Należy pamiętać, że by móc zaimportować profile Taskera trzeba posiadać zainstalowaną tą samą lub nowszą wersję aplikacji. Ja czasem korzystam z wersji beta programu więc by móc zaimportować profile wyeksportowane przeze mnie należy taką też zainstalować. Są one dostępne na &lt;a href=&quot;http://tasker.dinglisch.net/beta.html&quot; title=&quot;Tasker Beta&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;tej stronie&lt;/a&gt;. Przy każdym wyeksportowanym profilu będę podawał wymaganą do importu wersję Taskera.&lt;/p&gt;
&lt;h3&gt;OK, Tasker zainstalowany i co dalej?&lt;/h3&gt;
&lt;p&gt;Gdy Taskera mamy już zainstalowanego to czeka nas trochę nauki. Niestety ogromne możliwości aplikacji wiążą się z rozbudowanym i początkowo skomplikowanym interfejsem. Jeśli masz chęć poświęcić trochę czasu by poznać tą aplikację to ten blog jest dla Ciebie. Kolejne wpisy będą prowadzić Cię od podstaw do zaawansowanych możliwości Taskera. Gdyby to było dla Ciebie za mało zachęcam do odwiedzenia &lt;a href=&quot;http://tasker.dinglisch.net/userguide/en/index.html&quot; title=&quot;Tasker: Userguide&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;strony pomocy do aplikacji&lt;/a&gt; oraz wątków dotyczących &lt;a href=&quot;http://forum.android.com.pl/f850/tasker-jak-i-z-czym-to-siae-je-film-instruktaa-owy-oraz-instrukcja-by-mrtur-w-pierwszym-poa-cie-31715/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Taskera&lt;/a&gt; na &lt;a href=&quot;http://forum.android.com.pl/f850/tasker-gotowe-i-sprawdzone-w-dziaa-aniu-profile-ustawiea-147656/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;forum android.com.pl&lt;/a&gt;, na którym staram się udzielać w miarę możliwości.&lt;/p&gt;
&lt;h3&gt;Co znajdziecie na tym blogu&lt;/h3&gt;
&lt;p&gt;Na tym blogu chciałbym stworzyć kurs umożliwiający opanowanie Taskera, jego obsługi i możliwości. Zacznę od omówienia interfejsu, nazewnictwa elementów i najprostszych profili i stopniowo będę zwiększał poziom trudności. Wszystkie części kursu będę opierał na wykonywaniu profili, które mogą się przydać. Każdy z profili będzie udostępniony do pobrania i zaimportowania do swojego systemu.&lt;/p&gt;
&lt;p&gt;Poza tym stopniowo będę opisywał wszystkie wykorzystywane wtyczki, akcje, eventy oraz stany czyli powstanie polskie tłumaczenie pomocy do Taskera.
Oczywiście blog jest dla czytelników i to w jakim kierunku będzie zmierzł zamierzam uzależnić od tego czego Wy czytelnicy będziecie potrzebowali. Także zapraszam do komentowania. Na wszelkie pytania postaram się odpowiedzieć, a z problemami pomóc.&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/7659053140729139866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5723209725752603760/posts/default/7659053140729139866'/><link rel='alternate' type='text/html' href='http://tasker-android.blogspot.com/2014/07/zaczynamy-przygode-z-taskerem.html' title='Zaczynamy przygodę z Taskerem'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05046866348300228265</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_Y8LF890ytlRrGMNibtJBgp8WHi4PuwZPyKiT7MPwzkrH0WL4GRO9yzhDiRAghyWaTDwFlNU5nb-yx7YJblKhJIP9UsdTNnI5cfrRD9gE8_GpslU5DzssJkj-RA5UVLQvk6_zeEs1bVw/s72-c/nieznane_zrodla.jpg" height="72" width="72"/></entry></feed>