Aplicația mobilă 48 [305547]

Cuprins

Concluzii 46

Bibliografie 47

ANEXE 48

Aplicația mobilă 48

Aplicația Web 48

[anonimizat] a [anonimizat]. [anonimizat]-[anonimizat] o [anonimizat], noi nu mai dispunem de oportunitatea de a le utiliza. Nu trebuie să depunem eforturi semnificative pentru a [anonimizat], [anonimizat], sau avem nevoie de un număr de telefon din agenda și constatăm că nu mai avem baterie la telefon. Având în vedere nivelul de implicare a tehnologiei în viata noastră putem considera că numărul persoanelor care nu au fost niciodată într-o astfel de situație tinde cu repeziciune spre zero. [anonimizat], de ponderea imensă a [anonimizat], suportului tehnologic.

[anonimizat], [anonimizat]. [anonimizat], cu atât îi acordăm mai puțina importanță.

[anonimizat]-a influențat din ce în ce mai mult viața. [anonimizat], momentul în care numărul dispozitivelor mobile conectate la Internet a depășit numărul dispozitivelor desktop pentru prima dată în istorie. [anonimizat], care domina piața dispozitivelor mobile la sfârșitul anilor 90 și începutul anilor 2000. [anonimizat] a tot mai multor modele de dispozitive mobile din ce în ce mai performante și din ce în ce mai ieftine. [anonimizat]-o [anonimizat]. Printre aceste facilități putem aminti posibilitatea de a [anonimizat] o [anonimizat] a [anonimizat] a avea o imagine în timp real a [anonimizat].

Ideea pe care doresc să o subliniez se referă la faptul că tehnologii care în urma cu câțiva ani erau folosite numai în cadrul firmelor de IT sau dezvoltatoare de soluții informatice se regăsesc azi în idei de business care nu au nicio legătură cu domeniul IT. Firme de taximetrie folosesc tablete pentru a cunoaște în timp real poziția fiecărei mașini, unele chiar folosesc aceste poziții în tandem cu algoritmi software pentru a determina cui îi este trimisă următoarea comandă, în funcție de disponibilitate și de distanta până la locul unde se află clientul. Marea majoritate a firmelor mici care încearcă să implementeze soluții de acest gen încearcă să obțină beneficii reale cu costuri cât mai mici, cum ar fi reducerea costurilor operative, fidelizarea clienților printr-o mai bună comunicare și prin imbunătățirea calității serviciilor sau, nu în ultimul rând, un mai bun control asupra pierderilor rezultate din neglijență, lipsa de productivitate sau diferite forme de fraudă.

Am luat ca model o firmă care administrează mai multe vehicule și dispune de un buget foarte limitat în acest sens. Aceasta poate fi o firmă care are ca obiect de activitate furnizarea de servicii, distribuție, curierat sau poate fi un restaurant care dorește să știe în cât timp se întoarce cea mai apropiată mașină care a plecat să facă 3-4 livrări la domiciliu la adrese diferite. Cunoscând detalii precum poziția fiecărei mașini și ora estimativă la care aceasta se va întoarce, se poate face planificarea astfel încât următoarea comanda să nu fie livrată rece, dar să nici nu dureze prea mult până când ajunge la clientul care probabil, de cele mai multe ori, comandă constant mâncare din acel loc. Acesta poate fi o idee de fidelizare a clientelei și, totodata, un mod de a fi cu un pas în fața unor întreprinzători mai reticenți la soluțiile digitale și care preferă modele de afaceri mai clasice.

Proiectul de față este constituit în prima sa parte dintr-un studiu de caz efectuat în încercarea de a găsi o soluție de tracking GPS pentru o firmă similară cu cea descrisă în paragraful anterior. S-au căutat soluții gratuite sau soluții care să nu implice costuri recurente suplimentare celor pentru serviciul de date de pe telefon sau tableta utilizată. Orice dispozitiv mobil conectat la Internet presupune un cost pentru serviciul de date, însă majoritatea furnizorilor de aplicații de urmărire a flotei (​fleet tracking​) percep un cost lunar suplimentar pentru acel serviciu. Am decis evitarea adoptării unei soluții de acest gen și, în urma studiului de caz, am ajuns la ideea de a implementa o aplicație care oferă o funcție simplă de tracking și la care se mai pot adaugă alte funcționalități, în functie de nevoile beneficiarului.

În cea de-a doua parte a licenței este prezentată implementarea soluției, implementare care are, la rândul ei, două părti și anume implementarea aplicației mobile care se instalează pe dispozitivul cu Android, și implementarea aplicației web, care afișează în timp real administratorului sau coordonatorului informații despre vehicule.

Am ales sistemul Android dată fiind ponderea extrem de mare pe piață a dispozitivelor care rulează acest sistem de operare și a faptului că publicarea aplicației pe Google Play Store, portalul de aplicații condus de Google, este mult mai ușoară decât operațiunea similară pentru o aplicație dezvoltată pentru dispozitive Apple. De asemenea, am luat în calcul și costurile dispozitivelor mobile – cele care rulează Android tind să coste o fracțiune (în cazul în care nu este vorba de dispozitive high end) din costul celor produse de Apple, care rulează sistemul de operare proprietar Apple, iOS.

În concluzie, sistemul de operare Android pentru dispozitive mobile, prețul tot mai accesibil al dispozitivelor care rulează această platforma, precum și faptul că este ​open source​, conferă dezvoltatorului o soluție extrem de facilă și flexibilă pentru dezvoltarea de produse adresate afacerilor de talie mica sau care sunt la început, mai ales în contextul în care serviciile de localizare GPS, serviciul Google Maps, precum și alte opțiuni și servicii sunt puse la dispozitie gratuit, pentru o utilizare în regim rezonabil.

Capitolul 1 – Tehnologii utilizate pentru dezvoltarea de aplicații mobile

Pentru a avea o imagine corectă asupra modului în care au luat avânt aplicațiile mobile, trebuie urmărite următoarele aspecte:

Evoluția World Wide Web-ului

Evoluția utilizării telefoanelor mobile

Cele două au evoluat în paralel până în momentul în care creșterea lungimii de bandă pentru dispozitivele mobile și transformarea telefoanelor în mini-calculatoare, care a dus la mai mult decât intersecția lor. A fost creat un mediul propice pentru dezvoltarea de aplicații mobile care să utilizeze servicii de pe web, fără probleme cauzate de viteză sau costuri prea mari. Numărul de utilizatori a crescut exponențial, deoarece nu mai are limitat de accesul la un desktop. Aplicațiile mobile care rulau pe telefoanele inteligente puteau fi accesate la orice oră, din orice locație. Programatorii au simțit schimbarea și au început să dezvolte aplicații native pentru sistemele de operare ale telefoanelor inteligente. O nouă piață s-a născut: cea a aplicațiilor mobile. Google Store, Apple Store sunt platforme care permit publicarea și achiziționarea de aplicații pentru dispozitivele mobile.

1.1 Evoluția World Wide Web-ului

Este greu de crezut că au trecut doar 25 de ani de la apariția World Wide Web-ului, acum, într-o epocă în care prima pornire este să verifici pe Google, în care informația abundă și este doar la un click distanță, în care dicționarele sunt online, hărțile sunt actualizate cu situația traficului în timp real, într-o perioadă în care noțiunea de virtualitate face parte din vocabularul uzual.

În anul 1989, Sir Tim Berners-Lee făcea prima propunere a ceea ce urma să fie WWW-ul, într-o perioadă în care lucra la CERN, Organizația Europeană pentru Cercetare Nucleară. Respinsă inițial, în varianta din octombrie 1980, propunerea conținea cele trei tehnologii fundamentale care continuă să fie baza Web-ului actual:

HTML – Hypertext Markup Language – limbajul de marcare pentru Web

URI – Uniform Resource Identifier – adresă unică utilizată pentru identificarea fiecărei resurse pe web

HTTP – Hypertext Transfer Protocol

Tim Berners-Lee a creat primul editor / browser pentru paginile Web (WorldWideWeb.app) și primul server Web (httpd). Până la sfârșitul anului 1990, prima pagină Web a fost livrată pe Internet, iar în anul 1991, oameni din afara CERN-ului au fost invitați să se alăture comunității Web.

Pe măsură ce Web-ul a început să crească, creatorul lui a realizat că adevăratul potențial al Web-ului putea fi atins doar dacă oricine putea să-l folosească, fără a cere permisiunea sau a plăti pentru asta:

“Dacă tehnologia ​(care sta la baza Web-ului) ar fi fost proprietate privată și sub controlul meu, probabil că nu ar fi cunoscut o asemenea amploare. Nu poți propune ceva care se vrea a constitui un spatiu universal și, în același timp, să păstrezi controlul complet asupra lui.”

Tim s-a mutat de la CERN la MIT (Massachusetts Institute of Technology) în anul 1994 și a înființat W3C (World Wide Web Consoțium), o comunitate internațională al cărei interes era dezvoltarea de standarde web deschise. La ora actuală, Sir Tim Berners-Lee continuă să fie Directorul acestui consorțiu. ​(“History of the Web,” n.d.)1.

Accesarea WWW-ului se face prin intermediul unei conexiuni la Internet, iar statisticile publicate în 2016 de către InternetLiveStats.com, arată că numărul de utilizatori conectați la Internet a crescut de la sub 500.000 în anul 2000, la peste 3 miliarde în anul 2016 ​(“Number of Internet Users (2016) – Internet Live Stats,” n.d.)2.

Creșterea numărului de utilizatori cu acces la Internet, ​faptul că World wide Web-ul a rămas o tehnologie gratuită, că s-a bazat pe o metodologie simplă de a partaja documente prin intermediu Internetului, trecerea telefoanelor mobile spre telefoane inteligente care a dus la rezultatul că Web-ul nu a mai fost limitat la utilizarea doar de pe calculatoare, faptul că în ultimii ani au apărut standarde și aplicații care permit dezvoltarea de aplicații ​mobile-first, ​toate acestea au dus la un boom al WWW-ului, după cum poate fi observat și în Figura 1, un infograph care conține evoluția web-ului din anul 1991 și până în 2012, publicat la ​http://www.evolutionoftheweb.com/​.

12 “History of the Web.” ​ World Wide Web Foundation​ ​. Web. 19 June 2016

“Number of Internet Users (2016) – Internet Live Stats.” , Web. 19 June 2016​

Același site web ne oferă și o imagine a evoluției numărului de utilizatori ai Internet-ului, prezentată în Figura 2. Se poate observa că, în 21 de ani de la apariția web-ului, numărul de utilizatori a ajuns la 2,27 de miliarde de utilizatori.

Una dintre cele mai cunoscute previziuni cu privire la evoluția utilizării Internetului pe dispozitivele mobile, a fost cea făcută de Mary Meeker, în anul 2009. Aceasta estima că în anul 2014, utilizarea Internetului de pe dispozitivele mobile va depăși utilizarea Internetului de pe desktop ​(Ingram, n.d.). Din statisticile publicate de comScore, se poate observa că realitatea s-a apropiat de estimări ​(“Mobile marketing statistics 2016,” 2016), numărul de utilizatori care se conectează la Internet de pe telefonul mobil fiind mai mare decât numărul de utilizatori care accesează Internetul de pe dispozițive de tip desktop.

1.2 Evoluția telefoanelor mobile

Telefoanele mobile au fost inițial create pentru a putea fi folosite din automobile.

Prima convorbire telefonică de pe un telefon mobil a fost făcută în 3 Aprilie 1973, când Martin Cooper, inginer la Motorola, a telefonat unei companii de telecomunicații rivale și i-a informat că vorbește de pe un telefon mobil. Telefonul pe care l-a utilizat Cooper avea 1.1 kg și dimensiunile 228.6x127x44.4mm. Acest prototip permitea o conversație de 30 de minute și necesita 10 ore pentru a se încărca.

În 1983, Motorola a lansat primul telefon mobil comercial, cunoscut sub numele de Motorola DynaTAC 8000X. Dispozitivul permitea convorbiri de 30 de minute, 6 ore de standby și putea stoca până la 30 de numere. și costa 4000$. ​(“The History of Mobile Phones From 1973 To

2008: The Handsets That Made It ALL Happen,” n.d.)​

Înainte de apariția telefonului DynaTAC 8000X, mai multe evoluții majore au deshis calea către primul telefon mobil. Astfel, în timpul primului război mondial, armata germană a testat telefoane fără fir pe trenuri care circulau între Berlin și Zossen. în timpul celui de-al doilea război mondial, forțele armate din toată lumea au utilizat legăturile telefonice radio. Începând cu anul 1940, receptoarele radio portabile au fost disponibile la scară largă. Toate aceste tehnologii au inspirat cercetătorii de la Bell Labs să creeze un telefon portabil pentru automobile. în 1946, Bell Labs a început să ofere servicii telefonice pe vehiculele din St. Louis, Missouri. Câteva săptămâni mai târziu, AT&T a venit cu o contra-ofertă, un serviciu denumit Serviciu Telefonic Portabil, care consta într-o gamă largă de servicii pentru dispozitive portabile, în general incompatibile, care ofereau zone de acoperire limitate și un număr redus de canale disponibile.

În cele din urmă, AT & T și Bell Labs au introdus tehnologia celulară, ceea ce a permis reutilizarea frecvențelor în zonele acoperite de către transmițătoarele de mică putere. Acest lucru a permis telefoanele mobile să fie mai mult decât un vis: ele au devenit un produs fezabil din punct de vedere economic, care ar putea fi profitabil pentru Bell și AT & T.

Între 1957 și 1961, inventatorul sovietic Leonid Kupriyanovich a dezvoltat o serie de telefoane mobile care semănau surprinzător de mult cu telefoanele mobile moderne. Unul dintre telefoanele lui Leonid cântărea 70 de grame.

Serviciu Telefonic Portabil, lansat de AT&T în 1949, necesita pentru funcționare instalarea unui echipament de 36kg în automobil, existau doar 3 canale, ceea ce însemna că doar 3 clienți din orice oraș puteau iniția o convorbire la un moment dat și era foarte scump. ​(“History of Cell Phones

-,” n.d.)​ 6

La începutul anilor 1990 au intrat pe scenă și Nokia și NEC. Primul telefon mobil lansat de Nokia, Mobira Cityman 900, cântărea 800g. La sfârșitul anilor 1990, telefoanele mobile au început să devină frecvente.

O evoluție vizuală a felului în care au arătat telefoanele mobile de-a lungul anilor este prezentată în următoarea figură (preluată de pe http://www.dreamstime.com/):

Diferite studii publicate la sfârșitul anului 2015, prezintă evoluția uimitoare a Internetului, a telefoniei mobile și a utilizării dispozitivelor mobile. Astfel:

În 2015 arată că existau peste 2 miliarde de utilizatori de telefoane inteligente și că 83% din conexiunile la Internet sunt realizate de pe dispozitive mobile. ​(Srivastava, 2014)

Numărul de abonamente la telefonie mobilă a crescut de la 738 de milioane în anul 2000 la peste 7 miliarde în anul 2015, potrivit raportului publicat de Uniunea Internațională a Telecomunicațiilor. ​(​ICT Facts&Figures, The World in 2015​, n.d.)8

Numărul de conexiuni la Internet a crescut de la 400 de milioane în anul 2000, la 3.2 miliarde până la sfârșitul anului 2015, un număr cu atât mai promițător cu cât 2 miliade de utiliyatori fac parte din țările în curs de dezvoltare. ​(Nair, 2015)

1.3 Sistemele de operare ale telefoanelor inteligente. Prezentare Generală. Comparație

Sistemele de operare pentru mobile sunt sisteme de operare care funcționează pe telefoane inteligente, PDA-uri, tablete și alte dispozitive mobile. Principalele sisteme de operare mobile sunt: Android (Google), iOS (Apple), Windows Phone (Microsoft), RIM Bada și Symbian.

Potrivit statisticilor publicate de GSMA Intelligence, la ora actuală sunt peste 4.5 miliarde de abonați unici la un serviciu de telefonie mobilă, jumătate din populația lumii are un abonament pentru telefonie mobilă, față de 1 din 5, cum era acum 10 ani. ​(“The Mobile Economy 2015,” n.d.)

10

Android

Firma Android Inc. a fost fondată de Andy Rubin, fost inginer la Apple ​(“Android History,” 2015)11. Concentrându-se pe cea mai bună experiență web pe care ar putea-o oferi și creând un mediu în care orice dezvoltator ar putea lucra, Android a avut un plan de afaceri solid în momentul în care l-a prezentat în fața investitorilor, în 2005. Page și Brin, fondatorii Google, aveau nevoie de un telefon care să concureze cu Microsoft și Blackberry și, în același timp își doreau mai multe telefoane care să aibă Google ca motor de căutare implicit. O platformă deschisă ca Android le oferea exact aceste lucruri. Mai multe prototipuri au fost proiectate și respinse până când modelul G1 a fost finalizat și lansat, în anul 2008.

Cu toate că nucleul Android OS este open-source (cu sursă deschisă), o mare parte a sistemului de operare nu este. Aplicațiile Google incluse pe majoritatea telefoanelor Android vândute în Occident sunt cu sursă închisă.

iOS iOs este sistemul de operare ale telefoanelor iPhone. Primul iOS a apărut în anul 2007, nu a oferit suport pentru copy/paste, 3G, atașare fișiere la email, MMS și nu permitea funcționarea aplicațiilor externe. Actualizările ulterioare au inclus iTunes Music Store, permițând utilizatorilor, pentru prima dată, achiziționarea de melodii direct de pe telefon (prin intermediul unei conexiuni WIFI) și schimbarea tonului de apel. Începând cu 2007, în fiecare an a apărut o nouă versiune de iOS. Versiunea din 2015, iOS 9, a venit cu o serie nouă de caracteristici, printre care: durată mai lungă de viață pentru baterie, noul rol al lui Siri ca asistent de căutare și o nouă tastatură. ​(Williams, 2015)12

Windows Phone

Primul Windows Phone, în varianta în care este cunoscut la ora actuală, a fost lansat în anul

2010 la Barcelona și este rezultatul colaborării dintre Microsoft și Nokia. Începând cu această

1011 “The Mobile Economy 2015.” ​GSMA Intelligence​, Web. 20 June 2016

“Android History.” ​Android Central​, 21 Oct. 2015. Web. 19 June 2016

12 Williams, Rhiannon. “Apple iOS: A Brief History.” ​ ​Telegraph.co.uk​, 17 Sept. 2015. Web. 20 June 2016

variantă, sistemul de operare a fost regândit pentru dispozitive mobile, diferențiindu-se complet de varianta pentru desktop. Dispozitivele pe care rulează sistemul de operare sunt produse de Nokia. (Guru & Guru, 2012)13

Potrivit statisticilor publicate de Statistica.com, cel mai popular sistem de operare pentru dispozitive mobile este, de câțiva ani, Android, urmat de iOS ​(“Global smartphones sales by operating system 2009-2015 | Statistic,” n.d., “Smartphone OS global market share 2009-2016 |

Statistic,” n.d.)14 15:

2016

1415 “Global Smartphones Sales by Operating System 2009-2015 | Statistic.” ​Statista​, Web. 19 June 2016

“Smartphone OS Global Market Share 2009-2016 | Statistic.” ​ ​Statista​, Web. 18 June 2016

1.4 Publicarea aplicațiilor mobile

Există o diferență de abordare majoră între cum sunt livrate aplicațiile mobile prin intermediul Google Play și a ehivalentului său – Apple Store. Pentru a publica o aplicație pe Google Play regulile sunt mult mai relaxate decât în cazul Apple Store, ceea ce poate fi privit ca un avantaj (viteză de publicare mult mai mare), dar și ca dezavantaj (aplicațiile nu sunt verificate riguros).

1.4.1 Publicarea aplicațiilor pe Google Play

Condițiile pentru a publica o aplicație pe Google Play sunt urmatoarele (potrivit informațiilor publicate pe site-ul ​https://developer.android.com/distribute/googleplay/start.html​):

Înregistrarea pentru un cont de Editor

Navigarea pe site-ul ​https://play.google.com/apps/publish/signup/

Introducerea informațiilor de bază despre dezvoltator (aceste informații pot fi modificate ulterior)

Citirea și acceptarea Acordului de Distribuire pentru Dezvoltatori pentru țara dezvoltatorului.

Plata unei taxe de înregistrare de 25$.

După verificarea înregistrării, dezvoltatorul este notificat prin intermediul adresei de email introduse la înregistrare.

Configurarea unui cont Google pentru plăți, în cazul în care se va dori comercializarea aplicațiilor publicate

Intrarea în cont, la adresa ​https://play.google.com/apps/publish/

Navigarea către pagina ​Financial Reports

Click pe Setup a Merchant Account Now (Configurați un cont de comerciant)

Explorarea consolei Google Play pentru dezvoltatori, precum și a uneltelor de publicare.

Odată creat contul și verificată înregistrarea, dezvoltatorul se poate conecta la consola Dezvoltatorului (Developers Console), care este punctul de plecare pentru operațiile de publicare a aplicațiilor.

1.4.2 Publicarea aplicațiilor pe Apple Store

Fiecare aplicație care se dorește a fi publicată este supusă unei recenzii bazate pe criterii tehnnice, de conținut și de design. Aceste criterii ar trebui avute în vedere în momentul dezvoltării aplicației și ele sunt disponibile la următoarea adresă: https://developer.apple.com/app-store/review/guidelines/​.

Pe site-ul Apple este prezentată o listă de pași care ar trebui urmați pentru a dezvolta aplicații pentru iOS, OS X, watchOS, and tvOS (​https://developer.apple.com/app-store/submissions/​).

Aceștia sunt:

Dezvoltarea aplicației folosind Xcode 7 și ultima variantă de SDK

Actualizarea la ultima variantă a sistemului de operare

Dezvoltarea urmând ghidul de revizuire a aplicației

Optimizarea aplicației

Testare Beta

Trimitere spre verificare

Informațiile oferite de Apple sunt mult mai vaste, cuprinzând și strategii de alegere a unui model de business, de atragere a utilizatorilor, de marketing.

Aplicații ​open-source

Multă lume confundă programele / aplicațiile ​open-source (sau cu sursă deschisă) cu aplicațiile gratuite, dar diferența dintre ele este majoră. Este adevărat că amândouă îi oferă utilizatorului interesat posibilitatea de a utiliza aplicația fără a plăti, dar în cazul aplicațiilor gratuite, asta este tot ceea ce îi oferă, pe când în cazul aplicațiilor cu sursă deschisă, utilizatorului îi este oferită gratuit și sursa, pentru a o utiliza cum crede de cuviință.

Capitolul 2 – Aplicații de tracking GPS pentru dispozitive Android

Prezentul studiu de caz vizează alegerea unei aplicații de tracking GPS pentru o afacere care iși doreste un mai bun control asupra vehiculelor și/sau contractorilor implicați în activitatea economică. Datorită avantajelor pe care le oferă platforma Android, avantaje prezentate în capitolul anterior, am optat pentru această platformă, considerând ca este soluția cea mai potrivită pentru oricare dintre cele două abordări: alegerea unui sistem existent sau dezvoltarea unui sistem nou. Sistemul implementat presupune ca fiecare vehicul să conțină un dispozitiv Android (telefon sau tabletă). Această abordare prezintă și un avantaj de cost, astfel, dacă un anume utilizator folosește deja un dispozitiv pe care rulează Android necesitatea investiției suplimentare în hardware odată cu folosirea noii tehnologii se anulează.

Printre criteriile pe care le-am urmărit sunt în primul rând facilitățile funcționale, ușurința în implementare, ușurința în utilizare și, în mod evident, prețul.

Aplicația ideală, ar oferi, la un cost cât mai competitiv, următoarele:

Locația dispozitivului în timp real, cu acuratețe geografică de 50 de metri, în eșantioane de timp de maxim 5 minute

Afișarea în timp real a poziției mai multor dispozitive din același grup; o facilitate utilă dar de importanță secundară ar consta în abilitatea supervizorului de a organiza dispozitivele în subgrupuri distincte, după criterii variabile în funcție de necesitățile caracteristice fiecărei situații, de la caz, la caz

Afișarea în timp real a vitezei de deplasare a fiecărui dispozitiv

Generarea rutei pe care un dispozitiv a parcurs-o intr-un interval de timp furnizat de către supervizor ca date de intrare

Posibilitatea dispozitivului de a transmite informația prin rețeaua celulară sau WIFI, în funcție de disponibilitate

Capacitatea dispozitivului de a detecta în timp real starea conexiunii la internet și a determina daca informațiile au fost transmise cu succes serverului care stocheaza istoricul deplasărilor; în cazul lipsei conexiunii la internet sau a lipsei unei confirmari de transfer, aplicația trebuie sa fie prevazută cu un algoritm de backup, care să salveze local activitatea din intervalul în care conexiunea la internet nu a fost disponibila, și apoi, de indata ce conexiunea este reluata, sa transmita serverului informațiile retroactiv

Studiul de caz reprezintă o evaluare în paralel a 3 aplicații deja existente în Google Play App Store. Am tinut cont în cazul fiecarei aplicații de urmatoarele:

Nota generală a utilizatorilor (Online User Rating)

Numărul de recenzii

Numărul de instalări (Play Store afișează în mod public numărul de instalări ale oricărei aplicații)

Ușurința de instalare

Ușurinta în utilizare

Funcționalitatea (aici am avut în vedere și flexibilitatea pe care aplicația o oferă utilizatorului de a modifica anumiți parametri de funcționare)

Calitatea interfeței grafice

Având în vedere că nu am găsit aplicații care să se plieze exact pe cerințele enumerate în paragraful anterior, am plecat de la aplicații care să îndeplinească în primul rând funcția de bază, și anume capacitatea de a-și transmite poziția GPS către un server care sa o stocheze intr-o bază de date.

Cele 3 aplicații alese sunt:

Find My Device

Cerberus

Glympse

2.1 Find My Device

Find My Device este o aplicație care la momentul realizării acestui studiu de caz are nota 4.3 din 5, din peste 430,000 de recenzii în Google Play. Este o aplicație foarte populara, care se bucură de un real succes printre utilizatorii acestei platforme. Faptul că este dezvoltată chiar de către Google constituie cu siguranță unul dintre motivele cărora li se datorează succesul enorm, purtand amprenta gigantului informatic în ceea ce priveste interfața grafică și funcționalitatea. Conform Google Play, aplicația Find My Device a fost instalată de peste 10 milioane de utilizatori.

Privind din poziția publicului țintă caruia i se adresează, această aplicație reprezintă cu succes ideea de bază care a catalizat popularizarea dispozitivelor inteligente din ultimii ani, în detrimentul dispozitivelor de tip desktop, și anume, simplitate pe toate planurile, funcții relativ reduse la număr dar puternice prin eficacitate, instalare ușoară, configurări aproape inexistente. La capitolul “User Friendliness” această aplicație ar putea obține lejer nota maximă.

Revenind la publicul țintă, Find My Device, este o aplicație care se dorește a fi un concurent direct la adresa aplicației omoloage dezvoltate de competitorul Apple, și anume ​Find my Iphone/Find my Ipad.

Panoul de control al aplicației este web-based și se poate accesa la urmatoarea adresă:

https://www.google.com/android/devicemanager?u=0

Odată conectat, utilizatorul are la dispozitie o hartă Google Maps pe care urmează a fi indicată locația propriului dispozitiv și un numar de exact 5 opțiuni posibile, care sunt

aflarea locației dispozitivului la un anumit moment dat

posibilitatea de a comanda dispozitivul să sune în cazul în care utilizatorul nu îl găsește

schimbarea de la distanță a codului de acces la dispozitiv, blocarea dispozitivului sau afisarea pe displayul dispozitivului a unui mesaj stabilit de administrator prin interfața web

ștergerea completă a conținutului în cazul în care dispozitivul este considerat pierdut sau furat

redenumirea dispozitivului

Având în vedere cele 5 facilități enumerate mai sus, este evident că acest dispozitiv nu întrunește aproape niciunul dintre criteriile care stau la baza prezentului demers și se poate considera că Find My Device este mai repede o aplicație de securitate decât una de tracking în adevăratul sens al cuvântului. De fiecare dată când utilizatorul dorește să obțină locația unui dispozitiv trebuie să solicite acest lucru manual, ceea ce constituie un mare minus în contextul studiului de față. De asemenea, nu se poate afla dacă dispozitivul este sau nu în mișcare, fapt care ne duce către concluzia inerentă că posibilitatea aflării vitezei de deplasare este exclusă.

Find My Device este, așadar, o aplicație limitată care nu a fost dezvoltată special pentru tracking. Nefiind o aplicație dedicată acestui scop, precum și faptul că prezintă neajunsurile enumerate mai sus, m-au determinat să notez faptul că această aplicație întrunește principala funcție dorită, aceea de a-și transmite propria locație GPS și cam atât, din ceea ce ne interesează.

2.2 Cerberus

Cerberus este o aplicație care din punct de vedere al funcționalității se aseamănă cu Find My Device, fiind dezvoltată ca o aplicație de găsire a dispozitivului în cazul în care este pierdut, dar include un set mai vast de opțiuni decât cea dezvoltata de Android. Aceste opțiuni, nu se incadrează neaparat printre criteriile studiului de caz, dar merită amintite pentru că pot fi utile în cazul utilizării acestei aplicații în tandem cu o aplicație de tracking dedicată. în continuare vom vedea în primul rând cât de tare Cerberus se apropie de un astfel de scop și anume, GPS tracking.

Instalarea și configurarea sunt relativ facile, dupa ce s-a instalat aplicația, se deschide o fereastra de LogIn, unde utilizatorul are opțiunea de a-și introduce numele și parola sau se poate opta pentru crearea unui cont nou, opțiune care durează mai puțin de un minut, fiind necesare doar numele utilizator ales, adresa de email și parola dorita. De menționat este faptul că odată creat acest cont în aplicația de pe dispozitivul mobil, se potate folosi același set nume/parola pentru conectarea la interfața web. Cu alte cuvinte, accountul se creează de pe tableta și se poate accesa ulterior și prin web. Acest aspect ușurează mult utilizarea aplicației și scurteaza mult timpul de la instalare până la prima funcționare a dispozitivului.

În momentul în care utilizatorul interfeței web se conectează, acesta are la dispoziție comenzile “Start tracking” și “Stop tracking”. ceea ce înseamnă că tracking-ul unui anume dispozitiv conectat la acel cont trebuie pornit manual, iar după un interval anume de timp, această funcție se dezactivează automat. Mai exact, dupa 5 minute de inactivitate, interfața web se închide automat, moment în care și funcția de tracking a dispozitivului este imediat dezactivată. Acest aspect aduce cu sine incapacitatea de a folosi funcția de tracking în fundal, pentru a păstra o istorie permanentă a rutei parcurse. În aceasta aplicație, spre deosebire de precedentă, avem totuși opțiunea de a genera un istoric al rutei parcurse într-un interval de timp selectat de utilizator.

Afișarea în timp real a vitezei de deplasare nu este însă o opțiune, la fel cum nu apare nici în rapoartele generate ulterior. Viteza de deplasare ar constitui un real plus, dar chiar și în absența acesteia, faptul că putem genera un istoric al rutei parcurse constituie un pas înainte față de Find My Device. Un alt minus, din perspectiva mea, îl constituie faptul că, deși se poate genera un istoric al rutei parcurse, acesta este unul în mod grafic, și nu oferă opțiunea translatării locațiilor în adrese reale prin Reverse Geocoding, astfel încât această colecție de informații să poată fi exportată mai apoi în format CSV sau orice alt format care poate fi manipulat în Excel sau importat într-o altă aplicație și care să conțină adrese reale, inteligibile. Consider că opțiunea de a putea genera un astfel de raport CSV ar constitui o facilitate foarte puternică. Pe de altă parte nu trebuie scăpat din vedere faptul ca această aplicație nu a fost concepută ca una de “fleet tracking”.

În figura de mai jos se poate vedea modul în care istoricul rutei este afișat.

Figura de mai sus afișează istoricul locațiilor pe o harta Google standard, putându-se opta și pentru Sattelite View dacă se dorește.

Printre funcționalitățile acestei aplicații care merită amintite se numără câteva chiar foarte utile, în ceea ce privește securitatea dispozitivului, și anume:

posibilitatea de a bloca dispozitivul de la distanță cu un cod diferit de cel prestabilit

executarea de backup de la distanță

folosirea camerei tabletei/telefonului pentru a fotografia persoana care operează dispozitivul în acel moment

afișarea unui mesaj de alertă / urgență pe ecran

efectuarea de capturi ale display-ului

ștergerea întregului conținut al tabletei / telefonului, inclusiv al cardului SD, pentru a asigura protecția informațiilor stocate pe acesta.

Backup-ul la distanță se poate realiza printr-una din cele două metode puse la dispoziție de dezvoltatorul aplicației și anume, există posibilitatea de conectare a dispozitivului cu un cont Google Drive sau Dropbox, astfel încât, în cazul pierderii sau furtului acestuia, utilizatorul poate comanda de la distanță un backup efectuat chiar într-unul dintre aceste medii de stocare cloud-based, iar apoi se poate proceda la ștergerea informațiilor de pe dispozitiv, pentru securitate. După cum menționam mai sus, aceste facilități și opțiuni de funcționare nu sunt neapărat specifice unei aplicații dezvoltate în primul rând pentru tracking de vehicule sau subcontractori anagajați în activități care implică deplasarea pe teren, cazuri în care tracking-ul în timp real reprezintă o componentă esențială a motorului logistic al afacerii.

Figura de mai jos constituie un printscreen de pe dispozitivul mobil de această dată, figură care afișează o parte din opțiunile disponibile, inclusiv cele menționate mai sus, referitoare la posibila conectare la Google Drive sau Dropbox. De asemenea se mai pot observa opțiuni oarecum neobișnuite, dar totodată nelipsite unei aplicații care se dorește a fi luată în considerare în ceea ce privește soluțiile pentru securitate, și anume “Block Power Menu” și “Block Status Bar”. Acestea permit blocarea opțiunilor de oprire / resetare a dispozitivului, precum și accesul la meniul de setări rapide. Aceste opțiuni se pot dovedi deosebit de utile în situația în care telefonul sau tableta pe care rulează aplicația ar cădea în mâini nedorite conferindu-i administratorului aflat în fața interfeței web posibilitatea de a-si minimiza / limita daunele în urma unui astfel de incident.

Toate aceste facilități amintite pe scurt mai sus nu ne duc neapărat mai aproape de soluția ideală sau completă pentru problema pe care acest studiu de caz încearcă să o rezolve, dar pot produce un alt efect, și anume unul complementar. În contextul în care tableta sau telefonul pe care am avea instalată soluția de tracking aleasă ar fi folosite în scop comercial, probabil s-ar impune securizarea dispozitivului. Este bine știut că în era informațională, foarte multe firme decid să opteze pentru soluții software ultramobile în activitatea agentilor, subcontractorilor, etc. Aceste soluții pot include acceptarea comenzilor, înregistrarea de semnături digitale de la clienți în momentul livrării produselor, etc. În acest sens, putem considera Cerberus ca pe o soluție pentru asigurarea securității dispozitivului. Pe de altă parte, această aplicație mai detine o opțiune prin care prezenta aplicație pe dispozitiv poate fi ascunsă, ceea ce îi poate permite administratorului să porneasca o monitorizare silențioasă (​silent tracking​), dacă principala aplicație de tracking este dezactivată.

Din punct de vedere al funcționalității și al facilităților oferite, această aplicație este departe de ceea ce căutam dar, dupa cum precizam anterior, poate constitui o soluție complementară, și anume securizarea dispozitivului cu posibilitatea de tracking în regim de urgență (în cazul în care principala soluție de tracking este dezactivată).

Avantaje​:

Instalare facilă, extrem de ușor de creat un nou cont

Putem obține un istoric al locațiilor

Multiple opțiuni de securitate

Înregistrare audio

Posibilitatea de silent tracking

Dezavantaje​:

Nu afișeaza viteza de deplasare

Modul de tracking trebuie activat manual și funcționează doar pe perioada în care utilizatorul este logat la interfața web

Istoricul locațiilor nu poate fi exportat intr-un format care sa conțină adrese fizice în mod CSV

Necesită abonare separată

Reluând ideile expuse anterior, concluzionez că Cerberus poate fi mai degrabă o soluție de scuritate, decât una de tracking dar consider în continuare că poate constitui o alternativă în cazuri extreme, pentru perioade scurte de timp.

Aplicația Cerberus a fost descărcată de peste 1.000.000 de utilizatori de pe platforma Google Play și are nota 4.4 din peste 98.000 de recenzii, ceea ce dovedește faptul că aplicația se bucură de notorietate și este un produs a cărui funcționalitate nu lasa de dorit.

2.3 Glympse

Glympse oferă inclusiv o variantă pentru business, despre care nu există, însă, foarte multe detalii pe site-ul companiei, în afara unui număr de telefon la care potențialii clienți pot apela departamentul de vânzări al companiei. Pentru scopul acestui studiu de caz, pe parcursul acestei lucrări, ne vom referi în continuare la varianta gratuită a acestei aplicații.

Glympse este o aplicație extrem de ușor de instalat de pe platforma Google Play și totodată extrem de ușor de utilizat. Ușurința în instalare este observată imediat prin faptul că nu necesită crearea unui cont online și nici autentificarea cu un cont creat în prealabil pe un dispozitiv desktop sau într-un browser web. Aplicația se instalează ușor, dupa ce este descărcată din Google Play. Instalarea se face automat, iar când aceasta este completă, utilizatorul trebuie doar să o pornească și din acel moment o poate utiliza fără niciun fel de configurare suplimentară, întrucât la instalare aplicația cere permisiunea să acceseze aproximativ toate resursele tabletei, atât hardware, cât și software, necesare funcționării. Printre acestea se numără accesul la componenta GPS, la contacte, la identitate și la conturile la care utilizatorul este deja conectat, în vederea transmisiei locației, după cum se poate observa în figura de mai jos.

Aplicația este relativ flexibilă în ceea ce-l privește pe utilizatorul dispozitivului pe care aceasta se instalează. Acesta oferă posibilitatea de a opta pentru afișarea vitezei, pentru a folosi sistemul metric sau pe cel standard, pentru a introduce destinația înspre care se îndreaptă și, mai ales, de a permite aplicației să se conecteze la contul său de Facebook sau Twitter, printre altele. Aceste opțiuni aduc cu sine o ușurință și mai mare în utilizarea aplicației, având în vedere că transmiterea informației către destinatari urmează a se face prin intermediul contului de email, Facebook, Twitter sau altele la care utilizatorul este conectat. Meniul de opțiuni are o interfață simplă, curată, nu este încărcat cu informații sau opțiuni care nu sunt necesare, este foarte intuitiv și ușor de folosit de către un utilizator amator, ceea ce nu putem spune neapărat și despre Cerberus. Aplicația prezentată anterior are câteva opțiuni puternice de altfel, dar care necesită cunoștinte relativ avansate de utilizare a dispozitivelor mobile pentru a putea fi utilizată pe deplin de către utilizatorul final. Meniul de opțiuni al aplicației Glympse poate fi observat în figura de mai jos.

Ușurința instalării și faptul că nu necesită crearea unui cont, chiar aceste aspecte care, fără îndoiala, au participat la popularizarea aplicației sunt și cele care constituie neajunsuri din perspectiva mea, având în vedere soluția “de nișă” pe care o caut.

În varianta gratuită, aplicația este extrem de simplu de folosit, utilizatorul poate selecta opțiunea “Share Location” din Meniu, iar apoi este afișată o activitate care prezintă 4 opțiuni:

Destinatarii cărora urmează să le fie dezvăluita locația utilizatorului

Perioada de timp pentru care locația să fie disponibilă

Se poate atașa un mesaj către destinatari

Se poate selecta o destinație finală.

După ce se selectează aceste opțiuni, în momentul în care se apasă comanda Send aflată în partea din dreapta-sus a displayului, se generează un link unic și dispozitivul începe să își transmită poziția și, după caz, viteza, sau alte informații selectate din meniul de opțiuni, către un server al dezvoltatorului aplicației. Informațiile sunt transmise pe toată perioada de timp selectată de către utilizator sau până în momentul ajungerii la destinație, dacă această opțiune a fost selectată. Apoi, utilizatorul trimite acel link unic generat de aplicație către destinatarii care sunt invitați să urmarească poziția utilizatorului. De notat este faptul că acel link se poate transmite prin Facebook, Twitter, email, mesaj text, sau se poate copia în clipboard-ul dispozitivului și se poate trimite prin orice altă aplicație care suportă funcția de messaging. Un aspect important îl constituie faptul că oricine intra în posesia acelui link pe perioada în care acesta este activ și poate vedea toate informațiile făcute publice de către utilizatorul care a generat acel link. Figura de mai jos reprezintă un screenshot al activității cu cele 4 opțiuni și butonul de Send în dreapta, sus.

Glympse este o aplicație care prezintă mult mai multe opțiuni decât cele testate anterior, printre acestea fiind viteza de deplasare, posibilitatea de a transmite mesaje și opțiunea de a specifica destinația înspre care se indreaptă utilizatorul. Acestea reprezintă reale plusuri în raport cu celelalte aplicații, însă am constatat un mare minus în ceea ce privește modul în care aplicația este concepută.

După cum reiese și din explicarea caracteristicilor asupra cărora am insistat mai sus, funcționalitatea acesteia este una oarecum inversă unei aplicații clasice de tracking, și anume, utilizatorul care urmărește dispozitivul prin interfața web sau prin intermediul unui alt dispozitiv mobil este, de fapt, clientul, și nu invers. Posesorul dispozitivului este cel care hotărăște momentul în care dorește să facă publică unuia sau mai multor clienți locația sa, hotărăște durata pe parcursul căreia aceste informații sunt publice, și le poate opri oricând prin intermediul opțiunilor din meniul aplicației.

Am constatat că aplicația este una robustă, simplă și extrem de funcțională, fapt pentru care se și explică atât cele peste 5 milioane de descărcări de pe platforma Google Play, cât și nota 4.5 din cele aproape 100,000 de recenzii ale utilizatorilor. Totodată am constatat că această aplicație nu oferă posibilitatea unui așa numit administrator de grup să urmarească permanent activitatea mai multor dispozitive în timp real. Acest lucru este posibil doar pentru o perioadă limitată, la inițiativa utilizatorului dispozitivului mobil. Cred că se poate afirma că în scenariul propus la începutul acestui studiu clientul ar trebui să fie utilizatorul mobil și nu invers, așa cum se întâmplă în cadrul aplicației Glympse.

Concluzii

Primele criterii – notă utilizatori (user rating, număr recenzii și număr de instalări) sunt informații preluate direct de pe platforma Google Play, iar pentru a evalua ultimele 4 caracteristici, am considerat un sistem de notare de la 1 la 5, unde 5 este cea mai mare notă, iar 1 cea mai mică. Spre exemplu, la ușurința de instalare, nota 1 ar însemna o instalare foarte dificilă, pe când nota 5 presupune o instalare rapidă și ușoară. în mod similar am evaluat și ușurința de utilizare, funcționalitatea și interfața grafică.

Am evaluat aplicațiile, după cum precizam mai sus, având în vedere 4 criterii care se pot dovedi subiective. În fond, această evaluare nu se dorește a fi una obiectivă, întrucât criteriile stabilite la începutul evaluării sunt ele însele subiective. O aplicație foarte bine construită poate avea sau nu o anumită funcționalitate cerută de utilizator. Absența unei astfel de funcții sau opțiuni aduce cu sine, implicit, o nota mai mică.

1. Find My Device este o aplicație extrem de simplă care face foarte bine un singur lucru din cele care ne interesează, și anume afișează în timp real locația dispozitivului. Nu există probleme de compatibilitate, aplicația fiind dezvoltată de Google și afișând rezultatele pe o hartă Google. Din cele 7 criterii de evaluare, primele 3 sunt implicite, valorile acestora în toate cazurile fiind luate direct de pe Google Play.

Ușurință Instalare: 5 – aplicația se instalează foarte ușor și recunoaște contul Google la care este conectată tableta, astfel încât utilizatorul trebuie doar să-l confime sau să aleagă altul, dacă dorește, după instalare.

Ușurință Utilizare: 5 – Utilizarea este extrem de facilă, dat fiind faptul că setările sunt practic inexistente, utilizatorul neavând acces la nicio opțiune. Tocmai absența opțiunilor îi conferă aplicației un grad de ușurința extrem de ridicat în utilizare.

Funcționalitate: 2 – Principalul criteriu pe care l-am urmărit prin prisma cerințelor problemei; din cele cerute, această aplicație transmite locația curentă a dispozitivului și nimic altceva. Din acest motiv, am considerat că la acesta aspect aplicația merită nota 2 din 5.

Interfața Grafică: 5​ – Aici am notat practic interfața grafică a Google Maps.

Cerberus prezintă numeroase alte funcții pe lângă transmiterea locației GPS dar multe dintre ele sunt altele decât cele specificate în criteriile de la începutul studiului.

Ușurință Instalare: 4 – Utilizatorul are nevoie de un cont la instalare. Dacă nu are, își poate crea, dar acesta trebuie să existe.

Ușurință Utilizare: 3 – Prezintă setari și opțiuni care se pot dovedi problematice pentru utilizatorul final, dacă acesta nu este unul experimentat.

Funcționalitate: 3 – Funcția de tracking trebuie activată manual, transmite istoricul pozițiilor dar nu transmite viteza de deplasare, nu oferă opțiune de export al istoricului.

Interfața Grafică: 4 – aplicația folosește harta Google Maps dar dezactivează opțiunea de a mări sau micșora harta cu funcția de scroll a mouse-ului.

Glympse este o aplicație bună, special concepută pentru tracking. Nu prezintă totuși avantajele scontate întrucât permite utilizatorului să oprească funcția de transmitere a locației.

Ușurință Instalare: 5 – Instalare extrem de facilă, aplicația nu necesită niciun cont suplimentar.

Ușurință Utilizare: 5 – Foarte ușor de configurat, interfață intuitivă, aspect curat.

Functionalitate: 3 – Transmite poziția în timp real, viteza de deplasare și istoricul locațiilor, dar pune aceste funcționalități în totalitate sub controlul utilizatorului tabletei sau telefonului.

Interfața Grafică: 5 – Interfața este asigurată de către Google Maps, include opțiunea de afișare a traficului în timp real.

În concluzie, toate cele 3 aplicații testate în prezentul studiu folosesc funcțiile GPS furnizate de mediul Android. Însă nici una dintre acestea nu constituie o soluție de sine stătătoare la problema enunțată, dat fiind faptul că fiecare dintre ele prezintă deficiențe constructive. De exemplu, viteza de deplasare, care este un aspect absolut important pentru scopul unei asemena aplicații, lipsește la 2 din cele 3 aplicații testate, iar singura aplicație care prezintă această funcționalitate nu îndeplinește alte cerințe esențiale.

Există pe piață furnizori de soluții de tracking și fleet management, care dispun de infrastructura dedicată pentru astfel de soluții și au dezvoltat aplicații pentru astfel de scopuri, însă aceste soluții pot deveni extrem de costisitoare, iar obiectul acestui studiu presupunea găsirea unei soluții gratuite sau extrem de accesibile, pentru firme de dimensiuni mici, sau întreprinzători care sunt la început de drum și, implicit, dispun de un buget limitat. Având în vedere că toate dispozitivele Android conțin funcția de localizare prin GPS și că Google pune la dispoziție acces la sistemul lor de hărți în mod gratuit, pentru utilizatori cu un număr rezonabil de interogări pe zi, am considerat că pot găsi sau implementa o soluție care să reducă sau chiar să minimizeze costurile recurente ale unui astfel de utilizator, cu resurse limitate.

În continuare, am decis implementarea unui astfel de sistem, în care utilizatorul dispozitivului Android instalează aplicația, iar aceasta transmite poziția și viteza către o bază de date aflată pe un server web. Aplicația nu se dorește a fi o soluție completă sau profesională, însă propune o soluție functională, în jurul căreia se pot dezvolta în continuare alte aspecte sau facilități. În continuare sunt elaborate câteva principii constructive si metode care au fost aplicate in dezvoltarea aplicației.

Capitolul 3 – Proiectarea și implementarea aplicației

În dezvoltarea aplicației m-am axat pe două mari componente:

aplicația mobilă

aplicația web

Aplicația mobilă are ca scop transmiterea locației unui utilizator mobil, pe când aplicația web are ca scop oferirea unei priviri de ansamblu asupra localizării tuturor utilizatorilor mobili(client) pe hartă.

Ambele aplicații vor utiliza aceeași bază de date, aplicația mobilă pentru a introduce coordonatele șoferilor în baza de date, iar aplicația web pentru a extrage aceste informații și a le afișa în browser. Ca urmare a acestui fapt, proiectarea bazei de date a fost primul pas în dezvoltarea aplicației. La rândul ei, extinderea și normalizarea bazei de date se va face pe parcurs, odată cu creșterea numărului de utilizatori. Într-o primă variantă, baza de date conține o singură tabelă, cu toate informațiile șoferilor, urmând ca în următoare iterație să creez o tabelă separată doar pentru datele șoferilor și să fac legătura cu tabela care conține informațiile legate de traseu. Câmpurile din tabela creată sunt cele din figura de mai jos:

3.1 Dezvoltarea aplicației mobile

Aplicația mobilă dezvoltată se numește UniTracer. În continuare, de fiecare dată când ne vom referi, în cadrul acestui proiect, la această aplicație in particular, ne vom referi la UniTracer.

Toate resursele Java pentru acest proiect sunt stocate în folderul ​\java​, în pachetul ​com.unitracer​.

Pentru dezvoltarea aplicației mobile am folosit mediul de dezvoltare Android Studio care la ora actuală este soluția standard pentru dezvoltarea de aplicații Android. Proiectele Android sunt structurate într-o anume ierarhie. Fișierul AndroidManifest.XML conține pe lângă alți parametri ai aplicației și punctul de pornire al acesteia, punct care indică activitatea care urmează să fie rulată în momentul în care aplicația este lansată. Acest fișier este localizat în următoarea locație: \app\src\main\AndroidManifest.XML​. Structura fișierelor în cadrul proiectului se poate observa în imaginea de mai jos.

Resursele interfeței grafice sunt localizate în folderul “​\src\main\res\layout​”, acestea fiind scrise in XML. Android Studio conține și un editor vizual pentru interfața grafică, având opțiunea de a comuta din modul vizual în modul text foarte rapid. Fiecărei activități îi corespunde o schemă (layout) care descrie elementele grafice și de interacțiune cu utilizatorul, modul în care acestea sunt dispuse, cum sunt aliniate, precum și funcționalitatea lor. De asemenea, fiecărei activități îi corespunde o clasă Java care conține logica execuției activității respective. Fiecare activitate a aplicației are un layout XML și un fișier Java. Fișierele Java se află într-un pachet, în folderul “​\app\src\main\java​”.

Aceste fișiere XML și Java sunt conectate între ele, corespondența lor fiind stabilită în manifestul aplicației, AndroidManifest.XML, după cum se poate vedea mai jos.

În tag-ul <application/> primele declarații stabilesc parametri de funcționare (posibilitatea de backup), ​android:icon indica pictograma aplicației când este instalată pe dispozitivul mobil și care totodată este asociată aplicației când aceasta este publicată in Google Play Store. Aceasta, conform declarației se află în folderul ​res\drawable ​și este un fișier imagine cu numele ic_launcher. De menționat este faptul că există mai multe foldere ​res\drawable​, fiecare dintre ele conținând un sufix care indică resursele conținute in funcție de rezoluția displayului de pe dispozitivul pentru care este concepută aplicația. Structura acestor foldere arată în felul urmator:

Dacă aplicația este instalată pe dispozitive cu rezoluții diferite, sistemul va scala resursele pentru rezoluția nativă a dispozitivului, însă oferă totodată dezvoltatorului opțiunea extrem de facilă pentru a optimiza interfața grafică in funcție de fiecare familie de display-uri in parte. Spre exemplu, s-ar putea ca un dezvoltator să vrea să utilizeze diferit spațiul vizual al aplicației când aceasta rulează pe o tabletă cu display de 10”, față de situația când aceasta este instalată pe un telefon cu display de 4”. În acest scop, sunt puse la dispoziție aceste foldere, astfel încât resursele grafice să fie personalizate pentru fiecare familie de display-uri separat, sufixurile “hdpi”, “mdpi”, “xhdpi “, “xxhdpi” indicând fiecare categoria de resurse grafice pe care le contine folderul respectiv.

Declarația ​android​:label=​"@string/app_name" indică numele aplicatiei, asa cum urmează sa fie identificată pe telefon sau tabletă, odată instalată, precum și în Google Play Store. Numele efectiv este stocat în fișierul strings.xml, impreună cu definiții ale altor resurse în mod text. Toate acestea sunt definite in strings.xml, in folderul ​\app\src\main\res\values​.

Declarația ​android​:theme=​"@android:style/Theme.Light.NoTitleBar" indică​ tematica grafică pe care aplicația o va folosi pentru ferestre, meniuri și butoane.

Declarația ​<​action ​android​:name=​"android.intent.action.MAIN" ​/> din cadrul primului tag de tip <activity/> semnalează că această activitate este punctul de pornire a aplicației atunci când este lansată în execuție.

Fiecare aplicație Android conține în mod obligatoriu cel puțin o activitate. În funcție de ce funcționalități oferă aplicația respectivă, poate avea mai multe activități care sunt apelate în funcție de ce selectează utilizatorul sau în funcție de cum decurge execuția. Numai o activitate poate fi activă la un moment dat, existând un așa numit ​Activity_Lifecyle​, ilustrat foarte bine în imaginea de mai jos. În momentul în care o anume activitate este lansată, este automat apelată o secvență de metode în ordinea sugerată de schema ​Activity_Lifecycle​, și anume, mai întâi este apelată metoda onCreate​(), urmata de metoda ​onStart​() si apoi ​onResume​(), urmând ca apoi aplicația să fie activă și în prim plan.

Se poate observa în schemă că dacă sistemul afișează un mesaj de alertă sau o notificare cu prioritate mai mare apare în prim plan, activitatea curentă trece în fundal, chiar dacă este încă vizibilă, moment în care este automat apelată de către sistem metoda ​onPause​(). O observație care merită notată aici este faptul că, odată ce activitatea intră în aceasta stare, dacă sistemul decide că trebuie sa elibereze memorie pentru alte procese cu prioritate mai ridicată, acesta poate decide oprirea completă a activității, caz în care orice date sau informații obținute în urma evoluției activității vor fi pierdute, dacă nu sunt salvate în prealabil. Acesta este motivul pentru care, de obicei, dezvoltatorii de aplicații aleg să implementeze la începutul acestei metode instrucțiuni de salvare a informațiilor pe care activitatea le prelucrează pe suportul de stocare al dispozitivului. De reținut de asemenea că, dacă este vorba de cantități relativ mari de informații, se recomandă salvarea acestora concomitent cu derularea aplicației pentru a se proteja integritatea lor și pentru a nu încetini dispozitivul în momentul în care sunt afișate alerte de către sistem.

Metoda ​onStop​() este apelată atunci când activitatea nu mai este vizibilă, de exemplu când utilizatorul navighează către o altă aplicație sau atunci când apasă pe butonul ​Home​. Metoda onDestroy​() este apelată când activitatea este fie oprită prin comanda din interiorul aplicației, fie când sistemul decide să o termine pentru a elibera memorie.

Activitatea principală, care este pornită din oficiu, când aplicația este lansată în execuție este Splash_activity​, implementată în fișierul Splash_activity.java. In cadrul acestei clase este de asemenea implementată o altă clasă ​MyReceiver care extinde clasa ​BroadcastReceiver​(), care este o clasa din pachetul ​android.content​. Aceasta clasa implementeaza metode pentru receptionarea intent-urilor trimise prin sendBroadcast(intent). În cadrul UniTracer, acestea sunt implementate în clasa MyLocationListener si sunt explicate mai jos.

{

@Override public void ​onReceive(Context context, Intent intent) {

​// ​TODO Auto-generated method stub

​String action = intent.getAction();

Această clasă suprascrie metoda onReceive(Context context, Intent intent), în implementare stocând informațiile primite prin parametrul ​intent ​în variabila ​action​, apoi se verifică dacă intent-ul conține String-ul “Hello.World”, care este de fapt o constantă transmisă ca parametru atunci când intent-ul a fost creat în cadrul clasei LocationService; declarația acesteia este prezentată în codul de mai jos.

Apoi, prin urmatoarele linii de cod,

latitute​=intent.getExtras().getString(​"Latitude"​);

longitude​=intent.getExtras().getString(​"Longititude"​);

sunt extrase din intent informațiile care conțin latitudinea și longitudinea locației geografice transmise, prin metoda getExtras().getString. Informațiile sunt stocate în intent sub forma unor perechi de genul (key, value), unde key-ul este un text (in acest caz ​"Latitude" sau ​"Longitude",​ iar valorile returnate sunt de tip String, pentru ca au fost salvate ca String atunci când au fost puse în intent (vezi pagina 36), clasa MyLocationListener.

Pentru reprezentarea locațiilor geografice, sistemul Android pune la dispoziție clasa numită Location​, din pachetul ​android.location​. Obiectele generate de aceasta clasă pot conține atribute opționale cum ar fi direcția, altitudinea, viteza și altele, dar conțin în mod obligatoriu latitudinea, longitudinea și un timestamp (data + ora). Clasa ​LocationManager din același pachet furnizează accesul la servicii sistem prin care se poate actualiza automat locația dispozitivului sau se pot emite comenzi de tip Intent pentru ca actualizarea poziției geografice să fie posibilă și dacă activitatea a fost distrusă. Acest lucru se poate face printr-un serviciu ​sendBroadcast​() care primește ca argument un obiect de tip Intent.

Aceasta metodă a fost aleasă pentru monitorizarea modificării locației în orice moment, prin clasa ​MyLocationListener care implementează interfața ​LocationListener prezentă în același pachet ​android.location. Din cele 4 metode impuse de interfață, ​onLocationChanged​() este cea care implementeaza soluția, în codul de mai jos:

Întrucât clasa MyLocationListener implementează interfața LocationListener, ea trebuie să ofere o implementare pentru toate cele 4 metode din interfață (​onLocationChanged, onProviderDisabled, onProviderEnabled, onStatusChanged).​ În cazul de față, doar metoda onLocationChanged conține cod util, următoarele două afișând doar mesaje când sunt apelate, iar ultima este goală pentru că nu este apelată nicăieri.

Instructiunile de tip Log,

Log.​d​(​"lat////"​,​""​+loc.getLatitude());

Log.​d​(​"long////"​,​""​+loc.getLongitude());

sunt folosite strict pentru depanarea codului, afisand mesaje în consolă, utile în faza de dezvoltare a codului pentru detectarea erorilor. Pentru eventuale ulterioare iterații, am decis sa nu le înlătur din cod, deși inlăturarea acestora nu ar avea impact asupra funcționării aplicației.

Se poate observa că metoda onLocationChanged​ ​() apelează o metodă care returnează o valoare de tip boolean,​ isBetterLocation​ ​(Location​ ​, Location​​),​ metodă care primește doi parametri de tip Location, pe care apoi îi compară. Primul parametru care îi este adresat este locația care tocmai a fost primită, iar cel de-al doilea parametru conține ultima locație care a fost salvată. Aceste doua variabile sunt comparate, iar dacă cea primită mai recent are un timestamp mai recent, sau o poziție de o acuratețe mai mare, locația nouă este salvata și este totodată considerată ultima locație validată; următoarea valoare va fi comparată cu aceasta din urmă. În această situație metoda returnează valoarea true​ .​ Codul acestei metode este mai jos, această idee fiind preluata de pe site-ul oficial al dezvoltatorilor Android, de la aceasta locație:

https://developer.android.com/guide/topics/location/strategies.html

protected boolean ​isBetterLocation(Location location, Location currentBestLocation) {

​if ​(currentBestLocation == ​null​) {

​// A new location is always better than no location

​return true​;

}

​// Check whether the new location fix is newer or older

​long ​timeDelta = location.getTime() – currentBestLocation.getTime();

​boolean ​isSignificantlyNewer = timeDelta > ​TWO_MINUTES​;

​boolean ​isSignificantlyOlder = timeDelta < -​TWO_MINUTES​;

​boolean ​isNewer = timeDelta > ​0​;

​// If it's been more than two minutes since the current location, use the new location

// because the user has likely moved // PC:

​if ​(isSignificantlyNewer) {

​return true​;

​// If the new location is more than two minutes older, it must be worse

​} ​else if ​(isSignificantlyOlder) {

​return false​;

}

​// Check whether the new location fix is more or less accurate

​int ​accuracyDelta = (​int​) (location.getAccuracy() – currentBestLocation.getAccuracy());

​boolean ​isLessAccurate = accuracyDelta > ​0​;

​boolean ​isMoreAccurate = accuracyDelta < ​0​;

​boolean ​isSignificantlyLessAccurate = accuracyDelta > ​200​;

Am considerat că metoda de mai sus este una extrem de eficientă, aceasta ajutând la asigurarea integrității datelor transmise. În primul rând se verifică dacă coordonatele primite au fost obținute mai recent decât precedentele, ceea ce este important, asigurându-se astfel secvențialitatea rutei reconstruite de către aplicația web. De asemenea, poziția obținută prin rețeaua celulară poate prezenta abateri de la poziția exactă, deși se obține o poziție inițială mai rapidă, iar dacă următoarea poziție este obținută prin satelit, aceasta poate fi mai exactă decât prima. De asemenea, pachetul android.location conține metode pentru verificarea felului în care locația a fost obținută și numele furnizorului, astfel încât se poate opta între diferiți furnizori, în funcție de ce criterii dorește utilizatorul a fi implementate.

protected void ​onCreate(Bundle savedInstanceState) {

​super​.onCreate(savedInstanceState); setContentView(R.layout.​create_account​);

​login_username ​= (EditText) findViewById(R.id.​login_username​); ​name​=login_username​ ​.getText().toString();

​login_password ​= (EditText) findViewById(R.id.​login_password​); password​ =​ login_password​ .getText().toString();​

​login_email =​ (EditText) findViewById(R.id.login_email​ ​); ​email​=​login_email​.getText().toString();

​login_submit_button ​= (Button) findViewById(R.id.​login_submit_button​);

​gps ​= ​new ​GPSTracker(Create_account_activity.​this​);

​// check if GPS enabled

​if ​(​gps​.canGetLocation()) {

​latitude ​= ​gps​.getLatitude();

​longitude ​= ​gps​.getLongitude();

​slatitude =​ "" ​ +​ latitude​ ;​

​slongitude =​ "" ​ +​ longitude​ ;​

​geocoder ​= ​new ​Geocoder(Create_account_activity.​this​, Locale.​getDefault​()); ​try ​{

​addresses ​= ​geocoder​.getFromLocation(​latitude​, ​longitude​, 1​ )​ ;

​if ​(​addresses.isEmpty()) {​

Toast.​makeText​(Create_account_activity.​this​, ​"waiting for the location"​,

Toast.​LENGTH_SHORT​).show();

text_location.setText(​"Unable to fetch your location"​); } else ​ {​

​if ​(​addresses​.size() > ​0​) {

​address ​= ​addresses​.get(​0​).getAddressLine(​0​);

​city ​= ​addresses​.get(​0​).getLocality();

​state ​= ​addresses​.get(​0​).getAdminArea();

​loc ​= ​address +​ "," ​ +​ ​city +​ "," ​ +​ state​ ;​

Log.​d​(​"location is////"​, ​"" ​+ ​loc​);

}

}

} ​catch (​ IOException e) {

​// ​TODO Auto-generated catch block

​e.printStackTrace();

}

}

​login_submit_button​.setOnClickListener(​new ​OnClickListener() {

​@Override

​public void ​onClick(View arg0) {

// ​ ​TODO Auto-generated method stub

​name ​= ​login_username​.getText().toString();

​password ​= ​login_password​.getText().toString(); ​email ​= ​login_email.getText().toString();​

​email_pattern ​= "[a-zA-Z0-9._-]+@[a-z]+​ \\​ .+[a-​ z]+";​

​if (​​name ​== ​"" ​|| ​password ==​ "" ​​|| ​email ​== ​""​) {

Toast.​makeText​(Create_account_activity.​this, ​​"Please fill all the mandatory fields."​, Toast.​LENGTH_SHORT​).show(); } else if ​ (!​ email​ .matches(​ email_pattern​ ))​ {

Log.​d​(​"inside", ​ "email"​ )​ ;

Toast.makeText​ ​(Create_account_activity.​this​, ​"Invalid Email address"​, Toast.​LENGTH_SHORT​).show();

} else ​ {​

//

​if ​(!Utils.​isNetworkAvailable​(Create_account_activity.​this​)) {

Toast.​makeText​(Create_account_activity.this​ , ​ "Pls check your internet​ connection"​, Toast.​LENGTH_SHORT​).show();

} ​else ​{ loadData();

}

//

​} }

});

Mai sus este parte din implementarea clasei Create_account_activity. Ca in cazul oricărei activități Android, prima metoda apelata este onCreate(Bundle​ savedInstanceState).​ Parametrul savedInstanceState conține starea prealabila a activității, dacă aceasta a mai rulat în trecut și a fost oprita de către utilizator sau de către sistem în timp ce rula în fundal; odată repornită, aceasta își încarcă ultima stare salvată.

Se poate observa ca se apelează metoda onCreate a superclasei Activity pe care aceasta o moștenește, iar apoi este setat suportul grafic prin instrucțiunea

setContentView(R.layout.​create_account​);

Apoi sunt declarate câmpurile pentru login_username, login_password si login_email, acestea fiind de tipul EditText, care este o clasa din packetul ​android.widget​. Butonul ​Submit este de tipul Button, și aceasta făcând parte din același pachet, fiind subclase ale android.widget.TextView​, care la rândul ei este subclasa a ​android.widget.View​.

super​.onCreate(savedInstanceState); setContentView(R.layout.​create_account​); login_username ​= (EditText) findViewById(R.id.​login_username​); login_password ​= (EditText) findViewById(R.id.​login_password​); login_email ​= (EditText) findViewById(R.id.​login_email​);

login_submit_button ​= (Button) findViewById(R.id.​login_submit_button​);

Metoda findViewById este o metoda a clasei View, și returnează implicit un obiect de tip View, ceea ce înseamnă că pentru a identifica un anume obiect de tip EditText sau Button, ca în codul de mai sus și a-i atribui o valoare, obiectul returnat de metodă trebuie convertit prin operatorul ​cast​ la tipul corespunzător. În cazul nostru (EditText) sau (Button).

În continuare, este implementata logica butonului Submit printr-un Listener. Această implementare conectează Listener-ul la buton prin metoda ​setOnClickListener() care, după cum se vede în codul de mai jos, implementează interfața OnClickListener printr-o clasa anonimă care implica o singură semnatură de metodă abstractă, și anume ​onClick()​:

loadData();

}

//

​} }

});

În cadrul acestei metode, sunt atribuite valorile citite din formularul de logare în variabilele name​, ​password​, ​email​, care sunt declarate de tip String la începutul clasei Create_account_activity​. Metoda prin care această operațiune este implementată este ​getText() iar apoi valoarea este convertita la tipul String() cu metoda ​toString()​. Apoi urmează un algoritm de validare a datelor introduse care folosește operatorul “||” (Sau Logic ) pentru a valida ca nu a rămas niciun câmp necompletat, în caz contrar se afișeaza o notificare (Toast) prin metoda Toast.makeText(). De asemenea este implementata și logica de verificare a adresei de email, dacă aceasta este în format corespunzător, adică ​text + @ + text.text​. Aceasta este implementata în următoarele doua linii de cod, se definește o variabilă ​email_pattern​, cu care apoi valoarea continută în variabila ​email este comparată prin metoda ​matches() ​care returnează o valoare de tip boolean.

email_pattern ​= ​"[a-zA-Z0-9._-]+@[a-z]+​\\​.+[a-z]+"​; if ​(​name ​== ​"" ​|| ​password ​== ​"" ​|| ​email ​== ​""​) {

Toast.​makeText​(Create_account_activity.​this​, ​"Please fill all the mandatory fields."​, Toast.​LENGTH_SHORT​).show();

} ​else if ​(!​email​.matches(​email_pattern​)) {

Log.​d​(​"inside"​, ​"email"​);

Toast.​makeText​(Create_account_activity.​this​, ​"Invalid Email address"​, Toast.​LENGTH_SHORT​).show();

Dacă acestea nu corespund, este afișat mesajul “Invalid Email Address”. În caz contrar, execuția merge mai departe și se verifica conexiunea la internet prin metoda

Utils.isNetworkAvailable()​. Daca nu exista conexiune la internet se afișeaza un mesaj de eroare, altfel, se apelează metoda loadData() care pornește un proces asincron implementat prin clasa AsyncLoadData, care moștenește clasa AsyncTask. Aceasta este folosită pentru procesul de logare și durează un interval relativ redus de timp. AsyncTask se pretează pentru astfel de operațiuni. Se recomandă folosirea acestei clase atunci când operațiunile pe care le implementează sunt de durată relativ redusă, de maximum câteva secunde. În astfel de situații, când se lucrează cu interfața grafică se recomandă folosirea de procese asincrone deoarece rulează în paralel cu firul de execuție în care rulează interfața grafica și nu sacadează sau nu afectează fluiditatea interfeței grafice. Totuși, în cazul în care se dorește implementarea cu fire de execuție a căror durata de viata este preconizata la mai mult de câteva secunde, se recomanda implementarea cu ajutorul claselor ​Handler sau Thread​. Thread este o clasa nativa Java și face parte din pachetul ​java.lang iar Handler este implementată în Android, face parte din pachetul de baza a sistemului de operare, ​android.os​.

Aplicatia conține mai multe procese asincrone, întrucât, după cum precizam mai sus, sunt lansate servicii care implementează algoritmii de localizare și care functionează în background indiferent de starea curenta a activităților aplicației, deoarece acestea trebuie să transmită indiferent de activitatea utilizatorului, atât timp cât există acces direct la semnalul GPS prin sateliți sau la serviciile de localizare prin rețeaua celulară, cât și conexiune la internet.

3.2 Utilizarea aplicației mobile

În momentul în care aplicația este pornită, utilizatorul are opțiunea de a-și crea un cont, informațiile care trebuiesc introduse rezumându-se doar la nume, adresă de email și setarea unei parole. Interfața acestei activități este foarte simplă, intuitivă și nu prezintă dificultăți de utilizare. Ea este afișată în imaginea de mai jos. După ce utilizatorul și-a introdus datele de conectare, aplicația afișează poziția dispozitivului pe harta GoogleMaps, opțiunile fiind extrem de limitate, întrucât scopul aplicației, în aceasta formă prevede strict opțiunea de tracking a locației într-o aplicație web.

În imaginea de mai jos este prezentată poziția dispozitivului pe GoogleMaps, după ce utilizatorul s-a conectat.

3.3 Dezvoltarea aplicației web

Pentru dezvoltarea aplicației web am avut nevoie de un server web, de PHP și MySQL și am considerat XAMPP (​https://www.apachefriends.org/index.html​), un pachet de programe cu sursă deschisă, ca fiind cea mai rapidă și mai facilă soluție pentru a obține un server local, fără cunoștințe de instalare și configurare de servere. Pașii sunt simpli, descărcarea unei arhive, dezarhivarea ei și instalarea programelor. Prin câteva click-uri am obținut un server web cu PHP și un server de baze de date.

Pentru dezvoltarea aplicației web am folosit Codeigniter (https://codeigniter.com/), un framework PHP care permite construirea de aplicații web dinamice, bazându-se pe modelul MVC (model-view-controller) care realizează separarea logicii de interfața grafică. Codeigniter vine cu o serie de clase și modele gata implementate pentru a realiza câteva dintre acțiunile de bază într-o aplicație web mobilă, cum ar fi partea de înregistrarea utilizatorilor, gestionarea sesiunilor și conectarea la baza de date. Dacă, la o primă privire, pare destul de greu de utilizat, există o destul de vastă documentație (https://www.codeigniter.com/docs) și tutoriale online, care permit eficientizarea procesului de învățare. Framework-urile gen codeigniter micțorează considerabil perioada în care se poate obține o aplicație web dinamică față de varianta în care s-ar dezvolta totul de la zero.

Alicația we presupune existența unei hărți pe care să fie vizibile toate caminoanele, cu posibilitatea de a da click pe marker și de a afla nume șoferului, viteza și locația în care se află. Figura de mai jos prezintă implementarea acestei interfețe.

Pentru a desena harta în pagină se folosește API-ul oferit gratuit de Google și apelat la începutul paginii, prin următoarele linii de cod:

Toate semnele de marcaj (pin​ ​-urile) de pe hartă reprezintă locațiile transmise de dispozitivele Android și salvate apriori în baza de date. Primul pas este introducerea hărții în pagina web, urmată de desenarea punctelor de marcaj și de redesenarea (reflesh) lor la un anumit interval de timp. Toate acestea sunt realizate prin intermediul funcției load()​ ​, care conține următorul cod JavaScript:

function load() {

var map = new google.maps.Map(document.getElementById("map"), { center: new google.maps.LatLng(41.6864807,-87.6285099), zoom: 4, mapTypeId: 'roadmap'

}); var infoWindow = new google.maps.InfoWindow;

// Change this depending on the name of your PHP file downloadUrl("<?=base_url("admin/map_salesrep/getcoordinates")?>", function(data) { var xml = data.responseXML;

var markers = xml.documentElement.getElementsByTagName("marker"); for (var i = 0; i < markers.length; i++) { var name = markers[i].getAttribute("name"); var address = markers[i].getAttribute("address"); var type = markers[i].getAttribute("type"); var point = new google.maps.LatLng( parseFloat(markers[i].getAttribute("lat")), parseFloat(markers[i].getAttribute("lng"))); var html = "<b>" + name + "</b> <br/>" + address; var icon = customIcons[type] || {}; var marker = new google.maps.Marker({ map: map, position: point, icon: icon.icon }); bindInfoWindow(marker, map, infoWindow, html);

}

});

}

În prima parte a metodei se crează obietul map​ ​, de tipul google.maps.Map,​ ​care este utilizat pentru a stabili următoarele:

poziția în care va fi incărcată harta în pagina, prin intermediul metodei getElementById("map") – caută în pagina HTML tag-ul cu id-ul map și în interiorul acestuia va încărca harta.

punctul central al hărții, prin intermediul longitudinii și latitudinii punctului respectiv, transmise ca parametri funcției LatLng în modul următor: center: new google.maps.LatLng(41.6864807,-87.6285099)

nivelul de detaliu al hărții, care poate lua valori între 1 (pentru reprezentarea întregului Pământ) și 20 (reprezentarea clădirilor). În cazul aceasta nivelul de zoom a fost stabilit la 4, pentru a putea vedea întreaga Românie într-o fereastră web.

tipul hărții, care poate fi ​roadmap (hartă rutieră standard), ​satellite, terrain ​(imaginea fizică a reliefului, cu teren și vegetație) și ​hybrid (hibrid între harta rutieră standard și cea prin satelit, suprapunând un strat transparent de străzi principale și numele de locuri peste imaginea prin satelit)​.​ În acest caz am utilizat ​ roadmap.

Odată desenată harta, se face o primă interogare a bazei de date (prin apelarea metodei getcoordinates, ​al cărei cod este prezentat în Figura 3.12), pentru a obține informații cu privire la locațiile la care se află dispozitivele Android care și-au transmis coordonatele.

În metoda ​getcoordinates​ se realizează următoarele:

interogarea bazei de date (comanda ​SELECT * FROM tbl_location este​ utilizată pentru a returna toate înregistrările din tabela tbl_location)

crearea, pregătirea marcajelor (preluarea numelui, a vitezei și a locației – longitudine și latitudine) și pregătirea lor pentru poziționarea pe hartă (variabila ​$output).​

​ $result=$this->db->query("SELECT * FROM tbl_location")->result_array();

$output = "<markers>"; if (count($result)>0) { for ($i=0;$i<count($result);$i++) {

Odată opținute informațiile cu privire la locațiile dispozitivelor Android de pe drum, locații salvate în baza de date, se trece la desenarea acestora pe hartă (funcția ​getxml(infoWindow​).

Prin funcția ​window.setInterval( function() { getxml(infoWindow,map); }, 5000 ) ​se reapelează funcția ​getxml(infoWindow​) la un interval de 5000 de ms, în acest caz, reapelare care determină o nouă interogare a bazei de date și o nouă redesenare a marcajelor, în funcție de ultimele înregistrări din baza de date.

La un click pe oricare dintre marcajele de pe hartă obținem informații cu privire de șofer, (numele acestuia, viteza și adresa), după cum se poate vedea în cele două figuri de mai jos. În momentul în care cele 5000 de ms au trecut și se face o nouă interogare a bazei de date, deci o reactualizare a marcajelor pe hartă, caseta cu informațiile suplimentare va dispărea.

Concluzii

Acest proiect propune o rezolvare, pentru o posibilă problemă a unui antreprenor sau al unei mici afaceri care iși dorește să își eficientizeze modul în care operează sau sa își îmbunătațească modelul de business pe care l-a adoptat.

În prima parte, în Capitolul 2, s-a efectuat un studiu de caz în care s-au testat 3 aplicații care prezintă functionalități de GPS tracking, dar care aplicații sunt fiecare diferite de celelalte doua prin modul în care au fost concepute, prin funcțiile pe care le oferă, prin posibilitățile de configurare sau prin particularități în ceea ce privește strict utilizarea. S-a urmărit găsirea unor soluții gratuite sau care sa nu prezinte costuri recurente, după cum aminteam mai sus, altele decât cele aferente serviciului de date percepute de către operatorul de telefonie mobila.

Dintre aplicațiile testate, Find My Device, dezvoltată de Google nu impresionează practic prin nimic, fiind o aplicație cât se poate de simpla care afișează poziția dispozitivului la un anumit moment dat, poziția trebuie solicitată constant, localizarea nefiind recurentă și nu afișează viteza de deplasare a dispozitivului.

Cerberus este mai degrabă o aplicație de securitate pentru dispozitiv decât una de tracking, însă am inclus-o în acest studiu de caz pentru că prezintă opțiunea de localizare și transmitere a coordonatelor GPS ale dispozitivului pe care se afla instalata. Unul dintr neajunsurile acestei aplicații constă în faptul ca utilizatorul web trebuie sa pornească funcția de tracking manual de fiecare dată când se conectează la sistem, iar când se deconectează, serviciul de tracking care rulează în fundal pe aparatul mobil este automat oprit în acel moment. Are opțiunea de a afișa un istoric al locațiilor, dar numai pentru acea perioada în care funcția de tracking a fost activată, adică exact pentru perioada în care un utilizator este conectat la panoul web al aplicației și solicită explicit serviciul de tracking. De asemenea, la minusuri aș nota absenta posibilității de a afișa viteza curentă de deplasare.

Pe de alta parte, Cerberus prezintă o serie de funcții foarte interesante în ceea ce priveste securitatea. Dintre acestea, amintesc

Blocarea dispozitivului și schimbarea codului de acces de la distanță

Fotografierea de la distanță a utilizatorului, cât și posibilitatea de a porni funcția de înregistrare audio de la distanță pentru a putea depista împrejurimile în cazul în care dispozitivul a fost furat sau pierdut

Efectuarea de snapshot al ecranului de la distanță

Stergerea conținutului tabletei/telefonului, inclusiv a cardului SD de la distanta, ca măsură de protecție în caz de furt/pierdere

Salvarea conținutului întregii tablete/telefonului în cloud, prin Google Drive sau Dropbox în caz de furt/pierdere.

În acest context, referitor la această aplicație concluzionăm că având în vedere că aceasta nu prezintă nici măcar opțiunea transmiterii vitezei de deplasare, consider ca nu ar putea constitui o opțiune viabilă pentru ceea ce am căutat în cadrul acestui demers, însă poate constitui o excelenta soluție de securitate care ar putea fi folosita în tandem cu o aplicație de GPS tracking dezvoltată special pentru flote de autovehicule. Multe firme care decid să-și doteze vehiculele cu tracking GPS prin tablete folosesc aceste dispozitive și pentru alte servicii cum ar fi colectarea de semnături sau documente în format electronic, înregistrarea de comenzi sau trimiterea de comenzi agenților de pe teren. În contextul în care aceste dispozitive pot conține documente și/sau informații mai mult sau mai puțin sensibile ale firmei, soluția amintită mai sus poate fi una extrem de viabilă pentru a acoperi aspectul securității, mai ales în contextul în care prezintă și funcția de GPS tracking care ar putea fi folosită în regim de urgență. În situația în care principala aplicație de tracking nu ar mai funcționa din varii motive, administratorul poate recurge la această soluție de siguranță pentru că află poziția dispozitivului și în funcție de natura situației, poate recurge chiar la unele dintre soluțiile enumerate mai sus. Așadar, consider această aplicație o soluție foarte bună mai mult pentru securitate, nu pentru tracking.

Glympse prezintă o soluție extrem de interesantă, care ofera funcții de generare a istoricului locațiilor, oferă posibilitatea afișării vitezei de deplasare în timp real, însă lasă această opțiune la latitudinea utilizatorului mobil. Aceasta, după cum precizam și în studiul de caz, se datorează principiului constructiv al aplicației, și anume a faptului că utilizatorul mobil este cel care inițializează funcția de tracking, se generează un link, care este apoi trimis clientului care poate urmări poziția geografică și evoluția acesteia în timp real, sau generarea rutei parcurse, ulterior. Utilizatorul mobil care inițiază activitatea de tracking stabilește la început perioada de timp pentru care link-ul generat este valabil, dar totodată poate decide sa oprească această funcție în orice moment, la fel cum poate opri transmiterea vitezei curente.

Aceasta este o aplicație simplă, robustă, foarte bine implementată, cu recenzii remarcabile. Din păcate nu constituie o soluție viabila pentru situația de față, dat fiind faptul că nu există un așa numit administrator care să poată urmări constant poziția si mișcarea dispozitivului, dacă acest proces nu este inițiat de către utilizatorul mobil.

Partea a doua a lucrării prezintă în capitolul 3 soluția implementată, care constă într-o aplicație web, pe de-o parte și o soluție mobilă, pe cealaltă parte. Aplicația web afișează poziția dispozitivelor mobile într-un browser web, pe o hartă Google utilizând un API GoogleMaps.

Aplicația mobilă a fost implementată în Android Studio, și prezintă o abordare relativ simplă a soluției, în sensul că afișează pe displayul dispozitivului mobil poziția pe harta GoogleMaps și transmite această poziție și viteza în timp real aplicației web. Aplicația mobilă cotinuă să transmită aceste informații componentei web și după ce aceasta nu mai este in prim plan sau rulează în fundal, optându-se pentru implementarea cu servicii de broadcast, intent-uri si task-uri asincrone care rulează în fire de execuție paralele cu activitatea principală a aplicației și care iși continuă execuția chiar daca aceasta din urmă este pusă în hold sau este distrusă temporar de catre sistem.

Această soluție implementată reprezintă o soluție simplă, care oferă o singură funcție, și anume transmiterea locației GPS către o baza de date de pe un server care apoi sunt afișate într-un browser web. Scopul acesteia este să ofere, pe lângă această funcție, un punct de plecare pentru alte implementări care să optimizeze fluxul de lucru în firme mici cu activități în care eficiența în timp este foarte importantă. Ca posibile idei sau direcții ulterioare pentru dezvoltarea aplicației am considerat posibilitatea de a implementa un “​geofence​”, adică stabilirea de către adiministrator a unui perimetru astfel încât dispozitivul să trimită o alerta administratorului sau utilizatorului mobil, după caz, în momentul în care s-a depașit acel perimetru. Sau, pe de alta parte, se poate alege un punct de pe hartă și se poate crea un geofence circular, alerta fiind trimisa în momentul în care dispozitivul se apropie sau se îndepartează de/la o raza prestabilita de acea locație stabilită prin acel punct.

O altă idee, daca aplicația ar fi folosită, după cum precizam anterior, de un restaurant pentru a-și urmări masinile care livrează mâncare la domiciliu, ar exista varianta dezvoltării unui modul suplimentar pentru aplicatia web, în care administratorul/operatorul web sa introducă toate comenzile, apoi s-ar poate implementa un algoritm care să calculeze drumul optim până la client, având totodată opțiunea de a combina mai multe comenzi într-un singur drum, ținând totuși cont de întârzieri și stabilind parametri astfel încât să nu dureze foarte mult livrările. În acest context, dacă restaurantul folosește o soluție informatică pentru comenzi, odată ce operatorul care ia comanda prin telefon și selectează opțiunea de livrare, în momentul în care comanda este completă, s-ar putea implementa un API care sa transfere comenzile pt livrare la domiciliu, din software-ul de comenzi în sistemul de tracking GPS. O alta idee ar fi ca software-ul pentru comenzi să aibă opțiunea de a seta un timp standard în care fiecare produs cald de pe meniu este gata, împachetat, gata de livrare, de la bucătărie. Acesti timpi se pot determina si modifica pe percurs. Astfel, avand timpii la care au fost puse comenzile, timpii de gătire, pozițiile mașinilor, se poate construi un astfel de algoritm care sa determine când ajunge înapoi următoarea mașină, unde trebuie sa meargă comanda următoare, dacă mai există comenzi care merg în acea direcție și, de asemenea, dacă merită ca șoferul să astepte inca 2-3 minute până când o altă comandă care merge în aceeași zonă sau direcție va fi gata de livrare. Dacă se va merge pe o astfel de idee, atunci s-ar mai impune și înregistrarea stării comenzii:

în curs de pregatire

ridicată, în curs de livrare

livrată

În momentul în care ultima comandă disponibilă va fi livrată, starea mașini va fi actualizată la “disponibil in _ minute” și ar putea afișa operatorului web în cât timp va avea restaurantul următoarea mașină disponibilă pentru livrare.

Concluzionând, putem spune că direcțiile în care această aplicație poate fi dezvoltată pe viitor sunt practic nelimitate, în funcție de modelul de business pentru care este aleasă, industria în care operează firma, necesitățile clientului, creativitatea celui care scrie proiectul pentru îmbunătățiri sau dezvoltare și maniera de implementare a dezvoltatorilor, un aspect fiind totuși de necontestat, și anume faptul ca există o sumedenie de business-uri mici sau în curs de dezvoltare care caută soluții ieftine și funcționale pentru a crește si se dezvolta.

Bibliografie

“Android History.” ​Android Central​, 21 Oct. 2015. Web. 19 June 2016.

“Global Smartphones Sales by Operating System 2009-2015 | Statistic.” ​Statista​, Web. 19 June 2016.

Guru, and Guru. “Top 10 Mobile Phones Operating Systems.” ​ShoutMeLoud 23 Aug. 2012. Web. 20 June 2016.

“History of Cell Phones -.” N.p., n.d. Web. 20 June 2016.

“History of the Web.” ​World Wide Web Foundation​. Web. 19 June 2016.

ICT Facts&Figures, The World în 2015​., Web. 23 June 2016.

Ingram, Mathew. “Gigaom | Mary Meeker: Mobile Internet Will Soon Overtake Fixed Internet.”, n.d. Web.

18 June 2016.

“Mobile Marketing Statistics 2016.” ​Smart Insights​., 27 Apr. 2016. Web. 19 June 2016.

Nair, Rajeesh. “Internet & Mobile Phone Users Worldwide 2015: 50% Population Is On Internet [REPORT].” ​Dazeinfo​, 27 May 2015. Web. 23 June 2016.

“Number of Internet Users (2016) – Internet Live Stats.” , Web. 19 June 2016.

“Smartphone OS Global Market Share 2009-2016 | Statistic.” ​Statista​, Web. 18 June 2016.

Srivastava, Anshul. “2 Billion Smartphone Users By 2015: 83% of Internet Usage From Mobiles [Study].” Dazeinfo​. N.p., 23 Jan. 2014. Web. 20 June 2016.

“The History of Mobile Phones From 1973 To 2008: The Handsets That Made It ALL Happen.” ​Know Your Mobile​., Web. 20 June 2016.

“The Mobile Economy 2015.” ​GSMA Intelligence​, Web. 20 June 2016.

Williams, Rhiannon. “Apple iOS: A Brief History.” ​Telegraph.co.uk​, 17 Sept. 2015. Web. 20 June 2016.

ANEXE

Aplicația mobila

AndroidManifest.XML

Create_account.xml

</LinearLayout​ >​

</​LinearLayout​>

Track_location.xml

Create_account_activity.java

public class ​Create_account_activity extends ​ Activity {​

​private ​ProgressDialog ​pDialog ​;

ArrayList<LatLng> ​latlongg;​

​private ​String ​slatitude​;

JSONObject ​jsonObject ​= new ​ JSONObject();​

​private ​String ​slongitude​, ​email_pattern;​

​private double latitude​ ;​

​double ​add_miles​;

GPSTracker gps​ ;​ ​private double ​longitude ​; private ​ String ​ progress_dialog_msg ​ =​ ""​​; private static final int ​ LOAD_QUESTION_SUCCESS ​ ​= 2 ​ ;​

​private final int ​SHOW_PROG_DIALOG ​= ​0​;

​private final int ​HIDE_PROG_DIALOG ​= ​1​;

Location ​startLocation ​= ​new ​Location(​"start"​);

​public boolean ​handleMessage(Message msg) {

​// switch case

​switch ​(msg.​what​) { ​case ​SHOW_PROG_DIALOG​: showProgDialog();

​break​;

​case ​HIDE_PROG_DIALOG​: hideProgDialog();

​break​;

case ​ ​LOAD_QUESTION_SUCCESS​:

​//GotoData();

​break​;

​default​:

​break​;

}

​return false​;

}

});

​private ​AsyncLoadData ​asyncLoad​;

​private void loadData() {​

​if ​(​asyncLoad ​== ​null

​|| ​asyncLoad.getStatus() != AsyncTask.Status.​ ​RUNNING​) {

​asyncLoad ​= ​new ​AsyncLoadData();

​asyncLoad​.execute();

}

}

​class ​AsyncLoadData ​extends AsyncTask<String, Void, Void> {​

​boolean flag ​ ​= ​false​;

​@SuppressWarnings​(​"unused"​)

​@Override

​protected ​Void doInBackground(String… params) { ​//maincat=new ArrayList<MainCategoryEntity>();

​mHandler​.sendEmptyMessage(​SHOW_PROG_DIALOG​);

​progress_dialog_msg ​= ​"loading…";​

LoadApi api=​new ​LoadApi();

​try ​{

Log.​d​(​"msg////"​,​""​+name​ )​ ;

Log.​d​(​"msg////"​,​""​+slatitude​ )​ ;

Log.​d​(​"msg////"​,​""+​​slongitude​);

Log.​d​(​"msg///",​​""​+​password)​ ;

Log.​d​(​"msg////"​,​""+​ email​ )​ ;

Log.​d​(​"msg////"​,​""​+​speed​);

​jsonObject​=LoadApi.registrartion​ ​(name​ , ​ slatitude​ , ​ slongitude​ , ​ ​email ,​ password​,​speed​,​loc​);

​result1​=​jsonObject​.getString(​"msg"​); user_id​ =​ jsonObject​ .getString(​ "user_id"​ )​ ;

Log.​d​(​"msg"​,""​​+result1​ )​ ;

Log.​d​(​"userid"​,​""​+​user_id​);

}

​catch ​(Exception e) {

​// ​TODO Auto-generated catch block

​e.printStackTrace();

}

​return null​;

}

​@SuppressLint​(​"NewApi"​)

​@Override

protected void ​ onPostExecute(Void result) {​ ​mHandler​.sendEmptyMessage(​HIDE_PROG_DIALOG​);

​// mHandler.sendEmptyMessage(LOAD_QUESTION_SUCCESS);

​try​{

​if​(​result1​.equals(​"Registration successfully"​)){

AlertDialog.Builder alert; ​if ​(Build.VERSION.SDK_INT ​ ​>= 11​ )​ {

alert = ​new ​AlertDialog.Builder(Create_account_activity.this​ ,​

AlertDialog.​THEME_HOLO_LIGHT ​);

} ​else ​{

alert = ​new ​AlertDialog.Builder(Create_account_activity.​this​);

}

alert.setTitle(​"Successful")​ ;

alert.setMessage(​"You are successfully registered.Press OK to continue."​);

alert.setPositiveButton(android.R.string.ok​ ​, new​

DialogInterface.OnClickListener() {

​@Override

​public void ​onClick(DialogInterface dialog, ​int ​which) {

Intent intent = ​new ​Intent(Create_account_activity.​this​,

Track_location.class​ ​);

​typevalue​=getSharedPreferences(​USER_TYPE_VALUES​,​MODE_PRIVATE​);

​type_editor​=​typevalue​.edit();

​type_editor​.putString(​"user_id"​, ​user_id​); type_editor​ .commit();​ startActivity(intent);

finish();

dialog.dismiss();

}

});

​try​{

Dialog dialog = alert.create(); dialog.requestWindowFeature(Window.​FEATURE_NO_TITLE​); dialog.show();

}​catch​(Exception e){

e.printStackTrace();

}

}

​else if​(​result1.equals(​ ​"Email already exist"​)){

AlertDialog.Builder alert; ​if ​(Build.VERSION.SDK_INT ​ ​>= 11​ )​ {

alert = ​new ​AlertDialog.Builder(Create_account_activity.​this​, AlertDialog.​THEME_HOLO_LIGHT ​); } ​else ​{

alert = ​new ​AlertDialog.Builder(Create_account_activity.​this​); }

​//alert.setTitle("Registration!");

​alert.setMessage(​"Your Email is Already Registered with us"​);

alert.setPositiveButton(android.R.string.​ok​, ​new

DialogInterface.OnClickListener() {

​@Override

​public void ​onClick(DialogInterface dialog, ​int ​which) {

Intent intent = new ​ Intent(Create_account_activity.​ this​ ,​ Track_location.​class​);

​typevalue​=getSharedPreferences(​USER_TYPE_VALUES​,​MODE_PRIVATE​);

​type_editor=​ typevalue​ .edit();​

​type_editor​.putString("user_id"​ , ​ user_id​ )​ ;

​type_editor​.commit(); startActivity(intent);

finish();

dialog.dismiss();

}

});

​try​{

Dialog dialog = alert.create(); dialog.requestWindowFeature(Window.​FEATURE_NO_TITLE​); dialog.show(); }​catch​(Exception e){

e.printStackTrace();

}

}

}

​catch​(Exception e){

e.printStackTrace();

}

}

}

​@SuppressLint​(​"InlinedApi")​ private void ​ showProgDialog() {​

​progress_dialog ​= ​null​;

​try​{

​if ​(Build.VERSION.​SDK_INT ​>= ​11 ​) {

​progress_dialog ​= ​new ​ProgressDialog(Create_account_activity.​this​, AlertDialog.​THEME_HOLO_LIGHT ​);

} ​else ​{

​progress_dialog ​= ​new

ProgressDialog(Create_account_activity.​this​);

}

​progress_dialog​.setMessage(​progress_dialog_msg)​ ;

​progress_dialog​.setCancelable(​false​);

​progress_dialog​.show();

}​catch​(Exception e){

e.printStackTrace();

}

}

​// hide progress

​private void ​hideProgDialog() {

​try​{

​if ​(​progress_dialog ​!= ​null ​&& ​progress_dialog​.isShowing())

​progress_dialog​.dismiss();

}​catch​(Exception e){

e.printStackTrace();

}

}

@Override​

​public void ​onDestroy() {

​super​.onDestroy();

​if ​(​progress_dialog !=​ null​ )​ { ​progress_dialog​.dismiss();

​progress_dialog ​= ​null​;

}

}

}

Splash_activity.java

Location_service.java

Aplicația Web

home.php

<?php

class Home extends CI_Controller { function __construct() { parent::__construct();

map.php

Profileadmin.php​ (Controller)

profileadmin.php​ (View)

map_show.php

<?php

if (!isset($this->session->userdata['adminid']))

{

header("location: http://seemcodersapps.com/komet/admin/");

}

?>

<!doctype html>

<html lang="en">

<head>

<meta charset="utf-8"/>

login.php

Similar Posts