Aplicatie Android Pentru Studenti
Universitatea POLITEHNICA din Timișoara,
Facultatea de Automatică și Calculatoare.
Lucrare de Licență
PoliPlanner
Aplicație Android pentru studenți (organizare/planificare orar, gestionare informații)
Coordonator Autor
Prof. dr. ing. Horia CIOCÂRLIE student Vlad LUPU
Timișoara,
Iunie 2016
Cuprins
Introducere 1
Contextul problemei și motivația 2
Descrierea proiectului 3
Fundamentare teoretică 4
Despre Android 4
Android SDK 5
Versiunile Android OS / SDK 6
Tehnologii și limbaje de programare utilizate 6
Java 8
MySQL 8
Soluții software utilizate 9
Android Studio 9
WAMP Server 9
Specificațiile proiectului 11
Facilitațile pricipale ale aplicației 11
Autentificarea utilizatorilor 11
Importul informațiilor utilizatorului 11
Integrarea cu Google Calendar (S Planner) 12
Procesarea și stocarea datelor 13
Stocarea datelor la nivel de aplicație 13
Stocarea datelor la nivel de server 14
Proiectare și implementare 16
Arhitectura aplicației 16
Presentation Layer 16
Persistance Layer 17
Comunicarea între client și server 19
Concluzii și perspective 22
Bibliografie 23
Introducere
Trăim într-o lume in care s-a ajuns la un nivel de dependență foarte mare intre om si dispozitivele electronice. Acestea au devenit o parte integrală in viața noastră de zi cu zi, indiferent de contextul social / economic sau de domeniul de activitate din care facem parte, sprijinindu-ne să ne facem treaba mai rapid și, în foarte multe cazuri, mai bine. În cazul elaborat în aceasta lucrare este vorba despre telefoanele mobile ”inteligente” (smartphones), în particular despre aplicațiile de care acestea dispun și pot fi dezvoltate pentru aceste dispozitive.
Odată cu trecerea anilor, tehnologiile de care dispun smartphone-urile au devenit din ce în ce mai avansate, acestea având putere de procesare și stocare de date foarte mare, dispunând de facilitați precum camere foto / video de rezoluții mari, dispozitive de localizare etc. Toate aceste lucruri, precum si faptul că un procent foarte mare din populația planetei (sau într-un context mai restrâns, al lumii civilizate) dispune de un smartphone și îl poartă după aceștia zi de zi, au facilitat creșterea interesului în această nouă piață, cea a aplicațiilor mobile.
Aplicațiile pentru smartphone-uri pot fi clasificate în principal ca aplicații de entertainment (jocuri, muzică, video, cărți), aplicații de socializare (cele oferite de marile rețele de socializare ex. Facebook, Twitter, Instagram) sau ca aplicații utilitare, care pot implementa o varietate imensă de facilitați pentru diferitele nevoi ale fiecărui individ.
Piața aplicațiilor pentru smartphone-uri a explodat in ultimii ani, în special in categoria de entertainment. Jocurile mobile atrag din ce în ce mai multă lume, studiile arătând că cele 3 mari categorii de jocuri (PC / Console / Mobile) își impart aproape egal piața, cea mobilă însă având o tendință de creștere [1].
Un exemplu bun care sprijină această tendință este achiziția companiei King Digital (creatorii unui joc mobil foarte popular, ”Candy Crush Saga”) de către Activision pe suma colosală de 5.9 miliarde de dolari, la finalul anului 2015 [2].
Contextul problemei și motivația
De-a lungul celor 4 ani ca student al Politehnicii, pot spune că am trăit o experiență unică. Deși poate că nu am profitat la maxim de viața de student din afara facultății. Nefiind căminist, nici nu am cunoscut o mare parte din colegii care nu sunt din Timișoara decât foarte târziu, în special pe la cursuri. Odată cu trecerea timpului, tot mai puțini studenți au continuat să participe la ele din diverse motive. Unul din principalele motive a fost, după parerea mea, faptul că materia predată la majoritatea cursurilor a fost identică cu materialele pe care le aveam furnizate de către profesori în format electronic, nemai fiind nevoie să se scrie, sau chiar să se mai vină, la acestea. Un alt motiv, mai relevant în contexul argumentului pe care încerc să îl construiesc, este acela că multe dintre cursuri erau chiar în mijlocul zilei, câteodată în zile în care nu mai era nimic planificat în orar.
Odată ce colegii au început să se angajeze part-time, aceasta a devenit încă o scuză ca să nu mai participe la cursuri. Singurele cursuri la care se mai strângeau colegii sunt cele unde era promis un fel de bonus pentru prezență.
În prima zi de facultate, îmi amintesc că am ajuns din greșeală la laboratorul de Fizică al celeilalte semi-grupe, deoarece nu știam ce semnifică marcajul alb / gri din orar, care indică săptămană pară sau impară. Cu toate acestea, mai mare mi-a fost surprinderea când am primit prezența pe laboratorul respectiv și când am aflat că laboratoare se pot face în avans, sau recupera, atât timp cât asistentul care susține laboratorul este de acord, și dacă este loc pentru un student în plus.
Astfel am încercat să optimizez prezențele la laboratoare în funcție de alte materii unde nu puteam să recuperez în altă zi. Am început să realizez în ce fel de muncă de detectiv consta această optimizare, deoarece trebuia să aflu cine predă la care semi-grupă. Astfel mi-a venit ideea de a încerca să automatizez procesul, însă am considerat că nu are rost să dezvolt un program doar pentru a determina o alternativă la un singur laborator, pentru o singură persoană.
Apoi am luat în considerare faptul că gradul de complexitate al unui asemenea algoritm ar fi crescut odată cu numărul de studenți care l-ar utiliza, materiile opționale ale anilor mai mari și toate combinațiile lor posibile, distribuția studenților seriei în specilizările Software și Hardware, precum și anumite laboratoare unde ni s-a cerut să ne înscriem la una dintre 3 sau 4 variante de ore de laborator, pe sistemul primul venit, primul servit.
Cu trecerea timpului am observat și dificultatea cu care putem accesa anumite informații relevante furnizate de facultațile Politehnicii, organizarea acestora în diferitele site-uri ale universitații fiind cel puțin confuză. Nici nu mai țin minte de câte ori mi-am bătut la cap șeful de an doar pentru a afla o informație legată de planificarea examenelor sau pentru a obține vreo listă de rezultate. Deoarece eu sunt o persoană foarte pasionată de statistici, în cazul de față de note / medii / distribuție materii opționale, atât cele personale, cât și raportate la cele ale colegilor mei, dificultatea menționată anterior mi-a displăcut enorm. Cu toate acestea, sunt conștient de inițiativele facultății de îmbunătățire a sistemului, însă metodele de informare a studenților care nu se interesează explicit de aceste detalii este încă deficitară.
Considerând toate lucrurile menționate până acum, ideea despre care m-am decis să o elaborez în lucrarea aceasta, cea a unei aplicații Android, care vizează în principial studenții Facultații de Automatică și Calculatoare, cu posibilitatea de a fi utilizată și de alte facultăți din Universitate care utilizează un mod similar de lucru și organizare, care să grupeze facilitațile unei aplicații de tip planner cu o organizare optimă a anumitor informații utile si relevante pentru studenți.
Acest proiect se dorește a fi un prototip pentru cazul în care o asemenea aplicație va fi dezvoltată și utilizată în cadrul facultății și descrie aplicația, precum și modul în care aceasta ar funcționa din puncul meu personal de vedere.
Descrierea proiectului
Aplicația elaborată in cadrul acestui proiect se numește PoliPlanner și dispune de următoarele facilitați, utilizând o bază de date care în practică ar fi gestionată de facultate:
Fiecare student dispune de un cont de utilizator personal, autentificarea facându-se la nivel de aplicație si serviciul de autentificare.
Studenții pot vizualiza informațiile private despre aceștia care sunt cunoscute de către Universitate, precum și informațiile publice despre colegi / profesori etc.
Funcționalitate de mapare a orarului personal de la facultate in Google Calendar (S Planner), pe baza informațiilor despre fiecare student precum anul de studiu (semestru), grupa și materiile contractate.
Optimizare a programului zilnic al utilizatorului pe baza evenimentelor de facultate stocate in calendar, precum și a celor personale.
Panouri de statistici și de query-uri pe baza informațiilor publice (ex. numere de telefoane sau adrese de e-mail are profesorilor, ”Câți / care colegi au materia opțională X ca și mine?” etc.)
Alarme / notificari pentru cursuri / laboratoare / examene.
Deoarece această aplicație este foarte personalizată pentru utilizarea exclusivă in cadrul Universității Politehnica Timișoara, abordările similare precum alte aplicații mobile de tip planner / calendar / to-do care, deși dispun de unele facilitați mai bune și / sau o interfață mai intuitivă, nu pot fi comparate direct cu aceasta.
Fundamentare teoretică
În cadrul acestui capitol voi elabora toate aspectele teoretice care au fost necesare în vederea realizării acestei aplicații, cu scurte explicații despre contextul în care acestea au fost utilizate.
Despre Android
Android este un sistem de operare pentru dispozitive și telefoane mobile, dezvoltat de către Google, bazată pe nucleul Linux. Odată preluată mai târziu de consorțiul comercial Open Handset Alliance. Android permite dezvoltatorilor să scrie cod gestionat în limbajul Java, controlând dispozitivul prin intermediul bibliotecilor Java dezvoltate de Google. Ultima versiune lansată a sistemului de operare este Marshmallow (6.0.1).
Aplicațiile descărcabile pentru sistemul de operare Android se regăsesc in Play Store, aplicația oficială care dispune de peste un milion de aplicații și peste 50 de miliarde de descarcări, statistici înregistrate în luna Iulie 2013 [3]. De asemenea, în luna Septembrie 2015 s-au înregistrat 1.4 miliarde de utilizatori activi lunar [4].
Interfața cu utilizatorul a Androidului este în principal bazată pe manipulare directă pe ecranul tactil, prin intermediul gesturilor tactile care simulează acțiuni din lumea reală, utilizându-se o tastatură virtuală pentru introducerea de text.
Codul sursă al Androidului este oferit de către Google sub licențe open source, cu toate că majoritatea dispozitivelor Android sunt livrate utilizând software proprietar în combinație cu componentele proprietare necesare pentru accesul la serviciile Google. De exemplu, printre puținele dispozitive care utilizează codul sursă nemodificat al Androidului sunt dispozitivele din gama Nexus.
Google menține un plan de actualizări incrementale majore odată la un interval de 6 si 9 luni. Comparativ cu principalul rival, sistemul de operare Apple iOS, aceste actualizări ale sistemului de operare pot avea întarzieri semnificative, în functie de dispozitiv, excepția fiind din nou, gama Nexus.
Kernel-ul Android este bazat pe una din variantele suportate pe termen lung (LTS) ale kernel-ului Linux. Deasupra kernel-ului în cadrul stack-ului arhitecturii se regăsesc librării și API-uri scrise in C, precum și software-uri funcționale care rulează pe un framework care include librării compatibile Java.
Diagrama de arhitectura a Android-ului.
Android SDK
Android SDK (Software Developement Kit) include un set cuprinzător de unelte pentru dezvoltare. Printre acestea se numără un debugger, librării, un emulator integrat, cod template, documentații bogate precum și tutoriale. În momentul de față Android SDK are ca ulitim release stabil versiunea 24.4.1.
Versiunile în curs de dezvoltare ale acestui SDK nu mai sunt suportate în cadrul altor IDE-uri în afara celui oficial furnizat de Google (Android Studio). Acest decizie a fost pusă în aplicare din luna Martie 2015. SDK-ul suportă și veriuni vechi ale platformei Android pentru cazul în care dezvoltatorii doresc ca aplicațiile lor să poată fii utilizate pe dispozitive mai vechi.
Aplicațiile Android sunt împachetate in formatul .apk, stocat in folderul /data/app al sistemului de operare Android, folder accesibil doar de către root din motive de securitate.
Android SDK dispune de un toolkit numit Android Debug Bridge (ADB) care constă în programe atât client, cât și server care comunica unele cu celelalte. ADB-ul este accesat în principa la nivel de linie de comandă, totodată existând și diferite interfețe GUI pentru controlul acestuia.
Discrepanțele dintre standardele Java oficiale (Java SE / ME) și cele utilizate de către Android în contextul Java conduc la obstacole în dezvoltarea aplicațiilor, precum și probleme de compatibilitate între aplicațiile Java scrise pentru platforme diferite față de cea Android. Acest lucru se datorează faptului că Android doar ”împrumută” sintaxa și semantica limbajului Java, însă nu prevede întregile librării de clase si API-uri livrate cu Java SE / ME. Cu toate acestea, exista pe piață diverse tool-uri care permit servicii de conversie între Java ME și Android.
Versiunile Android OS / SDK
Există o mapare între versiunile SDK-ului (nivelul API) si versiunile sistemului de operare Android:
În cadrul aplicației, am ales sa utilizez ca minSdkVersion API-ul 21, al versiunii Android 5.0, cu targetSdkVersion 24, în curs de dezvoltare, IDE-ul utilizat garantându-mi un grad de acoperire de peste 40% al dispozitivelor mobile ce operează pe Android.
Tehnologii și limbaje de programare utilizate
Pentru o bună organizare a unei aplicații mobile se recomandă utilizarea unei arhitecturi de proiectare, în cazul de față am folosit arhitectura Layers (straturi). Aceasta arhitectura impune separarea modulelor care compun aplicația în 3 layers de bază, acestea fiind [5]:
Presentation Layer – nivelul la care se găsesc modulele care implică interacțiunea cu utilizatorul. Pentru o aplicație mobilă, aceste module sunt în principal cele care gestionează Activitățile si Layout-urile acestora. Este o componentă critică ale unei aplicații mobile deoarece trebuie să ofere acces facil și intuitiv la funcționalitățile oferite.
Business / Domain Layer – nivelul unde se află modulele ce implementează toate funcționalitațile și cerințele aplicației. Aici se modelează și implementează entitățile specifice aplicației, se specifică modul de interacțiune între module, precum și regulile de accesare ale acestora. Acest nivel este accesat prin intermediul nivelului Presentation descris anterior.
Persistance Layer (Data Storage) – nivel care oferă suportul pentru stocarea de date la nivel local (baze de date SQLite), cât și gestionarea legăturilor dintre modulele de stocare externe (baze de date remote, MySQL).
În cadrul implementării acestei aplicații am utilizat următoarele tehnologii / limbaje de programare:
Java – limbajul de programare object-oriented de bază utilizat de către sistemul de operare Android, pentru construcția nivelelor Presentation, Business și Persistance (la nivel de aplicație / client).
XML – limbajul utilizat atât de către fisierele de layout ale activităților unei aplicații Android, cât și de către AndroidManifest, pentru contrucția nivelului Presentation.
PHP – limbajul de scripting utilizat pentru comunicarea între nivelele Business și Persistance (la nivel de baza de date remote / server).
MySQL – sistemul de gestiune a tuturor bazelor de date relaționale aflate la nivel de server.
HttpRequester – un plugin pentru browser-ul Firefox utilizat în contextul acestei aplicații pentru a testa funcționalitatea scripturilor PHP care fac legătura între aplicație și baza de date MySQL.
Volley – o librărie HTTP care facilitează accesul mai ușor și mai rapid la rețea al aplicațiilor Android. [6]
Java
Java este un limbaj de programare de scop general orientat pe obiecte, puternic tipizat, lansat în 1995. Cele mai multe aplicații distribuite sunt scrise în Java, iar noile evoluții tehnologice permit utilizarea sa și pe dispozitive mobile. În felul acesta se creează o platformă unică, la nivelul programatorului, deasupra unui mediu eterogen extrem de diversificat. Acesta este utilizat în prezent cu succes și pentru programarea aplicațiilor destinate intranet-urilor.
Limbajul împrumută o mare parte din sintaxă de la C și C++, dar are un model al obiectelor mai simplu și prezintă mai puține facilități de nivel jos. Un program Java compilat, corect scris, poate fi rulat fără modificări pe orice platformă care e instalată o mașină virtuală Java (JVM). Acest nivel de portabilitate este posibil deoarece sursele Java sunt compilate într-un format standard numit cod de octeți (byte-code) care este intermediar între codul mașină (dependent de tipul calculatorului) și codul sursă.
Mașina virtuală Java este mediul în care se execută programele Java. În prezent, există mai mulți furnizori de JVM, printre care Oracle, IBM, Bea, FSF. În 2006, Sun a anunțat că face disponibilă varianta sa de JVM ca open-source.
Principiile de bază ale concepției limbajului Java sunt:
Trebuie să fie simplu, orientat pe obiecte, familiar.
Trebuie să fie robust și sigur.
Trebuie să fie portabil și neutru arhitectural.
Trebuie să opereze cu performanțe ridicate.
MySQL
MySQL este un sistem de gestiune a bazelor de date relaționale, produs de compania suedeza MySQL AB. Este unul dintre cele mai utilizate SGBD (Sistem de Gestiune a Bazelor de Date) open-source, fiind o componentă cheie în cadrul stack-ului LAMP (Linux, Apache, MySQL, PHP).
Deși este folosit foarte des împreună cu limbajul de programare PHP, cu MySQL se pot construi aplicații în orice limbaj major.
Licența GNU GPL nu permite încorporarea MySQL în softuri comerciale; cei care doresc să facă acest lucru pot achiziționa, contra cost, o licență comercială de la compania producătoare, MySQL AB.
În contexul aplicației, baza de date MySQL din cadrul serverului WAMP găzduit pe calculatorul personal este utilizată pentru a stoca majoritatea informațiilor utilizate de către modulele aplicației.
Soluții software utilizate
Android Studio
Android Studio este IDE-ul (Integrated Development Environment) oficial al platformei Android, dezvoltat de către Google. Primul build stabil al acestui IDE a fost lansat in Decembrie 2014 (versiunea 1.0), versiunea stabilă la momentul curent fiind 2.1.2 (6 Iunie 2016) [7].
Aplicația este bazată pe IDE-ul IntelliJ IDEA de la JetBrains, și este conceput anume pentru dezvoltarea in mediul Android. Odată cu lansarea Android Studio, s-a încetat suportul plugin-urilor pentru alte IDE-uri folosite în trecut în vederea dezvoltării Android.
Printre facilitațile de care dispune Android Studio la momentul actual se numară:
Diverse template-uri pentru creerea unor design-uri si componente frecvent utilizate de către aplicațiile Android.
Un Layout Editor foarte bun, cu facilitați de drag and drop ale componentelor, precum și preview pe diferite configurații de display ale device-uri mobile care rulează Android.
Sistem de refactorizări specific Android.
Suport pentru build-uri bazat pe Gradle.
Suport prin Lint pentru detectarea problemelor de performanță, portabilitate, stabilitate, compatibilitate cross-version etc.
Capabilități de semnare digitală a aplicațiilor.
Suport pentru dezvoltarea aplicațiilor Android Wear (Smartwatch-uri).
Suport încorporat pentru platforma Google Cloud
În cadrul acestui proiect, am utilizat Android Studio pentru majoritatea nevoilor de dezvoltare a aplicației, utilizând dintre facilitațile menționate anterior refactorizările, Layout Editor-ul, precum si o parte dintre template-urile furnizate.
WampServer
WampServer este un așa numit ”software stack” (un set de aplicații software care lucrează împreună pentru a crea o platformă complet funcțională independentă de alte aplicații) pentru Windows care este format dintr-un server web Apache, bază de date MySQL și suport pentru limbajul de programare PHP. [8]
Acronimul lui WAMP provine de la stack-ul sau stiva de aplicații care îl compun (Windows, Apache, MySQL, PHP).
În cadrul acestui proiect, am utilizat WampServer pentru a-mi găzdui o baza de date MySQL pe calculatorul personal, accesul la aceasta din aplicație fiind realizat prin script-uri PHP.
Specificațiile proiectului
Facilitațile principale ale aplicației
În acest subcapitol voi detalia specificațiile facilităților de bază din cadrul aplicației, precum și abordarea de implementare.
Autentificarea utilizatorilor
Autentificarea studenților este un aspect foarte important al acestei aplicații considerând scopul destinat utilizării. Astfel doar studenții pot avea acces la această aplicație pe baza unor conturi generate pentru fiecare student care activează in bazele de date ale facultății.
Fiecare nume de cont este determinat de adresa de e-mail pe care studentul o are în domeniul Politehnicii, de forma:
<prenume>.<nume> @ student.upt.ro
Parola fiecarui cont este generată aleator odată cu creerea adresei de mail, aceasta având posibilitatea de a fi schimbată la nivelul aplicației.
Alături de adresa de e-mail utilizată la autentificare, tabelul din baza de date care conține aceste intrări are de asemenea un cod unic de identificare a studentului, atribut care am decis să fie numărul matricol al acestuia, drept cheie primară. Acest atribut se regăsește și în alte tabele, fiind utilizat pentru a creea relațiile dintre acestea.
Importul informațiilor utilizatorului
Odată autentificat, aplicația detectează dacă utilizatorul a mai fost autentificat pe dispozitivul respectiv. Dacă nu, se realizează un ”first time setup” în care aplicația importă informațiile pe care le deține despre studentul autentificat din tabela corespunzătoare a bazei de date. Printre aceste informații se numară cele care le-am considerat relevante pentru tabela respectiva. Aceste atribute sunt:
Numărul matricol
Numele
Prenumele
CNP-ul
Numărul de telefon personal
Adresa de e-mail personală
Nota la Bacalaureat
Nota la Admitere
Anul înscrierii
Anul curent de studiu
Aceste informații, nu pot fi modificate în baza de date de la nivelul aplicației.
Integrarea cu Google Calendar (S Planner)
Android-ul dispune de un repertoriu pentru evenimentele din calendarul utilizatorului numit Calendar Provider. API-ul acestuia permite operații precum Query, Insert, Update și Delete pe entitațile Calendars, Events, Attendees, Reminders etc.
În primul rând, utilizarea acestor operații implică nevoia aplicației de permisiuni pentru acces-ul calendarului, acestea fiind permisiunile necesare:
<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
Operațiile comune precum insert, view si edit nu necesită neapărat aceste permisiuni, Provideul oferind un set de intents.
Content providerele stochează informații și le fac accesibile altor aplicații, de regula sub forma unor tabele bazate în modul de organizare al bazelor de date relaționale, unde fiecare rând și coloană reprezintă un anumit lucru.
În contextul fiecărui content provider, acesea dispun de un URI public, encapsulat ca un Obiect Uri, care identifică setul său de date în mod unic. Dacă providerul controlează mai multe seturi de date (mai multe tabele), atunci acesta dispune de câte un URI separat pentru fiecare. Toate URI-urile providerelor încep cu stringul ”content://”, având formatul <class>.CONTENT_URI.
Aceasta este reprezentarea structurii modelului de date al ContentProvider. Se constată ca un utilizator poate avea multiple calendare, iar diferite calendare pot fi associate cu diferite tipuri de conturi (Exchange / Google / etc.)
Informațiile propriu-zise din calendar sunt stocate la nivelul clasei CalendarContract, clasă ce definește modelul de date al calendarului. Printre datele stocate de aceasta se numară:
CalendarContract.Calendars – Informații specifice unui singur calendar, precum numele și informația de sincronizare.
CalendarContract.Events – Informațiile specifice evenimentelor. Fiecare entry din această tabelă conține informațiile de bază despre un eveniment: denumirea, locația, ora de start, ora de final
Clasele CalendarContract.Attendees și CalendarContract.Reminders sunt stocate în tabele separate, fiecare având referințe către Event prin Event_ID.
Modeul de date al CalendarProvider
Procesarea și stocarea datelor
Un aspect foarte important al acestui proiect, deoarece funcționalitațile majore ale aplicației presupun operații pe informații preluate de la baza de date, urmând ca acestea să fie prelucrate in diferite moduri pentru a obține rezultatele dorite.
Stocarea datelor la nivel de aplicație
La nivelul aplicației, datele sunt stocate în 2 moduri:
Primul mod este prin utilizarea de SharedPreferences, folosit doar în cadrul managementului sesiunii de autentificare a utilizatorului. Astfel, odată ce un utilizator a fost autentificat, aplicația utilizează un ”cookie” salvat pe dispozitiv cu identificatorul acestuia în vederea notificării celorlalte module despre ce utilzator este vorba la momentul respectiv. În momentul în care utilizatorul închide sesiunea (logout), acest cookie este actualizat pentru ca la urmatoarea rulare a aplcației să se reia procedura de login.
Al 2-lea mod este cel utilizat pentru orice alt tip de persistența a datelor la nivel local, acela fiind utilizarea unei baze de date SQLite. SQLite este o mică bibliotecă C care implementează un motor de baze de date SQL încapsulat, oferind posibilitatea de a fi introdus în diverse sisteme (în acest caz, el fiind deja parte a arhitecturii sistemului de operare Android), nevând nevoie de vreo configurare specială.
În general, orice tip de date care necesită persistență odată cu parăsirea aplicației trebuie stocate într-un fel sau altul, alte variante ar putea fi fisiere text sau tabele Excel.
Stocarea datelor la nivel de server
Aplicația utilizează o bază de date MySQL din cadrul serverului WAMP ca mod de stocare a informațiilor pe care aplicația trebuie să le importe pentru a le putea gestiona. Categoria aceasta de date reprezintă, în cazul de față, acele informații pe care un student le poate citi, dar nu și modifica (cu excepția parolei personale, desigur).
Deoarece o parte dintre aceste informații nu sunt doar citite / importate de pe server, ci și copiate la nivel local, o formă de diferențiere între datele stocate de client și server la un moment dat este necesară. Acest lucru se poate realiza prin adăugarea unui câmp timestamp in cadrul tabelelor cu potențial mare de schimbare.
Astfel se poate realiza o facilitate de tipul ”Check for updates” pentru informațiile care se doresc a fi actualizate, comparând timestamp-ul informațiilor salvate local anterior cu timestamp-ul intrărilor curente din tabelul bazei de date.
În continuare voi elabora modalitățile abordate în contextul lucrării pentru a realiza accesul aplicației la serverul care găzduiește baza de date MySQL în vederea stocareii datelor.
Odată instalat, serverul WAMP a trebuit configurat pentru a satisface nevoie aplicației. Utilizând configurațiile de bază ale acestuia, odată ce se accesează adresa localhost sau 127.0.0.1 în browser, ne este afișat un homepage al severului, în care putem accesa documentațiile pentru Apache si PHP, precum și în colțul din dreapta jos, aplicațiile de gestionare a bazei de date MySQL: phpMyAdmin și SQLBuddy.
Exemplele din restul lucrării vor utiliza aplicația phpMyAdmin la momentele când se face referire la această bază de date.
Deoarece am dorit accesul remote la acest server, au fost necesare schimbari de configurație pentru ca localhost-ul, implicit și baza de date găzduită de acesta să fie accesată utilizând IP-ul rețelei locale de acasă, sau IP-ul obținut dacă calculatorul este conectat la Internet prin datele mobile ale telefonului.
În cazul utilizării unui router wireless pentru conexiunea la Internet, cum a fost în cazul meu, a mai fost necesar încă un pas de configurare, acela de creere al unui server virtual la nivelul router-ului pentru a realiza forwarding-ul. Cu această ocazie, am schimbat și portul de acces către serverul WAMP pentru a elibera porturile folosite des precum 80, 8080 etc.
În final, accesul la server s-a putut realiza din exterior, accesând IP-ul si port-ul cunoscut. Soluția la nivelul aplicației nu este ideală, deoarece IP-ul nu rămâne constant, acesta fiind codat direct în aplicație sub o clasă de constante, IP-ul fiind singura variabilă din calea de acces către fișierul PHP de executat.
Mai multe detalii despre accesul și obținerea propriu-zisă de informații din partea bazei de date MySQL vor fi prezentate in capitolul de proiectare si implementare.
Proiectare și implementare
Arhitectura aplicației
După cum am specificat anterior în lucrare, am încercat să organizez modulele ce compun aplicația în 3 nivele structurale: Presentation, Business, Persistance. Deși în contextul altor aplicații, mă refer în special la cele non-mobile, o arhitectura de tip layer nu este recomandată daca scopul este sporirea performanței, în cazul de față arhitectura este ideală deoarece funcționalitățile nu necesită putere de calcul mare sau viteză.
Arhitecturile de tip Layers sunt în general utilizate în contexte de securitate, unde deși creșterea numarului de straturi va determina scăderea performanței, separarea dependențelor între module crește gradul de securitate.
Presentation Layer
În cadrul pachetului Presentation se regăsesc clasele Java care definesc activitățile Android, acestea alături de fișierele XML aferente constituind interfața dintre utilizator și funcționalitațile aplicației. Această interacțiune se face prin butoane, câmpuri de text editabil, liste drop-down etc.
În timp ce fișierele XML se ocupă de aranjarea pe ecran a componentelor, clasele Java corespondente gestionează acțiunea din spatele elementelor interactive. E de menționat faptul că o activitate poate avea două layout-uri diferite, una pentru modul Portrait, cealaltă pentru modul Landscape.
De asemenea, un element util al aplicațiilor Android este Widget-ul, o mini-aplicație care poate fi plasată pe ecranul principal, facilitând astfel viteza de acces la o anumită componentă. Această aplicație dispune de exemplu de un Widget cu un buton cu textul ”Ce urmează?”, având funcționalitatea de a afișa un Toast cu informații despre următorul eveniment planificat în calendar, dacă există un utilizator cu o sesiune de autentificare deschisă în aplicație la momentul respectiv.
Persistance Layer
Acesta este nivelul care conține clasele ce operează cu tabele bazei de date SQLite locale, cât și clasa SessionManager, menționată anterior în lucrare, la facilitatea de autentificare. În cadrul layer-ul de persistență se mai regăsește și clasa care gestionează aplelurile HTTP de la nivelul aplicației, clasă care utilizează librăria Volley pentru obiectul de tip StringRequest.
Orice librărie externă trebuie adăugată ca dependență in fisierul build.gradle al aplicației, librăria Volley nu face excepție de la această regulă.
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:24.0.0'
compile 'com.android.support:support-v4:24.0.0'
compile 'com.android.support:design:24.0.0'
compile 'com.mcxiaoke.volley:library-aar:1.0.0'
}
Clasele utilizate în cadrul aplicației din librăria Volley sunt următoarele:
com.android.volley.Request
com.android.volley.Response
com.android.volley.RequestQueue
com.android.volley.toolbox.Volley
com.android.volley.toolbox.StringRequest
com.android.volley.VolleyError
Ciclul de viață al unui request
Tot la acest nivel se poate considera si baza de date remote împreună cu toate tabelele ce o conțin. Printre tabelele gestionate de baza de date MySQL se numără:
Pe lângă aceste tabele se mai regăsesc tabela pe care se mapează orarul, mai exact fiecare entitate din orar devine o intrare în tabelă, precum și alte tabele funcționale (tabele care conțin informații publice de interes, tabelă pentru maparea celor 14 săptamâni ale unui semestru plus sesiunea etc.)
Comunicarea între client și server
Comunicarea între aplicație și baza de date MySQL se face prin intermediul unor request-uri HTTP, utilizând metoda POST, către URL-ul conținut la nivelul aplicației. În continuare voi exemplifica aceasta comunicare pentru funcționalitatea de login.
În cadrul LoginActivity-ului, aplicația așteapă cele două câmpuri de text să fie completate, apoi acțiunea pe butonul de Login verifică ca ambele câmpuri să nu fie goale.
Vom lua ca exemplu pentru acest apel valorile
Email = ”[anonimizat]”
Password = ”abc”
String email = eEmail.getText().toString().trim();
String password = ePass.getText().toString().trim();
if (!email.isEmpty() && !password.isEmpty()) {
checkLogin(email, password);
} else {
Toast.makeText(getApplicationContext(),
"Introdu datele de autentificare!", Toast.LENGTH_SHORT).show();
}
Urmează apelul metodei checkLogin, care primește ca parametri datele introduse, urmând ca acestea să fie transmise mai departe ca ”argumente” pentru metoda de request HTTP, POST.
public static final String URL_LOGIN = "http://79.113.66.144:2285/poliplanner/login_api/login.php";
StringRequest strReq = new StringRequest(Request.Method.POST,
Constants.URL_LOGIN, new Response.Listener<String>() {…}
Argumentele metodei checkLogin sunt adăugate la URL-ul de login prin suprascrierea metodei getParams() a clasei Request.
@Override
protected Map<String, String> getParams() {
Map<String, String> params = new HashMap<String, String>();
params.put("email", email);
params.put("password", password);
return params;
}
Acesta este momentul în care intervin script-urile PHP. Pentru a facilita funcția de login am creat un folder login_api care conține fișierele PHP necesare interogării bazei de date. Fișierul accesat de catre request este login.php:
// login.php
<?php
require_once 'include/DB_Functions.php';
$db = new DB_Functions();
$response = array("error" => FALSE);
if (isset($_POST['email']) && isset($_POST['password'])) {
$email = $_POST['email'];
$password = $_POST['password'];
$user = $db->getUserByEmailAndPassword($email, $password);
if ($user != false) {
// user found for credentials
$response["error"] = FALSE;
$response["user"]["nr_matricol"] = $user["nr_matricol"];
$response["user"]["email"] = $user["email"];
echo json_encode($response);
} else {
// user not found for credentials
$response["error"] = TRUE;
$response["error_msg"] = "E-mailul sau parola sunt incorecte. Incearca din nou.";
echo json_encode($response);
}
} else {
// required post params is missing
$response["error"] = TRUE;
$response["error_msg"] = "E-mailul sau parola lipsa.";
echo json_encode($response);
}
?>
Din codul acestui script se constată tipul de răspuns JSON pe care aplicația îl primeste. Boolean-ul ”error” va notifica aplicația dacă răspunsul primit este valid sau nu, String-ul ”error_msg” specificând și de ce.
De asemenea e de menționat faptul ca parola stocată pe server este hash-ul obținut prin aplicarea funcției SHA1, fara a utiliza salt-uri, doar ca un extra strat de securitate. Coversia String-ului ”password” se face în cadrul scriptului DB_Funcions.php, cu toate că poate fi la fel de bine facută la nivelul aplicației mobile, request-ul POST transmițând astfel valoarea hash a parolei.
Funcționalitatea de login utilizeaza o metodă proprie din DB_Functions, însă pe caz general, când se dorește interogarea bazei de date, se va rula scriptul execute_query.php care în urma șirului de apeluri va executa următoarea funcție:
// DB_functions.php
…
public function execute_query($query) {
$stmt = $this->conn->prepare($query);
if ($stmt->execute()) {
$result = $stmt->get_result()->fetch_assoc();
$stmt->close();
if ($stmt != NULL) {
return $result;
}
} else {
return NULL;
}
}
…
Concluzii și perspective
Reluând argumentele enumerate în cadrul introducerii, trebuie să menționez din nou motivele pentru care cred aplicația elaborată în cadrul acestui proiect, într-o formă sau alta, ar fi benefică în contextul utilizării de către studenți. Deși implementarea mea este rudimentară, o implementare adevărată pentru o asemenea aplicație să fie utilizată în practică ar presupune o foarte strânsă colaborare cu facultatea, precum si accesul la detalii de infrastructură. Țin totuși să cred că pentru o facultate de Calculatoare, ar trebui să se pună mai mare accent pe utilizarea și dezvoltarea tehnoligiilor de ultimă ora și de viitor.
Cât despre potențiale alte facilități ale acestei aplicații, neabordate în cadrul acestei lucrări, pe motivul principal al complexității unora dintre acestea, cât și pentru motivul menționat anterior, acela de necesitate a cunoașterii detaliilor de infrastructură. Din observațiile personale am determinat că deja dispunem de o bază solidă pentru implementarea unei astfel de aplicații spre folosirea în practică. Principalul exemplu ar fi domeniul de mail pe care studenții îl au deja în cadrul universității, care a servit ca idee pentru structura de autentificare a prototipului aplicației. Nu doar că dispunem deja de acest serviciu, cât și de acela de serviciu de e-mail, precum și de schimbare a parolei (la adresa: http://password.upt.ro ).
Personal, nu am știut despre adresa de e-mail pe care o am în domeniul upt.ro până foarte recent, adresă unde am găsit o groază de mesaje necitite la primul login. Această problemă a fost menționată și în introducere, aceea de slabă informare a studenților cu privire la diferitele facilitați de care dispunem.
Astfel, printre potențialele alte facilitați de care această aplicație ar beneficia sunt:
Încorporarea unui portal de știri relevante din cadrul universitații, precum și alte informații exterioare care i-ar putea interesa pe studenți.
Implementarea unui sistem universal de attendace (”prezentă”) la cursuri (normale sau facultative) / seminarii / laboratoare. Prin acest sistem, evenimentele care definesc orarul ar fi entitați publice, studenții având posibilitatea sa dea ”attend” din aplicație.
Bibliografie
[1] – (21 Aprilie 2016) ”The Global Games Market Reaches $99.6 Billion in 2016, Mobile Generating 37%”
https://newzoo.com/insights/articles/global-games-market-reaches-99-6-billion-2016-mobile-generating-37/
[2] – Eddie Makuch (February 23, 2016) – ”Activision Blizzard Becomes "Largest Game Network in the World" With Candy Crush Dev Buyout”
http://www.gamespot.com/articles/activision-blizzard-becomes-largest-game-network-i/1100-6435014/
[3] – "Android's Google Play beats App Store with over 1 billion apps, now officially largest". Phonearena.com
[4] – John Callaham (29 Septembrie 2015). "Google says there are now 1.4 billion active Android devices worldwide" – androidcentral.com.
[5] – Buschmann, Frank; Meunier, Regine; Rohnert, Hans; Sommerlad, Peter; Stal, Michael (1996-08). Pattern-Oriented Software Architecture, Volume 1, A System of Patterns. Wiley, August 1996. ISBN 978-0-471-95869-7
[6] – ” Transmitting Network Data Using Volley” https://developer.android.com/training/volley/index.html
[7] – ”Android Studio Project Site” – http://tools.android.com/download/studio/stable
[8] – Susan Perschke (23 April 2012). "WampServer delivers a smart, Windows-friendly platform for Apache, MySQL and PHP-based apps".
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Aplicatie Android Pentru Studenti (ID: 109921)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
