Retele Si Servicii de Telefonie Mobila 3g 4g Wireless
Cuprins
Lista figurilor
Lista acronimelor
Introducere
Capitolul 1. Rețele și servicii de telefonie mobilă 3G-4G-Wireless
1.1 Scurt istoric 7
1.2 Prima și a doua generație de rețele mobile 1G, 2G
1.2.1 Limitările rețelei 2G
1.2.2 Arhitectura rețelei GSM
1.2.3 Evoluția rețelei 2G
1.3 A treia generație de rețele mobile 3G
1.3.1 Informații generale
1.3.2 Tehnologii de acces radio în rețelele 3G
1.3.3 Arhitectura rețelei 3G
1.3.4 Evoluția rețelei 3G
1.4 A patra generație de rețele mobile, 4G
1.4.1 Particularități ale rețelei 4G
1.4.2 Tehnologiile rețelei 4G
1.4.3 Dezavantajele rețelei 4G
1.5 Rețeaua wireless
1.5.1 Standardele pentru rețelele locale WLAN
1.5.2 Wireless Metropolitan Area Networks
Capitolul 2. Terminale mobile Smartphone cu sisteme de operare Android
2.1 Informații generale
2.2 Sistemul de operare Android
2.2.1 Arhitectura sistemului de operare Android
2.2.1.1 Componentele arhitecturii Android
2.2.2 Versiuni ale sistemului de operare Android
2.2.3 Tipuri de procese Android 23
Capitolul 3. Mediile integrate și kit-urile de dezvoltare Eclipse respectiv Android Studio
3.1 Mediul integrat de dezvoltare Eclipse
3.2 Android SDK 27
3.3 Etapele elaborării unui proiect Android
3.4 Mediul de dezvoltare integrat Android Studio
3.4.1 Configurarea Android SDK
3.4.2 Crearea unui proiect în Android Studio
3.5 Structura proiectului Android
3.5.1 Componente de activare
3.5.2 Fișierul Manifest
3.5.3 Resursele Aplicației
3.5.4 Proiectele Android
3.5.5 Testul proiectului
3.5.6 Librăria proiectelor
3.6 Emulator Android – Genymotion
3.7 Gradle
3.8 Configurația Grandle Build
3.8.1 Procesul de construire
3.9 Directoare și fișiere
3.10 Fișierul de instalare pe dispozitiv
3.10.1 Crearea unui fișier APK
3.10.2 Formatul unui fișier APK
Capitolul 4. Module de servicii pe bază de localizare
4.1 Categorii de locații
4.2 Servicii pe bază de localizare în sistemul de operare Android
4.2.1 Managerul de locații
4.2.2 Furnizorul de locații
4.2.3 Geocoding
4.3 Tipuri de aplicații ce folosesc module de servicii pe bază de localizare
Capitolul 5. Accesul utilizatorului la servicii multimedia pe bază de localizare
5.1 Instalarea mediul de dezvoltare Eclipse
5.2 Configurarea Android SDK Manager
5.2.1 Librăriile Android
5.2.2 Google API
5.3 Google Maps Android API
5.3.1 Obținerea certificatului Android și cheia Google Maps Key
5.3.2 Adăugarea cheii API în aplicație
5.3.3 Permisiuni necesare
5.3.4 Adăugarea hărții în aplicație
Capitolul 6. Terminal mobil Smartphone, având sistem de operare Android, cu acces la Google Maps
6.1 Introducere
6.2 Diagrama de clasă UML
6.3 JSON
6.3.1 Sintaxa JSON
6.3.2 Android JSON
6.4 YouTube
6.4.1 YouTube API
6.4.2 Configurarea YouTube Data API
6.4.2.1 Obținerea listei de comentarii
6.4.3 Accesul la lista de comentarii
6.4.3.1 Cererea HTTP
6.4.3.2 Răspunsul HTTP
6.5 Android Manifest
6.6 MenuActivity
6.7 MapsActivity
6.7.1 Adăugarea Markerelor
6.7.2 Activitatea unui Marker
6.8 MarkerInfoActivity
6.9 Rularea aplicați
6.9.1 Dispozitiv virtual Motorola Moto X
6.9.2 Dispozitiv Samsung Galaxy Core Prime
Concluzii
Bibliografie
Anexa 1
Anexa 2
Anexa 3
Anexa 4
Lista figurilor
Fig. 1.1 – Evoluția rețelelor mobile
Fig. 1.2 – Standardele rețelei 2G
Fig. 1.3 – Arhitectura rețelei GSM
Fig. 1.4 – Arhitectura rețelei 3G
Fig. 2.1 – Arhitectura sistemului de operare Android
Fig. 2.2 – Primul Smartphone cu Android (HTC Dream)
Fig. 2.3 – Google Nexus S cu Android 2.3
Fig. 2.4 – ASUS Nexus 7 cu Android 4.1
Fig. 3.1 – Instalare ADT plug-in
Fig. 3.2 – Alegerea locației pentru Android SDK în Eclipse
Fig. 3.3 – Android SDK Manager
Fig. 3.4 – Crearea unui proiect în Eclipse
Fig. 3.5 – Deschiderea aplicației Android Studio pentru prima dată
Fig. 3.6 – Alegerea locației pentru Android SDK
Fig. 3.7 – Crearea unui nou proiect Android
Fig. 3.8 – Modul de funcționare al unui Intent
Fig. 3.9 – Procesul de buld al aplicației
Fig. 3.10 – Fișierele și directoarele unui proiect Android
Fig. 3.11 – Câmpul de creare a cheii pentru publicarea aplicației
Fig. 3.12 – Formatul unui fișier APK
Fig. 5.1 – Android SDK Manager – directoarele Tools și Android 5.1.1
Fig. 5.2 – Android SDK Manager – directorul Extras
Fig. 5.3 – Copierea cheii API în fișierul xml
Fig. 5.4 – Generarea cheii Google Maps
Fig. 5.5 – Crearea proiectului în Google Developers Console
Fig. 5.6 – Rularea aplicației și vizualizarea hărții
Fig. 5.7 – Zoom pe hartă și adugarea unui Marker
Fig. 6.1 – Diagrama de clasă UML a aplicației
Fig. 6.2 – Generarea Browser Key pentru YouTube Data API
Fig. 6.3 – API Response
Fig. 6.4 – Activitatea MenuActivity
Fig. 6.5 – Apăsarea butonului YOUTUBE
Fig. 6.6 – Afișarea mai multor Markere pe hartă
Fig. 6.7 – Afișarea link-urilor YouTube
Fig. 6.8 – Afișarea listei de comentarii
Fig. 6.9 – Comentariu adăugat
Fig. 6.10 – Eroare "Nu se poate adăuga text gol"
Fig. 6.11 – Caracteristici tehnice emulator
Fig. 6.12 – Emulator Motorola Moto X
Fig. 6.13 – Dispozitiv Mobil Samsung Galaxy Core prime
Lista acronimelor
1G First Generation – Prima Generație
2G Second Generation – A doua Generație
3G Third Generation – A treia Generație
4G Fourth Generation – A patra Generație
AC Authentication Center – Centrul de Autentificare
ADT Android Development Tools
AIDL Android Interface Definition Language
API Application Programming Interface
APK Android Packege – Pachetul Android
AVD Android Virtual Devices – Dispozitivele Virtuale Android
BSC Base Station Controller – Controllerul Stației de Bază
BSS Base Station Subsystem – Sistem de Stație de Bază
BTS Base Transceiver Station
BWA BroadBand Wireless Access
CDMA Code Division Multiple Access – Acces Multiplu cu Diviziune în Cod
DSL Domain Specific Language
EDGE Enhanced Data Rates for GSM Evolution
EIR Equipment Identity Register – Registru pentru Identitatea Echipamentului
ETSI European Telecommunications Standards Institute
FDD Frequency Division Duplex – Divizare în Frecvență
FDMA Frequency Division Multiple Acces – Acces Multiplu cu Diviziune în Frecvență
GGSN Gateway GPRS Support Node
GMSC Gateway Mobile Switching Center
GPRS General Packet Radio Services
GSM Global System for Mobile Communication
HLR Home Location Register – Registrul de bază al adreselor stațiilor mobile
HSCSD High Speed Circuit Switched Data
HSDPA High Speed Downlink Packet Acces
HSPA High Speed Packet Access
HSUPA High Speed Uplink Packet Accesss
IDE Eclipse Integrated Development Enviroment
IMT-2000 International Mobile Telecommunication-2000
IN Intelligent Services – Servicii Inteligente
IMS IP Multimedia Subsystem
ITU International Telecommunication Union
JDK Java Developement Kit
JRE Java Runtime Enviroment
JSON JavaScript Object Notation
LTE Long Term Evolution
MIMO Multiple Input Multiple Output
MSC Mobile Switching Center – Centrul de Comutație pentru rețeaua mobilă
NFC Near Field Communication
NMT Nordic Mobile Telehone
NSS Network Switching System
OFDM Orthogonal Frequency Division Multiplexing – Multiplexare cu Diviziune în Frecvență Ortogonală
OFDMA Orthogonal Frequency Division Multiple Access – Acces Multiplu cu Diviziune în Frecvență Ortogonală
PDC Personal Digital Cellular
PSTN Public Switched Telephone Network
QoS Quality of Services
RAN Radio Access Network – Rețeaua de Acces Radio
RNC Radio Network Controller – Controllerul Rețelei Radio
RTT Radio Transmission Technology – Tehnologia de Transmisie Radio
SDR Software Defined Radio
SMS Short Message Service
SMSC Short Message Service Center
SGSN Serving GPRS Support Node
TACS Total Access Communication System
TDD Time Division Duplex – Divizare în Timp
TDMA Time Division Multiple Access – Acces Multiplu cu Diviziune în Timp
UMB UltraMobile BroadBand
UML Unified Modeling Language
UMTS Universal Mobile Telecommunications System
UTRA Universal Terrestrial Radio Access
UTRAN Terrestrial Radio Access Networks
VLR Visitor Location Register – Registrul de poziții curente al stațiilor mobile
VMS Voice Mail System
WCDMA Wideband Code Division Multiple Access – Acces Multiplu cu Diviziune în Cod de bandă largă
WLAN Wireless Local Area Network
WPAN Personal Area Network
WMAN Wireless Metropolitan Area Networks
Introducere
Domeniul telecomunicațiilor a absorbit, în ultimii ani, cel mai mare volum al invenstițiilor străine în România, menținându-se ca sector de interes cu un mare potențial de atragere a fondurilor europene.
Cele mai răspândite rețele la ora actuală, care oferă și viteze mari de transmisie a datelor, sunt rețelele de telefonie mobilă 3G și 4G. Am ales să fac un proiect de licență bazându-mă pe vitezele de date oferite utilizatorilor și capabilitățile unui telefon mobil "inteligent".
În zilele noastre, toată lumea deține un Smartphone, un telefon care are "capabilitățile" necesare de a împlini cerințele utilizatorului. Mulți știu să folosească un astfel de telefon, alții îl folosesc doar pentru apeluri, mesaje și, eventual, puțin Internet. Iar unii, cei care fac posibilă interacțiunea unui utilizator cu telefonul său personal, crează aplicații, cum ar fi, jocuri, aplicații de rețete culinare, aplicații care iau știrile sportive de pe toate site-urile de specialitate și le afișează la un loc și așa mai departe, fac în așa fel încât timpul să treacă mult mai repede. De asemenea, se pot face aplicații pentru muzică, personalizarea "ringtonurilor" apelurilor, mesajelor, desktopului telefonului și până la aplicații care îți oferă diferite avantaje de a comunica cu prietenii sau de a-ți putea gestiona mail-urile.
Cei care fac aplicații pentru utilizatori și le pun în Market pentru vânzare sau pur și simplu, descărcare, se numesc dezvoltatori software. La ora actuală, acest job este unul dintre cele mai bune plătite și căutate de pe piață. Multe companii vor să își ofere serviciile prin intermediul unei aplicații destinate exclusiv lor și să ruleze pe sistemul de operare Android pentru că a venit perioada când toată lumea are acces la un Smartphone, iar utilizatorii preferă să se informeze cu ce au mai la îndemână.
Am ales această temă de proiect deoarece este o temă de actualitate, majoritatea oamenilor folosesc serviciile oferite de rețelele mobile, care sunt din ce în ce mai multe și la un preț acceptabil. De asemenea, partea practică a acestui proiect de diplomă constă în crearea unei aplicații pentru platforma Android, fiind cel mai răspândit și utilizat sistem de operare pentru dispozitivele mobile care există la ora actuală pe piață. Acest lucru a însemnat un studiu mai amănunțit în domeniul programării, în afară de ceea ce am studiat în timpul celor patru ani în facultate.
Totodată, consider că odată ce am început să dezvolt aplicații pentru platforma Android, care permite dezvoltatorilor software să scrie cod gestionat în limbajul Java, reprezintă un avantaj.
A crea o aplicație pentru sistemul de operare Android este un început pentru a intra în această lume a programatorilor, care este și va fi de mare succes.
Pentru a întregi proiectul și pentru a demonstra importanța capitolelor de teorie, la partea practică s-a realizat o aplicație Android, ce poate fi instalată pe un terminal Smartphone sau pe un emulator configurat corespunzător. Pentru a putea construi, testa și depana aplicația, am utilizat un mediu de dezvoltare, care se afla în creștere în ceea ce privește numărul de dezvoltatori software care îl folosesc și care îl preferă în locul vechiului mediu de dezvoltare Eclipse, și anume, Android Studio. Întrucât aplicația necesită o conexiune la Internet pentru a încărca harta Google și pentru a determina coordonatele locului unde se află dispozitivul, implicit și utilizatorul, este nevoie să se folosească serviciile oferite de furnizorii de rețele mobile, cum ar fi semnalul repționat de telefon, accesul la Internet și viteze de transfer cât mai mari pentru a încărca toate cele necesare pentru buna funcționare a aplicației.
Astfel, în partea teoretică se vor dezvolta subiecte despre rețele de telefonie mobile, în care se prezintă evoluția acestora de-a lungul anilor și necesitatea de a se implementa mereu ceva nou. În continuare, am discutat despre telefoanele mobile "inteligente" sau Smartphone, care funcționează pe sistemul de operare Android, apoi am dezvoltat subiectul și despre acest sistem de operare. Următorul capitol a avut ca subiect principal cele două medii de dezvoltare, Elipse și Android Studio, cât și Android SDK fără de care nu se putea construi, testa și compila aplicația. De asemenea, am făcut și o introducere a unui program, Genymotion, ce mi-a oferit o gamă mult mai mare de dispozitive virtuale de unde am avut posibilitatea să aleg emulatorul potrivit pe care am putut să îl configurez astfel încât să pot rula aplicația nu doar pe un telefon mobil. Mai departe o să înțelegem ce înseamnă termenul de "locație" și ce procese implică atunci când vorbim despre module pe bază de localizare. Și nu în ultimul rând, despre aplicație, unde o vom descrie detaliat.
Ca o descriere generală a aplicației realizate, aceasta pune la dispoziția unui utilizator o hartă interactivă. Această hartă conține markere care indică un loc, un punct de atracție turistic, ce există în orașul București. Când se va apăsa pe oricare dintre markere, vom avea acces la o listă de link-uri YouTube, care descriu locul respectiv, și lista de comentarii asociată fiecărui link. De asemenea, se poate adăuga un comentariu pentru a putea împărtăți impresii cu alți utilizatori referitoare la acel loc.
Capitolul 1. Rețele și servicii de telefonie mobilă 3G/4G/Wireless
1.1 Scurt istoric
În sistemele mobile, aria de acoperire a unui operator este împărțită în celule. O celulă corespunde ariei de acoperire a unui transmițător sau a unui grup mai mic de transmițătoare. Mărimea unei astfel de celule este determinată de puterea transmițătorului. Conceptul de sisteme mobile este folosit pentru transmițătoarele de mică putere.
Rețelele mobile analogice sunt cunoscute ca fiind prima generație de rețele mobile, First Generation (1G). În mai puțin de un deceniu, sistemele 1G au fost înlocuite cu sistemele Second Generation (2G). Comunicațiile mobile 2G, care integrează sistemele de servicii digitale, au fost gândite cu scopul de a înlocui comunicațiile analogice cu cele digitale. Folosesc o tehnică ce se numește Time Division Multiplexing Access (TDMA), iar principalul sistem folosit în Europa și în alte părți ale lumii poartă numele de Global System for Mobile Communication (GSM) [1].
A treia generație de rețele mobile, Third Generation (3G), avea intenția să ofere mobilitate globală și compatibilitate cu o tehnologie aleasă, înlocuind treptat tehnologia 2G.
Fig. 1.1 ne arată evoluția rețelelor mobile, tehnicile folosite precum și vitezele de transfer. În următoarele subcapitole se va dezvolta fiecare rețea în parte.
Fig 1.1 – Evoluția rețelelor mobile [2]
1.2 Prima și a doua generație de rețele mobile 1G, 2G
Prima generație de rețele mobile, 1G, a apărut la începutul anilor 1980 și se baza pe tehnica de transmisie analogică. La acel moment nu există o dezvoltare standard a sistemului la nivel global (nici măcar la nivel european). Țările din Nord au numit rețeaua Nordic Mobile System (NMT), Marea Britanie și Irlanda au denumit-o Total Access Communication System (TACS). Roaming-ul nu era posibil, iar spectrul de frevențe nu era folosit eficient [3].
Ѕіѕtеmеlе utіlіzatе (ΝΜT, TΑϹЅ) еrau ѕіѕtеmе ϲu рrеluϲrarеa analоgіϲă a ѕеmnaluluі, funϲțіоnând în bеnzіlе dе 450 ΜHz ѕau dе 800-900 ΜHz, au fоѕt dеѕеmnatе ѕub dеnumіrеa gеnеrală dе gеnеrațіa 1 (1G) dе tеlеfonie mоbіlă.
În рrеzеnt, ѕіѕtеmеlе dіn gеnеrațіa 1G ѕunt la fіnalul „ϲarіеrеі”, fііnd ѕϲоaѕе dіn ехрlоatɑrе în multе dіntrе tărіlе în ϲarе au funϲțіоnat.
Cu timpul, Comisia Europeană a început să extindă sectorul comunicațiilor, inclusiv cele mobile. Astfel, a luat naștere a doua generație de rețea mobilă, și anume 2G, care era bazată pe tehnologia digitală. European Telecommunications Standards Institute (ETSI) a dezvoltat standardul rețelei GSM, fiind cea mai răspândită rețea de comunicații mobile din Europa, în anul 1989. Odată cu apariția rețelei la începutul anului 1991, rețeaua GSM a evoluat treptat și pe parcurs a avut cereri de trafic de date și multe alte servicii.
Inițial rețeaua 2G a fost destinată să ofere servicii vocale, având în același timp și o capacitate limitată pentru serviciile de transmisii de date, cu viteză relativ redusă.
Sistemele 2G sunt în prezent la "apogeul" dezvoltării lor. În evoluția 2G se pot pune în evidență trei faze de dezvoltare: 1, 2 și 2+. În faza 2+, GSM oferă posibilitatea creșterii vitezei de transmisie a datelor. Astfel, prin folosirea transmisiei cu pachete de date, prin GPRS, viteza poate ajunge până la 172 kb/s (prin comparație cu viteza de 14.4 kb/s oferită în faza 1 de dezvoltare). Devine, astfel, posibiliă realizarea unor transmisii de timp multimedia.
Fig. 1.2 – Standardele rețelei 2G [4]
Standardele adoptate pentru rețeaua 2G se pot observa în Fig. 1.2. Sistemul IS-136 folosit în America de Nord este bazat pe tehnologia TDMA, pe când IS-95 are la bază tehnologia Code Division Multiple Access (CDMA). IS-136 este folosit în principal în Statele Unite ale Americii, în timp ce IS-95 este folosit atât în Statele Unite ale Americii cât și în Coreea de Sud, iar în Europa rețeaua 2G este reprezentată de către GSM. Țările Europene au dezvoltat un singur Radio Access Network (RAN), iar
rețeaua Core a infrastructurii 2G a înlocuit sistemele radio ale rețelei 1G pentru a putea suporta roming-ul între rețele și între țări. În Japonia, NTT DoCoMo a dezvoltat propria rețea 2G cunoscută sub numele de Personal Digital Cellular (PDC).
1.2.1 Limitările rețelei 2G
Limitările rețelei 2G sunt:
rata de transfer mică – rețelele 2G au fost concepute pentru a oferi servicii de voce. Rata varia în funcție de tehnologie, rata medie fiind de ordinul zecilor de kb/s
eficiență mică pentru serviciul de date
wireless-ul accesat prin rețeaua 2G nu era implementat eficient
existența mai multor standarde [5]
Deoarece există mai multe standarde, un utilizator care folosește rețeaua wireless poate accesa doar rețelele care suportă același standard. Chiar dacă rețeaua 2G avea unele îmbunătățiri față de rețeaua 1G, încă nu se putea vorbi despre o standardizare globală, ci mai degrabă de una semi-globala.
Următoarea etapă în dezvoltarea rețelei GSM a fost introducerea a două platforme: Voice Mail System (VMS) și Short Message Service Center (SMSC). SMSC-ul a avut un mare succes comercial astfel încât în unele rețele traficul SMS constituia o mare parte din traficul total. De asemenea, Intelligent Services (IN) și-au pus amprentele în rețeaua GSM oferindu-le posibilitatea operatorilor să își creeze o gamă largă de servicii, astfel au apărut serviciile "pre-paid" [6].
1.2.2 Arhitectura rețelei GSM
Așa cum putem observa în Fig. 1.3, cele mai importante elemente ale rețelei GSM sunt: Base Station Subsystem (BSS) care cuprinde Base Transreceiver Station (BTS) și Base Station Controller (BSC) și Network Switching Subsystem (NSS) care cuprinde la rândul ei Mobile Switching Center (MSC), Visitor Location Register (VLR), Home Location Register (HLR), Authentication Center (AC) și Equipment Identity Register (EIR).
Fig. 1.3 – Arhitectura rețelei GSM [7]
PSTN – Public Switched Telephone Network
Datorită cerințelor mari de creștere a traficului de date, au fost introduse noi elemente în rețeaua GSM deja existentă, cum ar fi: Serving GPRS (SGSN) și Gateway GPRS (GGSN). Aceste noi elemente au făcut posibilă utilizarea traficului de date pe interfața aer. Se putea atinge o viteză de 150 kb/s în condiții optime și rețeaua a fost denumită Enhanced Data Rate în GSM Environment (EDGE).
PSTN cuprinde liniile telefonice, cablurile de fibră optică, cabluri telefonice pe sub ape etc. Performanțele tehnice a rețelei PSTN aderă la standardele create de ITU-T.
Această rețea oferă serviciile de bază cum ar fi: voce, date de până la 9.6 kb/s, fax, etc. De asemenea, are o extensie pentru rețelele de telefonie fixă.
La început, sistemele GSM au folosit un spectru de frecvențe de 25 MHz în banda de 900 MHz. Acest spectru de frecvențe de 25 MHz era împărțit în 124 de purtătoare de 200 kHz fiecare. Un singur canal radio de 200 kHz era divizat la 8 utilizatori. Rețeaua GSM este văzută ca o combinație de două tehnici de multiplexare numite Frequency Division Multiple Acces (FDMA) și Time Division Multiple Access (TDMA). Mai târziu apar încă două frecvențe de operare a rețelei GSM în banda de 800 MHz și 1900 MHz.
Cu o cerință și mai mare de creștere a traficului de date, s-a ajuns la o viteză de până la 385 kb/s.
1.2.3 Evoluția rețelei 2G
High Speed Circuit Switched Data (HSCSD)
Principiul HSCSD oferă posibilitatea unui canal GSM să furnizeze viteze de 9.6 kb/s sau 14.4 kb/s, iar folosind până la patru canale, a fost obținută o viteză de 57.6 kb/s. Avantajul acestei tehnologii este că nu necesită schimbări majore în arhitectura rețelei.
General Packet Radio Services ( GPRS)
GPRS folosește de la unu la opt canale radio în frecvența de 200 kHz pentru a oferi viteze de până la 172 kb/s. Un avantaj important al acestei tehnologii este faptul că a facilitat transferul către rețeaua 3G.
Enhaced Data Rates for Global Evolution (EDGE)
Folosind o tehnică de modulație mai bună și anume Eight Phase Shift Keying (8PSK) , rata de transfer a rețelei GSM și GPRS a crescut de trei ori. Această îmbunătățire s-a numit EDGE pentru rețeaua GSM și Enhanced GPRS pentru rețeaua GPRS. Folosind EGPRS, s-a obținut o creștere a vitezei de până la 384 kb/s [9].
1.3 A treia generație de rețele mobile 3G
Era nevoie de o rețea care să ofere servicii independente de tehnologie, iar modelul rețelelor să fie standardizat la nivel global; așadar a luat naștere rețeaua 3G.
1.3.1 Informații generale
Rețelele mobile 3G ofеră vіtеzе dе tanѕmіѕіе ѕроrіtă, dе рână la 2 Μb/ѕ (în unеlе varіantе рână la 8 Μb/ѕ) șі рrеzіntă роѕіbіlіtățі multірlе реntru ѕеrvіϲіі multіmеdіa dе ϲalіtatе șі реntru ореrarе în mеdіі dіfеrіtе. Ѕunt ѕіѕtеmе ϲu рrеluϲrarеa dіgіtală a ѕеmnaluluі, ϲе funϲțіоnеɑză în banda de frecvențe dе 2 GHz.
ITU a conceput un plan pentru a implementa o bandă de frecvențe globală în jurul frecvenței de 2000 MHz pentru a suporta o singură cale de comunicare wireless peste tot în lume. Astfel, s-au format două grupuri: grupul UMTS (3GPP) și grupul CDMA2000 (3GPP2).
Exploatarea primelor sisteme 3G a fost realizată în anii 2001-2002, fiind la începutul evoluției. La baza dezvoltării 3G se află sistemele 2G. Astfel, GSM în variantele 2 și 2+ vor fi treptat integrate în 3G, dezvoltarea Universal Terrestrial Radio Acces (UTRA) fiind realizată tocmai pornind de la interfața GSM. Între diferitele sisteme 3G se încearcă, în prezent, realizarea unei compatibilități cât mai bune.
1.3.2 Tehnologii de acces radio în rețelele 3G
3GPP este un parteneriat pentru rețelele 3G bazat pe evoluția rețelei GSM și tehnologiile de acces radio care susțineau rețeaua Core a vechii rețele GSM. Tehnologiile de acces radio pentru 3GPP este cunoscută ca Universal Terrestrial Radio Access Networks (UTRAN) și e bazată pe tehnologia Wideband Code Division Multiple Acces (WCDMA) [4].
Standardul 3G folosit în Europa se numește Universal Mobile Telecommunications System (UMTS). Prima variantă de specificații a UMTS se concentrează asupra schimbării rețelei RAN și mai puțin a schimbării rețelei Core.
3GPP2 este un standard pentru rețeaua 3G care oferă compatibilitate cu IS-95 și se bazează pe tehnologia CDMA2000.
IMT-2000 este un proces global aflat sub conducerea ITU pentru a dezvolta următoarele generații de rețele mobile. Specifică standardele tehnice și alocă frecvențe. Lucrurile pe care se concentrează IMT-2000 sunt:
viteze de transmisii de date mari
suport al transmisiunii de date simetric și asimetric
îmbunătățirea calității vocii în comparație cu rețeaua de telefonie fixă
utilizatorul să poată folosi mai multe servicii simultan
îmbunătățirea securității, capacității și eficienței spectrale
flexibilitatea serviciilor
suport de mobilitate globală între medii de operare diferite
Diferența dintre WCDMA și CDMA2000 este tehnica de acces multiplu folosită. WCDMA folosește două modele de secvență directă CDMA, și anume Frequency Division Duplex (FDD) și Time Division Duplex (TDD). FDD și TDD sunt metodele de separare a traficului din uplink și cel din downlink. Pentru uplink, FDD folosește banda de frecvențe cuprinsă între 1920 – 1980 MHz și pentru downlink banda de frecvențe cuprinsă între 2110 – 2170 MHz. Pe de altă parte, TDD planifică altfel timpul pentru uplink și downlink atunci când se folosește aceeași frecvență.
CDMA2000 folosește FDD CDMA cu purtătoare multiple. Tehnologia CDMA2000 cu o singură purtătoare este cunoscută ca 1 x RTT (Radio Transmission Technology) și oferă viteze de până la 307 kb/s. În cazul purtătoarelor multiple, 3 purtătoare (1.25 MHz fiecare), împreună ating viteze de până la 384 kb/s și este cunoscută ca CDMA2000 3 x RTT [8].
Ultimul obiectiv al ambelor grupuri 3GPP și 3GPP2 este să facă o rețea bazată doar pe Internet Protocol (IP).
1.3.3 Arhitectura rețelei 3G
Componentele importante ale arhitecturii rețelelor 3G includ și se poate observa legătura dintre ele în Fig. 1.4: Base Tranceiver Station (BTS) care a fost denumită NodeB și Radio Network Controller (RNC) care sunt cuprinse în Radio Access Network RAN) și rețeaua Core formată din Serving GPRS (SGSN), Gateway GPRS (GGSN), Mobile Switching Center (MSC), Gateway MSC (GMSC) , IP Multimedia Subsystem.
Fig 1.4 – Arhitectura rețelei 3G [9]
IMS – IP Multimedia Subsystem
GMSC – Gateway Mobile Switching Center
SGSN – Service GPRS Support Node
GGSN – Gateway GPRS Support Node
1.3.4 Evoluția rețelei 3G
Rețeaua 3G a continuat să evolueze, astfel, în anul 2006 s-a făcut trecerea de la rețeaua Universal Mobile Telecommunications System (UMTS) la High Speed Packet Access (HSPA). În primă fază, utilizatorilor li se oferea viteze cuprinse între 1 și 3 Mb/s.
UMTS este standardul rețelei 3G folosit peste tot în lume ca o evoluție a rețelelor de telefoniei mobile GSM deja existente.
HSPA este o tehnologie a generației de telefonie mobilă 3G care are la bază standardele UMTS, oferind viteze de download mai mari. Familia tehnologiilor HSPA este destul de mare, iar cele mai importante sunt: High Speed Downlink Packet Acces (HSDPA), High Speed Uplink Packet Acces
(HSUPA) și HSPA+. HSDPA a fost standardizată in 3GPPP Release 5 cu prima versiune apărută în Martie 2002, iar HSUPA a făcut parte din 3GPP Release6 cu prima versiune apărută în Decembrie 2004. Debitul maxim în HSPA, în terminalele mobile, era inițial de 1.8 Mb/s și după care a crescut la 3.6 și 7.2 Mb/s în timpul anilor 2006 – 2007. HSPA+ mai este numită și rețeaua 3.5G și poate oferi viteze pe care le găsim în rețeaua 4G , cu o viteză de download de 5Mb/s și 8Mb/s.
1.4 A patra generație de rețele mobile, 4G
Cel mai important motiv care a dus la apariția rețelei 4G este de a avea o platformă comună pentru toate tehnologiile care au fost dezvoltate până la momentul actual și care să îndeplinească cerințele utilizatorilor. Această rețea va fi mai puțin costisitoare, iar serviciul de date va fi mult mai rapid.
Studiul rețelei Long Term Evolution (LTE) a fost inițiat de 3GPP în anul 2004 care au îmbunătățit vechea rețea cu o rată de transfer mai mare și o latență mai mică. S-a decis ca tehnica standard folosită să fie OFDM în downlink iar aceasta a fost aprobată în Decembrrie 2007. Dezvoltarea rețelei LTE a continuat cu apariția unor noi servicii în fiecare Release.
Rețeaua LTE este un standard pentru tehnologia de comunicații wireless și o evoluție a standardelor GSM UMTS. Specificațiile LTE oferă rata maximă în downlink de 300 Mb/s și o rată maximă în uplink de 75 Mb/s [10].
LTE- Advanced își propune să ofere rate de transfer mai mari în timp ce se menține acoperirea cu LTE Release 8. Scopul este să ofere o rată de transfer maximă de 1Gb/s în downlink și 500 Mb/s în uplink.
LTE Release 8 este una din primele tehnologii bazate pe OFDM.
1.4.1 Particularități ale rețelei 4G
Caracteristica principală a rețelelor 4G este reprezentată de controlul utilizatorului în privința serviciilor pe care le poate gestiona în funcție de pachetul de servicii la care s-a abonat. Utilizatorul va avea libertatea de a selecta serviciul dorit, cu un indice de calitate dorit, la un preț acceptabil, oriunde și oricând.
1.4.2 Tehnologiile rețelei 4G
Orthogonal Frequency Division Multiplexing (OFDM) și OFDM Multiple Access( OFDMA) transmit date împărțind semnalele radio care sunt difuzate simultan pe diferite frecvențe. OFDMA, folosit în WiMAX, oferă semnale care sunt imune la interferență și pot transporta date cu un debit ridicat. Utilizează puterea mai eficient decât rețelele 3G și folosesc amplificatoare și antene mai mici. Acest lucru înseamnă un cost mai mic a echipamentelor. Tehnologia OFDM este mai "rezistentă" la interferențele între simboluri și poate fi folosită ca tehnologie de acces multiplu și ca schemă de modulație în 4G. OFDM are mai multe utilizări: i) tehnică de transmisie mai eficientă pentru sistemele digitale audio și video difuzate; ii) oferă servicii de bandă largă robuste și fiabile; iii) este mai ușor de implementat ca CDMA de către companiile mai mici (rețelele CDMA au nevoie de ingineri cu experiență)
WiMAX-ul mobil este o specificație IEEE cunoscută și sub numele de 802.16e și concepută pentru a suporta viteze de transmisie de 12Mb/s. Folosește OFDMA și este următoare generație de tehnologie aleasă de mulți furnizori de servicii.
UltraMobile BroadBand (UMB) cunoscută ca CDMA2000 EV-DO, este o tehnologie bazată pe IP care se spune că suportă viteze de 100Mb/s.
Multiple Input Multiple Output (MIMO) este o tehnologie wireless LAN care suportă două sau mai multe semnale radio într-un singur canal radio, mărind, astfel, banda de frecvențe. MIMO poate face asta folosind multiplexarea. Acesta oferă un debit de 15 Mb/s în spectrul de 36 MHz
Long Term Evolution (LTE) este o tehnică de modulație concepută pentru tehnologiile GSM/UMTS care folosesc OFDM și MIMO. Este dezvoltată de 3GPP și se spune că suportă viteze de la 45 Mb/s la 144 Mb/s în rețelele de test din ziua de astăzi.
Software Defined Radio (SDR) se referă la comunicația radio în care modulația transmițătorului este generată de un calculator și receptorul folosește tot un calculator pentru a reface semnalul inițial. Pentru a selecta tipul de modulație dorit, programele trebuie rulate de un microcalculator care controlează atât receptorul cât și transmițătorul(Bedell, 2005). Dat fiind că 4G este o colecție de standarde wireless, ultima versiune 4G va cuprinde toate standardele, iar acest lucru se poate face folosind tehnologia SDR. SDR este o tehnologie de comunicații radio bazată pe protocoale de comunicații wireless în loc de implementările cu fire: bandă de frecvență, protocoale pe interfața aer și funcționalitatea lor poate fi actualizată software în loc de o înlocuire completă la nivel hardware.
Rețelele All IP-based core au multe avantaje: vor fi compatibile, dar și independente de tehnologiile de acces radio actuale. Protocoalele IP radio pot fi concepute pentru a oferi flexibilitate mare în rețeaua de acces, cum ar fi protocoalele 802.11, WCDMA, Bluetooth, CDMA. În ceea ce privește costul, va fi o micșorare considerabilă folosind inter-operabilitatea între echipamentele furnizorilor de servicii.
1.4.3 Dezavantajele rețelei 4G
arhitecturi de acces noi – se cere un studiu mai amănunțit pentru a înlocui arhitecturile de acces nonconveționale cu cele convenționale
probleme legate de spectrul de frecvențe – tot spectrul rețelei 4G nu este alocat în totalitate, de aici și dificultatea proiectării unui sistem wireless fără a cunoaște canalul
complexitatea alocărilor resurselor – managementul timpului, frecvenței și resurselor spațiale într-o multirețea, multiuser nu este deloc ușor
interfața – controlul interfeței de acces multiplu și atenuarea în mediile heterogene (coexistența interfețelor de tip aer, servicii și terminale variate) este o problemă
consumul de putere – consumul de putere în viitoarele terminale 4G multistandard și multifuncționale va crește brusc, astfel încât uzura este compromisă, prin urmare supraîncălzirea devine o problemă
serviciul de calitate (QoS) – cerința utilizatorului: acces la diferite metode de plată, informații de plată în timp real, suport pentru interworking a sistemelor "prepaid"; cerința operatorului: suportul plății pe traficul IP, flexibilitatea calculării costului (timp, volum), managementul relației cu clientul, fiabilitatea operațiilor de plată, detectarea fraudei instant
securitatea – este nevoie proiectarea unui sistem cu o securitate mare care are nevoie de cooperare între: Guvern, furnizorul infrastructurii de rețea, furnizorul de servicii wireless, furnizorul de echipamente wireless, utilizatorul wireless
costuri – costul terminalelor si serviciilor trebuie să fie menținut cât mai mic pentru o implementare "în masă"
1.5 Rețeaua wireless
Tehnologia wireless joacă un rol important în networking și comunicații deoarece oferă două facilități fundamentale: mobilitate și acces. În prezent, IEEE 902.16-2004/802.16e (WiMAX portabil și mobil) și LTE 3GPP sunt două tehnologii radio mobile de bandă mare.
Principalele caracteristici ale unei rețele wireless ideale sunt:
abilitatea de a furniza servicii de voce, audio și video pe lângă serviciul de date
să permită dispozitivelor cu diferite prețuri și consum de putere mic să comunice între ele
să aloce un spectru de frecvențe eficient și dinamic între dispozitive
Din punct de vedere istoric, ca și în cazul rețelelor cu fir, implementarea tehnologiei wireless a avut două servicii importante: voce și date. Vocea a fost cea dintâi implementată, urmată apoi de serviciul de date.
Toate standardele wireless au fost dezvoltate de către IEEE 802 "Working Groups". Aproape toate tehnologiile wireless suportă rate de transfer multiple, de exemplu, IEEE Std 802.11b suportă o rată de transfer de 1 Mb/s, 2 Mb/s și 5.5 Mb/s, IEEE Std 802.11a suportă o rată de transfer cuprinsă între 6 Mb/s și 54 Mb/s. Pentru a îndeplini condiția b) pentru cazul rețelelor wireless ar trebui ca dispozitivele IEEE Std 802.11a care pot comunica numai la 6 Mb/s să coste la fel ca dispozitivele care pot comunica la 54 Mb/s.
Spectrul de frecvențe eficient și dinamic este necesar deoarece spectrul electromagnetic este limitat și împărțit cu alte dispozitive wireless. Protocoalele folosite au capacitatea de a detecta dacă o bandă de frecvențe este folosită de un alt dispozitiv, iar în acest caz să poată face realocarea la o altă bandă de frecvențe. Chiar și așa, standardele nu au o flexibilitate completă, de exemplu, dispozitivele IEEE 802.11a care comunică numai la 6 Mb/s ocupă aceeași bandă pe care o ocupă un dispozitiv care comunică numai la 54 Mb/s.
Cum nu se poate implementa o rețea wireless ideală, s-a ajuns la trei tehnologii diferite, fiecare proiectată cu un anumit scop: Wireless Local Area Network (WLAN), Wireless Personal Area Network (WPAN) și dispozitivele BroadBand Wireless Access (BWA), numite, de asemenea, și Wireless Metropolitan Area Networks (WMAN).
Rețelele WPAN sunt realizate pentru comunicațiile de arie mică – aproximativ până la 10 m. Rețelele WLAN sunt făcute să funcționeze până la 100 m. Rețelele WMAN sunt construite pentru distanțe mai mari – până la câțiva kilometri.
1.5.1 Standardele pentru rețelele locale WLAN
Standardul 802.11b – lansat în anul 1999, atinge o viteză de 11Mb/s. La capitolul interoperabilitate cu alte standarde, un echipament 802.11b poate comunica cu unul 802.11g, dar nu cu unul 802.11a. Din cauza vitezei scăzute, acest standard nu se pretează la rețele mai mari.
Standardul 802.11a – este singurul din familia de protocoale WLAN, care operează în frecvența de 5 GHz, oferind o viteză de 54 Mb/s. Pentru a putea oferi o viteză mai bună decât Standardul 802.11b la o frecvență mai mare, acesta folosește o modulare avansată a undei purtătoare de semnal, numită Multiplexare cu Divizare în Frecvență Ortogonală (OFDM). O consecință a faptului că operează la frecvențe mari este folosirea acestui standard în medii unde se dorește o securitate sporită la nivel fizic.
Standardul 802.11g – lansat în anul 2002, combină avantajele 802.11a (viteza de 54 Mb/s) cu avantajele 802.11b (rază mare de acoperire). Datorită faptului că s-a păstrat compatibilitatea cu 802.11b, s-a putut realiza o trecere mai ușoară de la 802.11b la 802.11g prin înlocuirea treptată a echipamentelor.
Standardul 802.11n – IEEE a creat în anul 2003 un grup de lucru pentru dezvoltarea unui proiect care să rezolve nevoile tot mai mari de viteză și stabilitate ale utilizatorilor și se aștepta să fie finalizat în decursul anului 2008. Acesta își propune să ofere o viteză de 600 Mb/s și o rază de acoperire de 2-4 ori mai mare decât a standardelor de până atunci. Pentru a crește performanțele, standardul se bazează pe tehnologia MIMO care folosește un sistem de antene pentru transmisia și recepția datelor.
1.5.2 Wireless Metropolitan Area Networks
În general, se presupune că nu există implementări de wireless MAN, sau că există, dar în număr foarte mic. Funcționează cu protocoale dezvoltate intern de către firmele ce dețin rețeaua și din cauza faptului că fiecare companie își dezvoltă propriul set de regului, acestea nu pot comunica între ele. Singurul standard wireless dezvoltat pentru MAN este 802.26e, sau WiMAX (Worldwide Interoperability for Microwaves Access).
În cazul rețelelor WiMAX se poate atinge o viteză de până la 70 Mb/s, aria de acoperire a unei stații de bază este de până la 50 km, cel puțin în mod teoretic. În mediul urban este posibilă o acoperire de 2-5 km pentru WiMAX Mobil [12].
Capitolul 2. Terminale mobile Smartphone cu sisteme de operare Android
2.1 Informații generale
Un Smartphone este un telefon mobil cu un sistem de operare avansat, ce permite instalarea aplicațiilor complexe și personalizarea interfeței grafice. Un astfel de telefon mobil este dotat în cele mai multe cazuri cu un ecran sensibil la atingere, mai mare de 3'. Pe lângă aceasta, un smartphone nu dispune, de obicei, de o tastatură fizică. Dacă ea este oferită de producător vine în format slider și este de tip QWERTY [13].
Din punct de vedere al componentelor hardware, un smartphone vine cu un chipset performant. Acesta include procesorul și chipset-ul grafic dedicat. Procesoarele integrate în majoritatea smartphone-urilor au unul, două sau patru nuclee și sunt tactate la frecvențe ce variază între 600 MHz și 1,5 GHz.
Android este sistemul de operare mobil care are la bază Linux și care a fost dezvoltat de către Google. Are o interfață cu utilizatorul bazată pe manipulare directă făcută pentru dispozitivele touchscreen cum ar fi: Smartphone, tablete și alte dispozitive.
În zilele noastre, sistemul Android este cel mai răspândit sistem de operare de pe piața terminalelor mobile Smartphone. Acest sistem a fost vândut mai mult ca Windows, iOS și MAC, toate la un loc. În prezent, Google Play Store are peste un milion de aplicații și peste 50 de bilioane de descărcări. Un studiu al pieței a arătat că peste 71% din dezvoltatori fac aplicații pentru Android care se conectează direct la peste un bilion de utilizatori Android activi de peste tot în lume. Android este cunoscut în companiile care au nevoie de un sistem gata făcut și la un preț redus. Mai mult decât atât, poate fi personalizat pentru dispozitivele cu tehnologie înaltă numite "high tech" [14].
2.2 Sistemul de operare Android
Telefoanele mobile, ca orice calculator, au nevoie de un sistem de operare. Poate fi ceva simplu care să permită doar efectuarea apelurilor sau poate fi extrem de performant care să ofere servicii care pot fi făcute și pe un calculator.
Android este un sistem de operare pentru telefoanele mobile care nu oferă doar accesul la Internet, ci oferă și posibilitatea de a concepe propriile aplicații pentru telefon. Este un sistem de operare care a fost conceput pentru a crește inovația pe dispozitivele mobile și pentru a încuraja creativitatea dezvoltatorilor sistemului. Această creativitate este încurajată și datorită faptului că sistemul Android este "open source".
Definiția sintagmei "open source", pe înțelesul tuturor, este posibilitatea ca oricine să aibă acces la codul sursă, cel care se află în spatele software-ului, să îl citească și să îl îmbunătățească [14].
Unele platforme Software, cum ar fi Windows, sunt scrise în limbaj de cod simplu. Acest cod este rulat printr-un compilator pentru a putea fi citit și de către calculator. Totul depinde de ce licență se utilizează. Licențele "open source" permit utilizatorilor să facă diferite lucruri, de exemplu, unele schimbări care trebuie făcute la nivel software trebuie distribuite și puse în software pentru ca alți utilizatorii să le poată descărca.
Licența Apache v2 permite producătorilor de telefoane și furnizorilor de servicii de telefonie mobilă să facă schimbări la nivel software fără să le ofere și altor producători.
De exemplu, un telefon HTC cu sistemul Android va arăta și funcționa diferit față de un telefon Samsung cu Android. De asemenea, un telefon HTC cu Android din rețeaua T-Mobile nu va fi exact ca un telefon HTC cu Android din rețeaua Vodafone.
Cu toate acestea, telefoanele care funcționează cu sistemul de operare Android au aceleași caracteristici. De exemplu, toate telefoanele Smartphone vin cu un desktop care e format din mai multe ecrane, iar numărul acestora variază între 3 și 7 ecrane și pot fi personalizate. Posibilitatea de personalizare a ecranului este un plus deoarece nu toate telefoanele Smartphone oferă flexibilitate atunci când vine vorba de personalizare a desktopului telefonului [13].
Android se comportă ca un sistem de operare Linux pentru dispozitive mobile. Mai mult de 80 de companii harware, software și telecom au încheiat o înțelegere cu Google care s-a numit Open Handset Alliance. Această înțelegere este făcută între companii mari cum ar fi: HTC, Google, Intel, LG, Motorola, Nvidia, Samsung, T-Mobile, Texas Instruments. Dezvoltatorii software ai acestei înțelegeri au scris aplicații într-o versiune specială de Java. Un cod Android este open-source aflat sub licența Apache și a fost dezvoltată de către Google. Ulterior, Google a lansat un magazin online numit Google Play din care se pot descărca aplicații Android. Mai târziu, s-au alăturat și ale companii de calculatoare acestei alianțe, Open Handset. Sistemul de operare Android suportă multitouch și Bluetooth prin intermediul căruia poți transmite contactele între două telefoane mobile. De asemenea, oferă multitasking care oferă posibilitatea telefonului să fie folosit pe post de wireless Wi-Fi. Se pot face screenshot-uri apăsând simultan pe butonul de pornire și pe cel de blocare. Totodată, suportă carduri de memorie externă, are slot pentru microSD.
În ciuda faptului că a fost creat pentru dispozitivele mobile, Smarphone-uri și tablete, acesta poate fi folosit și pe alte sisteme cum ar fi: netbooks, smartbooks, e-books readers [15].
2.2.1 Arhitectura sistemului de operare Android
Una din caracteristicile unice a sistemul de operare Android este aceea că are un software "open source". Se poate downloada tot codul sursă a unui sistem de operare Android, care ocupă aproximativ 2.6 GB. Teoretic, acest lucru permite oricui să umble la interfață și să construiască un telefon pe care să ruleze Android. Ideea de a avea un software "open source" a fost concepută până la versiunea 3.0. Versiunile Android de la 3.0 în sus sunt în continuare "closed source" [14].
2.2.1.1 Componentele arhitecturii Android
Arhitectura o putem observa în Fig. 2.1 și este împărțită în următoarele componente:
Linux Kernel
Librăriile
Android Runtime
Framework-ul Aplicației
Nivelul de Aplicații
Fig. 2.1 – Arhitectura sistemului de operare Android [16]
Linux Kernel
Android rulează pe cel mai de sus nivel kernel din Linux 2.6. Acesta este primul nivel software care interacționează cu hardware-ul dispozitivelor. Similar ca un desktop de calculator care rulează în Linux, Kernel-ul Android este responsabil cu gestiunea puterii și a memoriei, a driverelor dispozitivelor de intrare/ieșire, gestiunea proceselor, a rețelei și a securității. Kernel-ul Android este disponibil la adresa http://android.git.kernel.org/ [16].
Ca dezvoltator software nu ar trebui luat în considerare modificarea sau construirea unui kernel. În general, producătorii hardware sau de dispozitive vor să modifice kernel-ul pentru a asigura funcționalitatea sistemului de operare în conformitate cu tipul lor de hardware.
Bibliotecile
Componentele bibliotecilor se comportă ca un nivel de traducere între Linux kernel și framework-ul aplicației și conțin codul care oferă principalele funcționalități ale sistemului de operare Android. Librăriile sunt scrie în C/C++ dar sunt la dispoziția dezvoltatorilor software prin intermediul unui Java API. Programatorii pot folosi framework-ul aplicației Java pentru a accesa codul de bază C/C++ al librăriilor.
Sunt incluse:
motorul open-source pentru navigare WebKit
biblioteca FreeType – pentru suportul seturilor de caractere
baza de date SQLite – utilizată atât ca spațiu de stocare cât și pentru partajarea datelor specifice aplicațiilor
biblioteca libc – bliblioteca de sistem C optimizată pentru dispozitivele mobile bazate pe Linux
bliblioteci pentru redarea și înregistrarea de conținut audio/video
biblioteci SSL – pentru asigurarea securității pe Internet [[16],[17]]
Android Runtime
Este reprezentat de:
un set de biblioteci de bază – care permit utilizatorilor să dezvolte aplicații Android folosind limbajul de programare Java; acestea includ acces la funcțiile telefonului (telefonie, mesaje, resurse, locații), interfața cu utilizatorul [17]
mașina virtuală Dalvik a fost optimizată special pentru Android pentru a permite executarea aplicațiilor pe dispozitive cu resurse foarte limitate. În mod obișnuit, telefoanele mobile întră în această categorie deoarece sunt limitate de puterea de procesare, memoria disponibilă și timpul de viață scurt al bateriei.
Componenta de execuție constă în mașina virtuală Dalvik cu care va interacționa și va rula aplicațiile. Mașina virtuală este o parte importantă a sistemului de operare Android.
O mașină virtuală este un sistem de operare izolat, un "vizitator" care rulează în alt sistem de operare "gazdă". Mașina virtuală va executa aplicațiile ca și când ele rulează pe o mașină fizică. Unul din principalele avantaje a mașinii virtuale este portabilitatea. Ca programator, exită avantajul că poți scrie codul doar o singură dată și se poate executa pe orice platformă hardware care rulează pe o
mașina virtuală compatibilă [16]. De asemenea, permite ca fiecare aplicație Android să ruleze în procesul propriu, într-o instanță a mașinii virtuale Dalvik.
O mașină virtuală Dalvik execută fișiere .dex. Un fișier .dex este format din compilarea fișierelor Java .class sau .jar.
Framework-ul aplicației
Aplicațiile Android sunt rulate și gestionate cu ajutorul unui framework al aplicației Android. Este responsabil pentru performanțele funcțiilor esențiale, cum ar fi: managementul resurselor, apeluri etc. Expune diferitele funcționalități ale sistemului de operare Android către programatori, astfel încât aceștia să le poată utiliza în aplicații. Framework-ul Android include următoarele:
managerul activității – serviciul controlează toate aspectele timpului de viață al aplicației și stiva de navigare a utilizatorului
furnizorii de conținut – acest serviciu permite aplicațiilor să publice și să împartă date cu alte aplicații (exemplu: contactele dn telefon)
managerul de resurse – acest serviciu oferă acces la resurse încorporate fără cod cum ar fi: strigs, setările de culoare, layout-ul interfaței cu utilizatorul
managerul de notificări – acest serviciu permite aplicațiilor să afișeze alerte și notificări utilizatorului
sistemul de vizualizare – acest serviciu oferă un set extensibil de views care sunt folosite pentru a crea interfețele cu utilizatorul
managerul pachetului – sistemul prin intermediul căruia aplicațiile pot să găsească informații despre alte aplicații care sunt instalate în dispozitiv
managerul telefoniei – acest serviciu oferă informații aplicației despre serviciile telefonice disponibile pe dispozitiv cum ar fi informații despre abonat
managerul locației – acest serviciu oferă acces la serviciile de locație care permit aplicației să primească update-uri despre schimbarea locației
Nivelul de Aplicații
Componenta aplicației a unui sistem de operare Android este cea mai apropiată de utilizatorul final. Aici este locul unde se află aplicațiile care sunt livrate odată cu dispozitivul mobil (Contacte, Camera, Calculator etc) cât și produsele instalate de pe Google Play Store sau cele dezvoltate de programatori. Ca dezvoltator software, produsul final se va executa în acest spațiu folosind librăriile API și mașina virtuală Dalvik.
Există două tipuri de aplicații:
aplicații de sistem – sunt aplicații care sunt pre-instalate pe telefon și care rămân în telefon. Aplicațiile cum ar fi , motorul de căutare Internet principal, e-mail, contacte și așa mai departe sunt exemple de aplicații de sistem. Acestea nu pot fi dezinstalate sau schimbate de către utilizator. De obicei se găsesc în directorul /system.
aplicații instalate de utilizator – sunt aplicații care sunt descărcate și instalate de către utilizator de pe platforme diferite cum ar fi Google Play. Google Play este magazinul de aplicații oficial
pentru sistemul de operare Android. Aici utilizatorii pot căuta și downloada aplicații. Aceste aplicații se găsesc în directorul /data [16].
2.2.2 Versiuni ale sistemului de operare Android
Android 1.5 Cupcake – primul pas important care a fost făcut odată cu lansarea acestei versiuni a constat într-o îmbunătățire care oferea sistemului o stabilitate mai mare. De asemenea, au fost introduse Widget-uri, iar pentru prima dată, utilizatorul avea posibilitatea să instaleze o tastatură personalizată și se putea folosi funcția Copy/Paste. Primul smartphone care a rulat sistemul de operare Android a fost HTC Dream (Fig. 2.2)
Fig. 2.2 – Primul Smartphone cu Android (HTC Dream)
Android 1.6 Donut – a fost lansat după 4 luni și nu a avut îmbunătățiri majore, dar totuși, a fost implementată funcția de "screenshot" și , de asemenea, să se poată selecta mai multe elemente din Galerie pentru a fi șterse [16]. Pentru prima dată, sistemul de operare suportă diferite dimensiuni ale ecranului.
Android 2.0 și 2.1 Eclair – o îmbunătățire importantă a fost sistemul de sincronizare a contactelor și posibilitatea de a putea adăuga adresa de Email la contacte. Totodată, a fost realizată o aplicație pentru Email unde pot exista mai multe conturi Google de email. Camera a fost îmbunătățită cu bliț și zoom. Interfața cu utilizatorul a fost și ea actualizată: folosirea scroll-ului mai rapid și imagini live pe desktop, suport pentru Bluetooth 2.1. Telefoanele sunt dotate cu navigație Google Maps.
Android 2.2 Froyo – această actualizare a fost creată doar pentru a crește performanțele sistemului, sistemul solicită tot mai puține resurse, iar viteza de lucru este mai mare. De asemenea, motoarele de căutare Internet pot suporta GIF și Flash Player. Utilizatorii pot decide dacă doresc instalarea aplicației în memoria internă a telefonului sau pe un card de memorie.
Android 2.3 Gingerbread – telefonul mobil Google Nexus S (Fig. 2.3) a fost primul telefon care a lansat această versiune. Ca noutate a fost introducerea de noi senzori: Near Field Communication (NFC) care pregătește smartphone-urile pentru plățile de pe mobil, Gyro și Barometru.
Android 3.0 Honeycomb – această versiune a fost mai mult pentru tablete, iar primul dispozitiv care a lansat această actualizare a fost Motorola Xoom. Aduce elemente noi pentru interfața cu utilizatorul, de exemplu, bara de notificări concepută pentru tablete.
Android 4.0 Ice Cream Sandwich – a fost lansat alături de un dispozitiv popular și anume Samsung Galaxy Nexus. Această versiune a înlocuit orice buton fizic cu echivalentele lor software, iar utilizatorii aveau posibilitatea de a debloca telefonul doar privind ecranul.
Fig. 2.3 – Google Nexus S cu Android 2.3 Fig. 2.4 – ASUS Nexus 7 cu Android 4.1
Android 4.1 – 4.3 Jelly Bean – a fost lansat cu telefonul ASUS Nexus 7 (Fig. 2.4). Ca îmbunătățiri putem vorbi despre posibilitatea de a avea widget pe ecranul blocat și setări rapide în bara de notificări. Un update important a constat în îmbunătățirea interfeței cu utilizatorul.
Android 4.4 KitKat – putem vorbi de îmbunătățiri pentru editare de poze, comanda "OK Google". Indicatorii pentru date mobile și WiFi au fost introduși în setările rapide [19].
Android 5.0 Lollipop – este ultima versiune apărută. Google a făcut o schimbare în platformă și a înlocuit mașina virtuală Dalvik cu Android Runtime (ART) pentru îmbunătățirea performanței aplicațiilor.
2.2.3 Tipuri de procese Android
Toate componentele unei aplicații vor rula într-un singur proces și, în general, pentru majoritatea aplicațiilor nu este nevoie de procese adiționale. Atunci când o aplicație pornește și nu are deja componente care rulează, Android va crea un proces UNIX nou pentru acea aplicație care va conține un singur fir de execuție (thread). Toate componentele care vor porni ulterior vor rula în acel thread, denumit și „main thread” sau „UI thread”. Vom discuta despre el mai jos, în detaliu [18].
Android are autoritate asupra proceselor care rulează și poate decide la un anumit moment să închidă un anumit proces care poate fi chiar cel al aplicației noastre. Motivele pot varia, dar principala cauză are legătură cu memoria care poate deveni insuficientă și este necesară eliberarea ei. În decizia de a opri un proces, Android ia în considerare mai multe aspecte, de exemplu, dacă are sau nu componente vizibile pe ecran.
Procesele sunt clasificate în cinci nivele în funcție de importanță. Atunci când unele procese trebuie terminate, cel cu nivelul mai mare de importanță va fi închis ultimul.
Pe scurt, ele sunt:
1. Foreground Process – un proces necesar pentru ceea ce utilizatorul face la un moment dat, de exemplu un "activity" care e folosit de utilizator sau un serviciu care e legat de activitatea cu care utilizatorul interacționează.
2. Visible Process – un proces care nu are componente vizibile pe ecran, dar este necesar pentru componentele cu care interacționează utilizatorul, cum ar fi un proces cu un activity care nu e în față, dar are un dialog pornit în prim-plan.
3. Service Process – un proces care conține un serviciu și nu e esențial pentru ceea ce este afișat utilizatorului, cum ar fi un serviciu care redă un MP3 în fundal în timp ce utilizatorul folosește alte aplicații.
4. Background Process – un proces care conține o activitate care momentan nu e vizibilă utilizatorului. Pentru aceasta, există o listă LRU ("least recently used") care este luată în considerare în importanța unui proces.
5. Empty Process – un proces care nu are componente active și este pornit doar din motive de "caching" sau pentru a îmbunătăți timpul de start-up al unei aplicații.
Capitolul 3. Mediile integrate și kit-urile de dezvoltare Eclipse respectiv Android Studio
3.1 Mediul integrat de dezvoltare Eclipse
Eclipse are propriile nomenclaturi în spatele cărora se află conceptele care sunt esența înțelegerii acestui program. Aceste concepte au fost dezvoltate pe o perioadă mare de timp începând cu anii 1985. Implementarea curentă a programului Eclipse este scrisă în limbaj Java, bazat pe un framework numit Equinox.
Când se setează "uneltele" de dezvoltare software Android, se instalează plug-in-urile în Eclipse: plug-ins Android Development Tools (ADT) , ca în Fig. 3.1. Se selectează Help->Install New Software, se apasă butonul Add. În noua căsuță apăruta se trece la nume "ADT Plugin" sau oricare alt nume se dore;te iar la URL se scrie site-ul https://dl-ssl.google.com/android/eclipse/. Se apasă OK și se instalează plug-in-ul [20].
Fig. 3.1 – Instalare ADT plug-in
Android SDK adaugă două plug-ins în Eclipse: com.android.ide.eclipse.adt și com.android.ide.eclipse.ddms [21].
Configurarea plug-in-ului ADT se face specificând locația drectorului Android SDK. Se întră în meniul Windows->Preferance->Android, iar la SDK Location se pune locația unde s-a instalat Android SDK. Acest lucru se poate vedea în Fig. 3.2, locația SDK fiind în D:\Android\SDK.
Fig. 3.2 – Alegerea locației pentru Android SDK în Eclipse
Spațiul de lucru
Prima oară când se deschide Eclipse, acesta va întreba utilizatorul dacă se poate crea un spațiu de lucru (workspace). Ulterior, când se deschide Eclipse, pornește de acolo de unde s-a închis ultima dată, cu toate proiectele, fișierele și imaginile așa cum au fost lăsate, acest lucru fiind posibil citind starea precedentă a spațiului de lucru. Eclipse implementează spații de lucru folosind directoare.
Fiecare proiect aparține unui spațiu de lucru. În mod implicit, proiectele noi sunt directoare create în interiorul directorului spațiului de lucru. Chiar dacă se crează un proiect dintr-o sursă care nu se află în spațiul de lucru, cea mai mare parte a informațiilor despre acel proiect sunt ținute în spațiul de lucru.
Spațiile de lucru sunt independente. Setările care se fac în interiorul unui "workspace" rămân în acel spațiu de lucru. Se pot folosi spații de lucru multiple pentru a separa proiectele care au ca target platforme diferite, de exemplu proiecte Rails și proiecte Android [21].
Mediile Java
Există trei medii diferite Java care se folosesc în dezvoltări software Java în Eclipse:
Java Runtime Enviroment – acest prim mediu este cel în care insuși programul Eclipse rulează.
Compilatorul Java – acesta este folosit pentru a compila programul. Eclipse are integrat propriul compilator Java.
Execuția aplicației – în acest mediu aplicația rulează – în acest caz, într-unul din emulatoarele Android. Trebuie setate unul sau mai multe dispozitive virtuale Android (Android Virtual Devices (AVD)). Când se crează un nou proiect Android, acesta trebuie asociat cu unul din dispozitivele virtuale Android.
Proiecte
Pentru dezvoltatorii software, proiectele Eclipse corespund programelor pe care le-au dezvoltat. Pentru dezvoltatorii software Android, acestea corespund aplicațiilor Android. În Eclipse, în proiectele Android create este vorba despre cum plug-in-urile din Eclipse știu pe ce software pot opera: atunci când se crează un proiect Android, proiectul include informații pe care Eclipse le folosește pentru a selecta codul diferitelor plug-ins pentru a efectua diverse operații. Plug-ins ADT vin în ajutor pentru a crea proiectul cu setul potrivit de fișiere și structura directorului pentru o aplicație Android. Atunci când se lucrează cu fișiere într-un proiect Android, se folosesc editorii potriviți în momentul când se deschide fișierul XML cum ar fi layout și manifest-ul. În situația când se modifică, în proiect, fișiere se apelează constructorii potriviți pentru a rula aplicația.
Extensiile
Acestea se află în toate locurile unde plug-in-ul extinde funcționalitatea programului Eclipse. Extensiile nu se pot manipula sau schimba, acest lucru fiind imposibil și pentru un dezvoltator software Android. De exemplu, extensia numită org.eclipse.core.resources.builders cuprinde Android Resource Manager, Android Pre Compiler și Android Package Builder. Acestea sunt extensiile de care sunt nevoie pentru a procesa resursele Android, a precompila AIDL (Android Interface Definition Language) în codul Java și modifică fișierele .class , care sunt create folosind constructorul Java, în fișiere .dex precum și ajută la construirea fișierului .apk, care poate fi lansat într-un dispozitiv Android sau AVD [21].
3.2 Android SDK
Android SDK este un set de "tool"-uri de dezvoltare folosite pentru crearea aplicațiilor pe platforma Android. Acesta include următoarele:
librării
debugger
emulator
documentații importante pentru Android APIs (Applications Program Interfaces)
modele de coduri sursă
tutoriale pentru sistemul de operare Android
În Fig. 3.3 se poate observa Android SDK Manager în care se văd fișierele Tools și ultima veriune de Android 5.1.1, respectiv API 22.
Android SDK este folosit împreună cu alte două programe software: Java Developement Kit (JDK) și Eclipse Integrated Development Enviroment (IDE) . Aceste două sisteme nu fac parte din Android SDK din cauza faptului că se pot folosi și în alte scopuri decât programare în Android sau pot fi deja instalate în sistemul de operare. Deoarece aplicațiile Android sunt scrise în cod Java, un utilizator ar trebui să aibă instalat JDK. Android SDK este folosit pentru a scrie programe Android în fereastra de comandă, iar cea mai utilizată metodă este de a folosi un IDE. Se recomandă a se folosi Eclipse, instalându-se plug-in-ul ADT sau mediul de dezvoltare Android Studio [22].
Android SDK este compatibil cu versiunile recente de JDK și Eclipse IDE sau Android Studio. Cea mai bună alegere este să fie instalate ultimele versiuni ale acestor două programe
.
Eclipse suportă cele mai multe echipamente Android SDK și alte plug-in și, de asemenea, este cel mai folosit în programarea Java.
Fig. 3.3 – Android SDK Manager
Totodată, furnizează librăriile API și "tool"-urile necesare dezvoltării de a construi, a testa și a depana aplicația pentru Android. ADT Bundle pornește dezvoltarea aplicațiilor. Include componentele esențiale din Android SDK și o versiune IDE Eclipse în care este inclus și Android Developer Tools (ADT).
De fiecare dată când Google lansează o nouă versiune de Android, se lansează și o versiune corespunzătoare de SDK. Pentru a putea construi programe cu ultimele noutăți, dezvoltatorii software trebuie să downloadeze și să instaleze versiunea SDK pentru telefonul folosit.
Platformele de dezvoltare care sunt compatibile cu SDK includ sisteme de operare, cum ar fi Windows (XP sau mai noi), Linux și Mac OS X (versiunea 10.4.9 sau versiuni mai recente). Componentele Android SDK pot fi descărcate separat.
Pentru a putea începe crearea unei aplicații, trebuie mai întâi instalate următoarele:
Kitul de dezvoltarea Java JDK – oferă echipamente folosite pentru dezvoltarea programelor Java, cum ar fi compilatorul Java. Acesta mai conține și Java Runtime Enviroment (JRE) care permite programelor Java să funcționeze pe calculator.
Eclipse Integrated Development Enviroment (IDE) – Eclipse este folosit ca un IDE pentru scriere, testare, debugging software, software Java.
Android SDK – este o colecție de fișiere: librării, executabile, documentații.
SDK conține unul sau mai multe fișiere pentru echipamente: unul numit "tools" , începând cu versiunea 8, iar cel de-al doilea numindu-se "platform-tools". Aceste fișiere trebuie să se afle pe o anumită direcție. Această direcție este o listă de fișiere pe care sistemul de operare o caută pentru fișiere executabile atunci când se apelează un executabil din linia de comandă [21].
3.3 Etapele elaborării unui proiect Android
Fig. 3.4 exemplifică pașii explicați mai jos pentru crearea unui proiect în mediul de dezvoltare Eclipse.
Numele proiectului (Project Name) – numele care va apărea în Eclipse
Numele aplicației (Application Name) – reprezintă numele aplicației pe care o vor vedea utilizatorii
Numele pachetului (Package name) – crează un pachet "namespace" Java care identifică pachetele din aplicație, și trebuie să identifice în mod unic toată aplicația Android peste toate celelalte aplicații instalate. Conține un nume de domeniu unic și un nume specific aplicației
Versiunea minimă SDK – ar trebui să corespundă cu nivelul API ales anterior
Numele țintă (Target Name) – Imaginile sistemului Android care au fost instalate în SDK. Se alege unul dintre aceste imagini , platforma, versiunea Android OS, nivelul API pentru care aplicația va fi construită. Platforma și nivelul API sunt cei mai importanți parametrii: controlează librăria platformei Android unde va fi compilată aplicația și nivelul de API pe care îl suportă – prograrmul nu va suporta un nivel API mai mare decât cel ales inițial. Se alege cea mai recentă versiune de Android OS și nivel API instalat.
Fig. 3.4 – Crearea unui proiect în Eclipse
Spațiul de lucru (Workspace) – este un folder care conține mai multe proiecte Eclipse. Atunci când se crează un nou proiect, trebuie ales locul unde se va salva.
Instalarea Dispozitivului virtual Android AVD – Android SDK oferă un emulator pentru a rula programe Android de pe un calculator. AVD este un set de parametrii pentru acest emulator care îl configurează pentru a folosi imagini particulare – este o versiune a sistemului de operare Android. Pentru a seta alți parametrii , pentru dimensiunea ecranului, dimensiunea memoriei și alte caracteristici hardware, se crează un AVD care să nu aibă o imagine a sistemului de operare mai recentă decât targetul specificat atunci când s-a creat proiectul.
3.4 Mediul de dezvoltare integrat Android Studio
Android Studio este un nou mediu de dezvoltate Android care are la bază IntelliJ IDEA. Oferă noi caracteristici și îmbunătățiri față de Eclipse ADT. O parte din aceste caracteristici sunt:
Grandle flexibil – sistemul de bază pentru construire a aplicației
variante de construire și generații de APK mai multe
Template-uri mai multe care suportă Google Services și mai multe tipuri de dispozitive
Editor de layout mult mai bogat cu suport pentru editarea temei aleasă
"tool"-uri pentru performanță, compatibilitatea versiunii și alte probleme
ușurința de a integra Google Cloud și motorul de aplicație
Pachetul Android Studio include: Android Studio Beta, Android SDK cu toate "tool"-urile de design, test și depanare pentru aplicație, o versiune pentru platforma Android cu ajutorul căreia se poate compila programul și o versiune de imagini de sistem Android pentru a rula aplicația în emulator.
Prima oară când se lansează programul va apărea o fereastră ca în Fig. 3.5.
Fig. 3.5 – Deschiderea aplicației Android Studio pentru prima oară
Aceasta include o secțiune pentru a deschide proiecte recente și o secțiune de deschidere rapidă care oferă mai multe opțiuni de a începe un nou proiect, de a deschide un proiect, de a importa un proiect și mai mult decât atât, oferă platforme pentru opțiuni mai avansate, cum ar fi verificarea versiunii a sistemului de control și modificarea opțiunilor de configurare.
3.4.1 Configurarea Android SDK
Android Studio instalează automat ultima versiune de Android SDK disponibilă, ar fi de preferat să fie instalat tot ceea ce este nevoie înainte de a se începe crearea primei aplicații.
În meniul File -> Project Structure se alege locația unde se află Android SDK. Această locație este locația principală care va fi folosită în viitoarele proiectele Android. Se poate schimba mai târziu pentru un proiect anume care cere setări mai speciale. Așa cum se poate vedea în Fig. 3.6, locația Android SDK aleasă de mine se află în D:\Android\SDK, iar locația pentru JDK se află pe repartiția C în C:\Program Files\Java\jdk1.8.0_25. Pentru a schimba locația, se apasă butonul din dreapta locației curente și se alege folderul care conține Android SDK.
Fig. 3.6 – Alegerea locației pentru Android SDK
3.4.2 Crearea unui proiect în Android Studio
Pentru a crea un nou proiect, se intră în meniul File -> New Project. Se va deschide o fereastră ca în Fig. 3.7.
Câmpurile care trebuie completate sunt următoarele:
Application Name – este numele care va apărea în Google Play și numele pe care utilizatorii îl pot vedea
Company Domain – este folosit pentru a crea numele pachetului aplicației
Package name – reprezintă un identificator unic pentru aplicație, în cazul de față, application.ro.myapplication. De obicei se scrie sub formă ro.nume_companie.nume_aplicație. Acest mod de scriere reduce riscul de conflicte în privința numelui cu alte proiecte. În mod implicit numele unui pachet este dat de câmpurile Company Domain și Applications Name. Pentru a schimba numele pachetului, se apasă butonul Edit.
Project Location – acesta este directorul unde se va salva proiectul
Fig. 3.7 – Crearea unui nou proiect Android
După completarea acestor informații se apasă butonul Next. Se va afișa al doilea ecran care permite selecția platformei și a SDK-ului minim pe care proiectul poate rula pe diferite dispozitive.
Datorită faptului că Android s-a extins pe mai multe tipuri de dispozitive, se pot selecta una sau mai multe tipuri de platforme și dispozitive care să fie incluse în proiect. Pentru fiecare tip de dispozitiv se poate selecta câte un SDK minim diferit. Se pot selecta următoarele dispozitive:
Phone and Tablet – sunt platformele standarde Android folosite pentru a crea o aplicație pentru telefoane și/sau tablele
TV – este o platformă Android TV folosită pentru configurarea aplicației pentru ecranele mari
Wear – este o platformă Android Wear folosită pentru configurarea aplicațiilor pentru dispozitivele portabile, cum ar fi ceasuri
Glass – este o platformă Android Glass folosită pentru configurarea aplicațiilor pentru dispozitivele Google Glass
Pentru a putea include oricare dintre aceste platforme în aplicație trebuie mai întâi instalate. Se apasă butonul Next, iar în continuare se poate alege tipul de activitate apoi se apasă butonul Finish [23].
3.5 Structura proiectului Android
Componentele aplicației sunt părțile esențiale de construire a unui proiect Android. Fiecare componentă are un rol specific prin care sistemul poate avea acces la aplicație.
În continuare se prezintă patru tipuri de componente ale aplicației care vor fi explicate pe scurt în cele ce urmează:
Activity (Activități)
Servicii
Furnizori de conținut
Receptori
activitate reprezintă un singur ecran al interfeței cu utilizatorul.
un serviciu este o componentă care rulează în background pentru a efectua operații care necesită o perioadă mai mare de timp sau pentru a efectua operații pentru procese de la distanță. Un serviciu nu oferă o interfață cu utilizatorul
un furnizor de conținut gestionează un set comun de date ale aplicației. Datele se pot salva în fișiere de sistem, într-o bază de date SQLite, pe web, sau alte locații de stocare la care aplicația poate avea acces. Prin intermediul furnizorului de conținut, alte aplicații pot interoga sau pot modifica datele, în cazul în care furizorul de conținut permite acest lucru.
un receptor de tip broadcast este o componentă care răspunde anunțurilor difuzate de către sistem. Multe transmisiuni provin din sistem, de exemplu, un anunț broadcast prin care ecranul trebuie să se închidă, bateria este descărcată sau s-a făcut o poză. De asemenea, și aplicațiile pot iniția un mesaj de tip broadcast [[23],[24]].
3.5.1 Componente de activare
Un aspect unic al proiectării sistemul de operare Android este faptul că aplicațiile pot începe alte componente ale ei.
Sunt trei tipuri de componente: activități, servicii și receptori de tip broadcast care sunt activați printr-un mesaj asincron numit "intent" [24].
Fig. 3.8 Modul de funcționare al unui Intent [25]
Fig. 3.8 ne arată faptul că prin intermediul unui intent, putem trece de la activitatea 1 la activitatea 2, și, de asemenea, de la activitatea 2, prin care am ajuns prin intermediul activității 1, putem să ajungem din nou la activitatea principală printr-un alt intent.
3.5.2 Fișierul Manifest
O aplicație trebuie să declare toate componentele în acest fișier, care trebuie să fie rădăcina directorului unde se află proiectul.
Manifestul are mai multe funcționalități, pe lângă declararea componentelor, cum ar fi:
identifică toate perimisiunile utilizatorului pentru cerințele aplicației
declară nivelul minim de API cerut de aplicație
declară caracteristicile hardware și software folosite sau cerute de către aplicație
librăriile API de care are nevoie aplicația să fie conectată
Prima sarcină a fișierului manifest este de a informa sistemul despre componetele aplicației, acestea se pun între componentele <application> și </application>.
Activitățile, serviciile și furnizorii de conținut care sunt incluși în codul sursă, dar nu sunt declarate în fișierul manifest, nu sunt vizibile sistemului, prin urmare, nu pot rula.
3.5.3 Resursele Aplicației
Pentru fiecare resursă care este inclusă în aplicația Android, "tool"-urile de construire SDK definesc un ID unic de tip întreg care se poate folosi pentru a face referire la resursa din codul aplicației sau la alte resurse definite în fișierul XML: Unul din cele mai importante aspecte a oferirii resurselor separat de codul sursă este abilitatea de a oferi resurse alternative pentru configurări diferite ale dispozitivului.
3.5.4 Proiectele Android
Proiectul aplicației este principalul tip de proiect, iar conținutul este construit într-un fișier .apk care se poate instala, ulterior, pe un terminal mobil și care este dezvoltat în Capitolul 3.10.
3.5.5 Testul proiectului
Aceste proiecte conțin codul pentru testarea proiectelor aplicației și sunt construite în aplicațiile care rulează pe un dispozitiv. Mai multe detalii se pot găsi în Capitolul 3.8.
3.5.6 Librăria proiectelor
Proiectele conțin un cod sursă Android comun și resurse prin care se poate face referire în proiectele Android. Librăria proiectelor nu poate fi instalată pe dispozitiv, ele sunt introduse în fișierul .apk în momentul construirii proiectului.
3.6 Emulator Android – Genymotion
Pentru a putea rula aplicația Android pe acest tip de emulator, trebuie să se instaleze în prealabil VirtualBox și, de asemenea, trebuie să se creeze un cont pe site-ul Genymotion înainte de a instala mașina virtuală. După ce s-a instalat emulatorul, se va putea recunoaște cu ușurință ecranul Genymotion mai ales pentru cei care au folosit emulatoare, ca de exemplu, VirtualBox. Pentru început, se apasă butonul Add (Adaugă) pentru a putea selecta dintr-un număr mare de telefoane și tablete Android cu diferite modele ce pot fi simulate diferit și cu diferite versiuni ale sistemului de operare Android pe cel care se potrivește cel mai bine cerințelor aplicației. Pentru rezultate și mai bune, ar trebui ales un model care să conțină Google Play Store.
3.7 Gradle
Gradle este un sistem de construire avansat care permite crearea unui "buil logic"(construcție logică) prin intermediul plug-in-urilor. În continuare vedem câteva caracteristici care facilitează folosirea Grandle:
Limbaj de domeniu specific (Domain Specific Language – DSL) – pentru a descrie și manipula "build logic"
fișiere Build – folosesc codul pentru a manipula elementele DSL
flexibilitate
plug-in-urile pot folosi propriile DSL și API pentru construirea fișierelor
Tool API care permit integrarea IDE
Android Studio conține un plug-in Android pentru Gradle. Gradle este un "toolkit" de construcție avansat care permite programatorului să definească o construcție logică personalizată. Multe proiecte software folosesc Grandle pentru a le manageria aplicația [24].
3.8 Configurația Grandle Build
Configurația "build" este definită în fișierele Grandle build, care conțin fișiere text ce folosesc sintaxa și opțiunile de la Grandle și plug-in-ul Android pentru a configura următoarele caracteristici ale construcției:
Variante de "build" – sistemul "build" poate genera mai multe APK care conțin diferite configurații pentru același proiect. Acest lucru este util atunci când se construiește mai multe versiuni pentru aplicație fără a fi nevoie creaurea unui proiect separat pentru fiecare.
Intrările Manifest – sistemul "build" permite specificarea valoarii pentru unele elemente din fișierul manifest din configurația construcției. Aceste noi valori se suprascriu peste cele existente în fișierul manifest. Acest lucru este util dacă se dorește generarea mai multor APK pentru proiect unde fiecare dintre ele are un nume de pachet diferit, o versiune de SDK minimă sau o versiune SDK țintă.
ProGuard – sistemul "build" permite specificarea unui fișier de reguli ProGurad diferite pentru fiecare variantă de construcție. Sistemul "build" poate rula ProGuard pentru a nu eclipsa clasele în timpul procesului de construire
Testare – sistemul "build" generează un APK test din testarea surselor din proiect, pentru a nu fi nevoie de a crea un proiect de testare separat
Fișierele "build" Grandle folosesc sintaxa Groovy. Groovy este un limbaj dinamic care se poate folosi pentru a personaliza construcția logică și a interacționa cu elementele specifice Android oferite de plug-in-ul Android pentru Gradle
3.8.1 Procesul de construire
Pentru a putea construi aplicația și a o rula pe un dispozitiv mobil trebuie să se compileze aplicația, formând, astfel, fișierul .apk care va fi detaliat în Capitolul 3.10. Fișierul .apk conține fișiere .dex , corespunzătoare mașinei virtuale Dalvik, resursele .arsc, resurse necompilate și fișierul AndroidManifest.xml. Apoi este semnat, iar cu ajutorul unui ADB, ce este un "tool" de linie de comandă care permite utilizatorului să comunice cu emulatorul sau cum un dispozitiv ce funcționează cu sistemul de operare Android, este rulat într-un emulator, după cum ne arată Fig. 3.9 [25].
Fig. 3.9 Procesul de buld al aplicației [25]
ADB – Android Debug Bridge
3.9 Directoare și fișiere
Proiectele Android sunt proiecte care sunt construite într-un fișier .apk care se poate instala pe dispozitiv. Conține obiecte, cum ar fi: codurile sursă ale aplicației și fișierele cu resurse. Unele sunt generate în mod implicit în timp ce altele trebuie create dacă este necesar.
Un proiect Android conține următoarele directoare și fișiere și se pot observa și în Fig. 3.10:
src/ – conține trunchiul fișierului Activity, care este salvat în src/your/package/ namespace/ActivityName.java. Toate celelalte coduri sursă ale fișierelor (cum ar fi fișierele .java sau .aidl ) se salvează tot în acest director
bin/ – este un director de ieșire pentru construire. Aici se află ultimul fișier .apk și alte resurse compilate.
jni/ – conține codul sursă dezvoltat folosind Android NDK.
gen/ – conține fișierele Java generate de ADT, cum ar fi fișierul R.java și interfețele create de la fișierele ADN
assets/ – acesta este gol. Se poate folosi pentru a depozita fișierele "raw asset" (în stare brută). Fișierele salvate aici sunt compilate într-un fișier .apk și se păstrează numele fișierului
res/ – conține resursele aplicației, cum ar fi fișierele "drawable", fișierele "layout" și "strig value"
anim/ – este folosit pentru fișierele XML care sunt compilate în proiecte cu animație
color/- este folosit pentru fișierele XML care descriu culori
drawable/- conține fișiere bitmap (png, jpeg, gif), fișiere imagine 9-Patch, fișiere XML care definesc resurse ce pot fi desenate
layout/- există fișiere XML care definesc design-ul interfeței
menu/- pentru fișierele XML care definesc meniurile aplicației
raw/- fișierele diferite în format binar sau text
values/- fițiere XML care conțin valori simple, cum ar fi șiruri de caractere, numere întregi și culori. Este recomandat să se utilizeze cnvențiile de nume de fișiere pentru anumite tipuri de resurse: colors.xml , styles.xml
xml/- fișiere XML care pot fi citite
libs/- conține librăriile private
Fig. 3.10 – Fișierele și directoarele unui proiect Android [25]
Toate resursele din subdirectorul res/ sunt incluse în pachetul aplicației de către compilator. Pentru a facilita accesul și controlul resurselor din codul aplicației, compilatorul generează o clasă, numită R.java, care conține identificatori statici utilizați pentru referirea fiecărei resurse. De exemplu, este recomandat să se definească și să se salveze valori constante de tip String în interiorul fișierului res/values/string.xml și să nu se definească direct în cod. Fiind definite în afara codului sursă înseamnă că se pot modifica fără a afecta codul sursă Java [26].
AndroidManifest.xml – fișier de control care descrie natura aplicației și fiecare componentă a ei. De exemplu, descrie anumite calități despre activități, servicii, intent, content, ce permisiuni sunt cerute, ce librării externe sunt suportate sau cerute și altele.
Project.Properties – acest fișier conține setările proiectului, cum ar fi "build target". Acesta este parte componentă a proiectului, așa că este ținut în sistemul de control a sursei. Pentru a edita proprietățile proiectului în Eclipse, se apasă butonul dreapta pe directorul proiectului și se selectează Properties
Local.Properties – personalizează proprietățile specifice calculatorului pentru sistemul de "build". Acest fișier nu este folosit în Eclipse.
3.10 Fișierul de instalare pe dispozitiv
Un pachet Android (Android Package – APK) este un pachet care se instalează pe dispozitivul Android pentru a rula aplicația. În continuare se va studia structura unui astfel de pachet. Aplicațiile Android sunt distribuite sub formă de arhive, având ca extensie un fișier .apk care este abrevierea de la Android Package. Aceste pachete nu sunt altceva decât fișiere arhivate care conțin codul aplicației compilat, resursele și metadatele aplicației cerute pentru a întregi aplicația.
3.10.1 Crearea unui fișier APK
Odată ce utilizatorul selectează opțiunea Run, Android Studio crează un fișier .apk care poate fi instalat pe orice dispozitiv. Fișierul .apk poate fi generat apăsând click dreapta pe proiect, apoi pe Android Tools și se alege una din cele două posibilități Export Unsigned Application Package sau Export Signed Application. Pentru prima variantă se caută locația unde se dorește a fi salvat fișierul .apk iar apoi se salvează.
A doua variantă se folosește atunci când se dorește publicarea aplicației în Google Play, iar acest lucru necesită crearea unui apk digital "semnat" (signed). Se va crea un certificat sau o cheie.
Se apasă click dreapta pe proiect, se selectează Android Tools și se alege Export Signed Application , după care se selectează proiectul pentru care se vrea generarea fișierul .apk, se apasă butonul Next. Se selectează crearea unei noi chei și se specifică locația unde va fi salvată și parola pentru cheie. Se apasă butonul Next. După cum se observă în Figura 3.11, se va crea cheia completând câmpurile necesare apoi se caută locația unde se va salva fișierul .apk.
.
Fig. 3.11 – Câmpul de creare a cheii pentru publicarea aplicației [26]
3.10.2 Formatul unui fișier APK
Conform documentației Google [27], un APK este un pachet care îndeplinește următoarele cerințe:
un tool SDK numit aapt (Android Asset Packaging Tool) – face conversia tuturor fișierelor XML din aplicație într-o formă binară. R.java este , de asemenea, produsă de aapt
un tool numit aidl care este folosit pentru conversia fișierelor .aidl (Attacking Insecure Services) în fișiere .java care conține o reprezentare convertită a lor folosind interfețe Java standard
toate codurile sursă și ieșirile convertite de la aapt și aidl sunt compilate în fișiere .class de către compilatorul Java 1.6. Acest lucru necesită existența fișierul android.jar pentru alegerea versiunii API dorită în CLASSPATH
un fișier dx care e folosit pentru a face conversia fișierelor .class împreună cu alte librării într-un singur fișier classes.dex
toate resursele compilate, necompilate (cum ar fi imagini sau executabile adiționale) și fișierul DEX al aplicației sunt folosite de către apkbuilder pentru a forma fișierul APK.
Acest proces de compilare este invizibil programatorului, aceste lucruri fiind făcute automat de către IDE. Atunci când se dezarhivează un APK se va vedea produsul final al tuturor pașilor prezentați mai sus. În figura 3.11 putem vedea formatul unui fișier APK și se vor explica pe scurt fiecare fișier și director.
Assets – permite dezvoltatorului software să pună fișierele în acest director dacă ar dori să fie luate la pachet cu aplicația
Res – conține toate layout-urile aplicației, imaginile folosite și alte fișiere pe care programatorul vrea să le acceseze din cod într-un mod structurat. Aceste fișiere sunt puse în subdirectorul raw/
Fig. 3.12 – Formatul unui fișier APK [28]
Lib – conține librăriile care sunt luate la pachet odată cu aplicația și fișiere care țin o listă de inventar a tuturor fișierelor incluse în arhivă
classes.dex – aceasta este esențială deoarece conține codul mașinii virtuale Dalvik. Cu ajutorul acestui cod se poate rula mașina virtuală Dalvik
AndroidManifest.xml – fișier care conține toate informațiile de configurare ale aplicației și definește parametrii de securitate
Resources.asrc – resursele pot fi compilate în acest fișier în loc să fie puse în folderul res. De asemenea, conține șirurile de caractere (Strings) ale aplicației
Capitolul 4. Module de servicii pe bază de localizare
Când se folosește conceptul de servicii pe bază de localizare trebuie să se înțeleagă sensul cuvântului "localizare". Accentul este pus pe conceptul de locație spațială care apare, dezvoltatorilor software și utilizatorilor ce folosesc servicii pe bază de localizare, sub formă de coordonate.
4.1 Categorii de locații
În principiu, termenul de "locație" este asociat cu un loc din lumea reală. Atunci când oamenii aranjează întâlniri, de obicei, stabilesc să se vadă într-un anumit loc, cum ar fi aeroport, cafenea sau birou. În alte situații, ei trebuie să informeze despre locul rezident, de exemplu, pentru a primi corespondența scrisă sau directive oficiale. Aceste două exemple au în comun locația care indică un loc din lumea reală, așadar, aceste tipuri de locații aparțin unei aceeași clase, și anume, locații fizice.
Odată cu extinderea spațiului cibernetic, și anume Internetul, a trebuit să se introducă un alt concept de locație. Internetul a creat o gamă largă de aplicații care au schimbat modul în care oamenii primesc informații sau interacționează unii cu alții. În această arie, termenul de "locație" are de multe ori un alt înțeles și se referă la un loc de întâlnire virtual, de exemplu, un site web sau un "chat", împărțit de mai mulți utilizatori, al unui joc pe calculator. Aceste locații sunt cunoscute ca fiind locații virtuale.
Serviciile pe bază de localizare fac referire la locațiile fizice și nu cunosc conceptul de locație virtuală, însă există puține excepții, de exemplu, atunci când utilizatorii telefonului mobil accesează un joc simultan.
Locațiile fizice se împart în trei categorii relevante pentru crearea și utilizarea serviciilor pe bază de localizare:
locații descriptive – au legătură cu un obiect geografic cum ar fi: teritorii, munți, lacuri, granițe, orașe, țări, drumuri, clădiri sau încăperi din interiorul unor construcții. Se poate face referire la acest tip de locații prin descrieri, cum ar fi: nume, identificatori sau numere. Locația descriptivă este un concept fundamental în viața de zi cu zi și este folosită de oameni pentru a stabili întâlniri, pentru livrarea corespondenței scrise către locuri precise
locații spațiale – fac referire la poziție. De obicei, se exprimă printr-o expresie formată din coordonate tridimensionale dat ca un vector de numere, fiecare fixând poziția într-o dimensiune. În comparație cu locațiile descriptive, pozițiile nu sunt folosite în fiecare zi deoarece oamenii preferă să se orienteze în funcție de obiectele geografice în loc să folosească coordonate. În orice caz, locațiile spațiale sunt indispensabile aplicațiilor profesionale (aviație, navigație) care depind de o precizie și acuratețe foarte mari.
locații de rețea – fac referire la o topologie a comunicațiilor de rețea, de exemplu, Internetul sau rețelele mobile, cum ar fi: GSM sau UMTS. Aceste rețele sunt formate din mai multe rețele locale, denumite și "subnetworks", conectate între ele printr-o topologie de circuite ierarhică și având o structură de bază. Serviciul de furnizare în aceste rețele cunoaște locația dispozitivului utilizatorului în conformitate cu topologia rețelei. De exemplu, În Internet, o locație de rețea face referire la o rețea locală care este identificată de adresa sa IP (Internet Protocol). În rețelele mobile, pe de altă parte, o locație de rețea este legată de stația de bază la care este atașat terminalul mobil [29].
4.2 Servicii pe bază de localizare în sistemul de operare Android
Un telefon mobil este diferit prin faptul că poate avea servicii avansate pe care doar un astfel de dispozitiv le poate oferi. Ceea ce utilizatorii folosesc tot timpul pe telefon: fac o căutare bazată pe locație, de exemplu, pentru un restaurant, o cafenea, un cinema, acest lucru se numește serviciu pe bază de localizare.
Telefoanele cu sistemele de operare Android oferă un număr mare de posibilități pentru acest tip de servicii care vor fi discutate mai jos.
4.2.1 Managerul de locații
Managerul de locații Android oferă locația sub formă de latitudine pentru a stabili poziția telefonului. Acuratețea poate varia în funcție de furnizorul de locație selectat (poate fi bazat pe GPS, WiFi sau Rețea Mobila). Pentru a putea determina locația în sistemul de operare Android este nevoie de:
managerul de locație – care oferă coordonatele
furnizorul de locație – care poate face o serie de compromisuri pentru a oferi utilizatorului cerințele dorite
Se poate construi un număr de servicii folosind următoarele componente:
obținerea locației curente a utilizatorului
obținerea periodică a locației utilizatorului atunci când se află în mișcare – oferă un traseu
folosind alerte de proximitate atunci când utilizatorul se deplasează în interiorul sau în afara unei zone predefinite (de exemplu Piața Unirii)
4.2.2 Furnizorul de locații
Telefoanele mobile pot oferi locația dintr-un un set de furnizori care fac o serie de compromisuri. De exemplu, GPS are o acuratețe bună în aer liber, dar este costisitor din punct de vedere al consumului de energie. În comparație cu rețeaua mobilă care este ieftină din punct de vedere al consumului de energie, dar nu poate oferi informații despre locații precise (de exemplu într-o vale) din cauza faptului că nu există arie de acoperirea foarte bună spre deosebire de oraș, unde precizia este foarte bună. Există o serie de compromisuri pe care utilizatorul poate să le facă atunci când selectează furnizorul de locație. Practic, în funcție de dispozitivul de localizare pe care utilizatorul îl alege există o serie de compromisuri:
consumul puterii
acuratețea longitudinii și latitudinii
acuratețea altitudinii
viteza
informații de direcție
Dezvoltatorul software poate specifica furnizorul de locație explicit în cod folosind următoarele constante: LocationManager.GPS_PROVIDER,LocationManager.NETWORK_PROVIDER, LocationManager.PASSIVE_PROVIDER.Totuși, folosirea unui singur tip de furnizor este o adoptare rigidă deoarece atunci când utilizatorul, de exemplu închide singurul furnizor de locații, de
exemplu, închide GPS-ul, aplicația nu va mai funcționa. Este mai bine că sistemul Android să satisfacă nevoile utilizatorului cu ceea ce furnizorii oferă.
Obținerea locației unui dispozitiv (implicit și a utilizatorului) este un serviciu oferit de telefoanele mobile. Există o serie de practici atunci când aplicațiile folosesc serviciile pe bază de localizare. Mai întâi, trebuie respectată intimitatea utilizatorului; locația trebuie reactualizată doar când este necesar, iar utilizatorul trebuie să știe când este urmărit și unde sunt salvate informațiile sau ce puțin trebuie comunicate și trebuie să aibă posibilitatea dezactivării procesului de urmărire.
Pentru a afla ultima locație a dispozitivului trebuie să se folosească funcția getLastKnownLocation(). Această funcție returnează o locație care indică informația de la ultima locație fixă obținută prin intermediul furnizorului de locație. Acest lucru poate fi realizat fără a deschide unul din furnizorii de locație. De reținut este faptul că această locație poate fi expirată, de exemplu atunci când dispozitivul a fost închis și s-a mutat într-o altă locație. Atunci când furnizorul de locație este dezactivat, această funcție întoarce valoarea null.
Odată ce utilizatorul primește ultima locație, se apelează funcția updateWithNewLocation(). Această funcție păstrează longitudinea și latitudinea locației, apoi obține o adresă, care poate fi citită de utilizator, de la coordonate folosind Geodecoders.
4.2.3 Geocoding
Geocoder face translatarea de la latitudine/longitudine la adresa lizibilă de către orice utilizator. Gecoding-ul este un proces de transformare a adreselor străzilor sau a altor descrieri ale locațiilor în coordonate (latitudine și longitudine). Geocoder suporta două servicii:
"geocoding forward" – face trecerea de la adresă la longitudine/latitudine
"geocoding reverse" – face translatarea de la latitudine/longitudine la o adresă
Detaliile unei locații Geocoded Reverse pot varia, de exemplu, o locație poate să conțină adresa completă a străzii și a unei clădiri din apropiere, în timp ce altă poate să conțină doar numele orașului și codul poștal. Clasa Geocoder necesita un serviciu care nu este inclus în framework-ul de bază al Androidului. Această clasă vine odată cu librăriile "Google Maps". Pentru a folosi această librărie trebuie să fie importată în aplicație. În plus, această clasă folosește un server pentru a transporta peste Internet, așa că trebuie introdusă următoarea permisie: <uses-permission android:name="android.Permision. INTERNET"/> [30].
4.3 Tipuri de aplicații ce folosesc module de servicii pe bază de localizare
Servicii informaționale – este cel mai simplu și cel mai popular serviciu pe bază de localizare. De exemplu, furnizează utilizatorului puncte de interes cum ar fi restaurante, clădiri etc. În anumite cazuri, serviciile sunt combinate cu posibilitatea de îndrumare a utilizatorului către anumite puncte de interes.
Servicii de comunitate – permit utilizatorului să distribuie un interes comun pentru a putea intra într-un grup mai restrâns (comunitate) și să interacționeze cu membrii grupului respectiv. Funcția de bază a acestui tip de servicii este să îi arate utilizatorului poziția curentă a prietenilor lui și să îl anunțe atunci când un prieten este prin apropiere.
Traffic Telematics – are scopul de a ajuta șoferii care dispun de un set de servicii cu privire la mașinile lor. De exemplu, sistemul de navigație, actualizările rutei recomandate cu ultimile noutăți referitoare la blocajele în trafic, starea vremii, drumuri în construcție etc.
Logistica și managementul "flotei" – se ocupă cu controlul și coordonarea întregei "flote" de vehicule de la un birou central.De exemplu, transportul în public, serviciile de urgență.
Marketing-ul mobil – ajută producătorii și agențiile de servicii să își promoveze produsele, înteracționând cu utilizatorii prin dispozitivele mobile. De exemplu, mesaje publicitare, mesaje ce te anunță că sunt reduceri etc. Acest serviciu selectează un grup țintă a unui anumit produs sau serviciu prin evaluarea profilului utilizatorului.
Jocuri bazate pe localizare – în acest tip de serviciu, lumea reală și cea virtuală se unesc, iar poziția curentă a utilizatorului devine un aspect esențial al jocului [31].
Capitolul 5. Accesul utilizatorului la servicii multimedia pe bază de localizare
5.1 Instalarea mediul de dezvoltare Eclipse
Pentru instalarea mediului de dezvoltare Eclipse, trebuie să se downloadeze de pe Internet JDK care se găsește pe site-ul Oracle, la secțiunea Java descărcări. Aici, se caută Java SE 6 Update 43 și se alege executabilul potrivit calculatorului pe care se concepe aplicația, mai precis, se descarcă kit-ul pentru windows x64, jdk-7u25-windows-x64.exe . După terminarea descărcării, se instalează.
Apoi se descarcă Eclipse IDE for Java Developers, care se găsește pe site-ul www.eclipse.org/downloads și se alege versiunea pentru Windows 64 Bit.
Odată ce programul Eclipse a fost lansat, a trebuit să se facă instalarea plug-in-ul pentru Android Development Tools (ADT). În secțiunea Help, pe Install New Software, se apasă Add. La nume se poate scrie "ADT Plugin" iar la link https://dl-ssl.google.com/android/eclipse. După care se urmează pașii necesari pentru instalarea tool-ului de Android.
Pentru configurarea acestuia, trebuie specificată locația directorului Android SDK. Programul Eclipse a trebuit restartat pentru salvarea noilor configurări, iar la redeschidere a apărut fereastra cu selectarea acestui director.
5.2 Configurarea Android SDK Manager
În mod implicit, Android SDK nu include toate cele necesare pentru a începe crearea unui program. SDK separă "tool"-urile, platformele și alte componente în pachete care se pot downloada folosind Android SDK Manager.
Pentru a instala Android SDK , se intră pe site-ul următor: http://developer.android.com/sdk/index.html#Other și se alege opțiunea de a instala doar SDK Tools (nu include și mediul de dezvoltare, se poate folosi Elipse sau Android Studio, la alegere) potrivit pentru sistemul de operare folosit, mai precis Windows.
Atunci când se deschide Android SDK pentru prima dată, anumite pachete sunt selectate în mod implicit. Este de preferat ca acele pachete să fie instalate.
Pentru a putea începe dezvoltarea unei noi aplicații trebuie să urmăm următorii pași:
Se deschide directorul Tools din Android SDK și se selectează
Android SDK Tools
Android SDK Platform-Tools
Android SDK Buil-Tools (cea mai recentă versiune)
Se deschide folderul pentru Android 5.1.1 (sau cea mai recentă versiune) și se selectează:
SDK Platform
un sistem de imagine pentru emulator, cum ar fi ARM EABI v7a System Image
În Figura 5.1 se pot observa toate cele menționate mai sus selectate și urmează a fi instalate.
Fig. 5.1 – Android SDK Manager – directoarele Tools și Android 5.1.1
5.2.1 Librăriile Android
Librăriile Android oferite oferă un set extins pentru nivelele API care sunt compatibile cu majoritatea versiunilor Android. Pentru a se instala se deschide directorul Extras din Android SDK Manager și se selectează următoarele, așa cum ne arată Figura 5.2:
Android Support Repository
Android Support Library
5.2.2 Google API
Pentru a dezvolta aplicații cu ajutorul Google API, trebuie instalat pachetul de servicii Google Play care se găsește în folderul Extras din Android SDK Manager și se selectează:
Google Repository (dacă nu a fost instalat în prealabil)
Google Play services
De reținut este faptul că serviciile Google Play APIs nu sunt disponibile pentru toate dispozitivele Android, dar sunt disponibile pentru toate dispozitivele care au instalat Google Play Stervices. Pentru a folosi aceste API-uri în emulatorul Android, trebuie instalată imaginea sistemului Google APIs care se găsește în directorul cu versiunea cea mai recentă de Android, Android 5.1.1 , din Android SDK
Manager. După ce s-au selectat pachetele necesare dezvoltării unei aplicații, se acceptă termenii de licență pentru fiecare și se continuă cu instalarea acestora.
Fig. 5.2 – Android SDK Manager – directorul Extras
5.3 Google Maps Android API
Google Maps Android API face parte din platforma de servicii Google Play. Pentru a folosit Google Maps, trebuie instalat Google Play Services din Android SDK Manager. De asemenea, trebuie obținut și un API key pentru a avea acces la hartă. Acest lucru este posibil doar prin înregistrarea în Google Developers Console unde se primește un certificat semnat pentru aplicație.
În cod, se adaugă versiunea Google Play folosită în Manifest-ul aplicației, și anume în fișierul AdroidManifest.xml, se scrie următoarea declarație în interiorul elementului <application>. Aceasta încorporează versiunea de servicii Google Play cu care aplicația a fost compilată.
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
5.3.1 Obținerea certificatului Android și cheia Google Maps Key
Pentru a accesa serverele Google Maps cu ajutorul Maps API, trebuie să se specifice, în aplicație, cheia Maps API key. Această cheie este gratuită și se poate folosi în orice aplicație care apelează Maps API și suportă un număr nelimitat de utilizatori. Aceasta se obține accesând Google Developers Console și se specifică numele aplicației. Cheia obținută se pune în fișierul AndroidManifest.xml.
Cheile Maps API sunt legate de o pereche specifică certificat/pachet. Nu este nevoie decât de o singură cheie pentru fiecare certificat, indiferent de numărul de utilizatori ai aplicației. Aplicațiile care folosesc același certificat pot folosi aceeași cheie API. Se recomandă ca fiecare aplicație să aibă propriul certificat și propria cheie [32].
5.3.2 Adăugarea cheii API în aplicație
În fișierul AndroidManifest.xml, în interiorul elementului <application> se inserează următorul cod chiar înainte de închiderea tagului </application>:
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="API_KEY"/>
Acest cod face cheia API vizibilă către orice MapFragment din aplicație.
De asemenea, această cheie se introduce și în fișierul google_maps_api.xml care face parte din directorul Values (Fig. 5.4). Tot de aici se ia și identificatorul unic al aplicației care se introduce în meniul Credentials după ce ce accesează site-ul Google Developers Tools pentru a se genera cheia API (Fig 5.5).
Fig. – 5.3 Copierea cheii API în fișierul xml
5.3.3 Permisiuni necesare
Este nevoie să se specifice permisiuni de care are nevoie aplicația, adăugând elementele <uses-permission> în interiorul elementului <manifest>.
Pentru a putea folosi Google Maps Android APIs sunt necesare următoarele permisii:
android.permission.INTERNET – este folosit de către API pentru a downloada harta din serverele Google Maps
android.permission.ACCESS_NETWORK_STATE – permite API-ului să verifice statutul conexiunii pentru a stabili dacă datele pot fi descărcate
android.permission.WRITE_EXTERNAL_STORAGE – permite API-ului să memoreze harta
Atunci când aplicația accesează poziția curentă a utilizatorului, se cer următoarele permisiuni:
android.permission.ACCESS_COARSE_LOCATION – permite API-ului să folosească WiFi sau rețelele mobile (sau amândouă) pentru a determina locația dispozitivului. API returnează o locație cu o acuratețe mai mică
android.permission.ACCESS_FINE_LOCATION – permite API să determine o locație cât mai precisă disponibilă furnizorului de locație (Capitol 4.2.2), folosind inclusiv și GPS pe lângă WiFi sau rețelele mobile
Fig. 5.4 – Generarea cheii Google Maps
Google Maps Android API folosește OpenGL versiunea 2 pentru a face vizibilă harta. Harta nu va apărea dacă OpenGL ES versiunea 2 nu este instalată. Trebuie să se folosească următorul element <uses-features> în interiorul elementului <manifest> din fișierul AndroidManifest.xml:
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />
În particular, aceasta împiedică Google Play Services să afișeze aplicația pe dispozitivele care nu suportă OpenGL ES versiunea 2.
5.3.4 Adăugarea hărții în aplicație
Cel mai simplu mod de a testa dacă aplicația este configurată corect este de a adăuga o hartă simplă. Se crează un nou proiect Android cu o activitate implicită Google Maps Activity.
La acest nou proiect creat, se fac modificări la nivelul fișierului AndroidManifest.xml, unde se adaugă următoarele linii de cod explicate in Capitolul 5.3.3.
<uses-feature
android:glEsVersion="0x00020000"
android:required="true"/>
Fișierul sau clasa MainActivity.java este configurată în mod implicit de mediul de dezvoltare, întrucât s-a ales de la început crearea unei aplicații Google Maps. Această clasă conține și un Marker având coordonatele logitudinii și latitudinii 0.
private void setUpMap() {
mMap.addMarker(new MarkerOptions().position(
new LatLng(0,0)).title("Marker")); }
Pentru a avea acces la hartă, în fișierul google_maps_api.xml se introdce cheia Google Maps key, urmând pașii enumerați în Capitolul 5.3 . Mai întâi se copiază credențialul pentru a putea genera o cheie și se introduce în Google Developers Console accesând meniul Credentials, după cum se observă în Fig. 5.4. În prealabil, în Google Developers Console, se crează un proiect și se primește un ID pentru aplicație și se activează Google Maps Android API.
Fig. 5.5 – Crearea proiectului în Google Developers Console
Fig.5.3 demonstrază posibilitatea obținerii mai multor chei Google Maps pentru fiecare proiect și, totodată, se observă lista de proiecte, fiecare având propriul identificator. Proiectul pentru care am obținut cheia Google Maps ce va fi folosită în continuare se numește "Harta".
Se compilează aplicația și acum se poate vedea și accesa harta așa cum se observă în Fig. 5.6, unde este pus, în mod implicit, și un marker la latitudinea 0 și longitudinea 0.
Pentru a face zoom pe hartă într-un anumit loc trebuie să se adauge următorul cod în fișierul MainActivity.java:
GoogleMap googlemap1 = mMap;
LatLng zoomLocation = new LatLng(44.42784, 26.08737);
googlemap1.animateCamera(CameraUpdateFactory.newLatLngZoom(zoomLocation, 14));
Harta se va vedea ca în figura 5.7, mai detaliat, s-a ales latitudinea de 44.42784 și longitudinea de 26.08737, loc care reprezintă orașul București.
Fig. 5.6 – Rularea aplicației și vizualizarea hărții Fig. 5.7 – Zoom pe hartă și adugarea unui Marker
De asemenea, tot în Fig 5.7 se observă și un marker care arată un obiectiv de interes ce poate fi vizitat de turiști, și anume, Casa Poporului. Acest lucru s-a realizat prin adăugarea unor noi coordonate (Latitudine, Longitudine) = (44.4278, 26.087378) prin intermediul unui obiect de tip MarkerOptions, căruia i se atribuie și un nume, respectiv, Casa Poporului.
Capitolul 6. Terminal mobil Smartphone, având sistem de operare Android, cu acces la Google Maps
6.1 Introducere
Proiectul are drept scop navigarea prin locații turistice afișate pe o hartă sub forma unui markere cu posibilitatea de a vizualiza link-urile de pe YouTube, comentariile asociate acestuia cât și posibilitatea de a lăsa un comentariu. Pentru a putea avea acces la comentariile fiecărui link trebuie să înțelegem cum se utilizeaza YouTube Data API.
Despre modul în care se poate obține Google Maps Key, pentru a putea avea acces la hartă și permisiunile care sunt necesare pentru a putea vizualiza harta, se pot găsi detalii în Capitolul 5. În continuare se va aborda subiectul despre ce înseamnă, ce implică, cum se poate folosi și avea acces la YouTube Data API pentru a putea afișa lista de comentarii și de a scrie opinia în legătura cu videoclipul care se vizualizează după ce s-a ales un loc (marker) de pe hartă.
6.2 Diagrama de clasă UML
Unified Modeling Language (UML) reprezintă un limbaj standard folosit pentru descrierea sistemelor orientate obiect. Se folosesc elemente grafice pentru a reda cât mai bine relațiile dintre obiecte, un lucru foarte util acolo unde nu se pot descrie liniile de cod.
Reprezentarea unei clase, prin intermediul unei diagrame, se face printr-un simplu dreptunghi divizat în 3 compartimente. În cel de sus este trecut numele clasei, la mijloc se specifică lista atributelor, iar în ultima căsuță operațiile specifice clasei.
Diagramele de clasă sunt folosite în modelarea orientată obiect pentru a descrie sructura statică a sistemului, a modului în care este structurat proiectul. Oferă o notație grafică ăentru reprezentarea claselor, enitități ce au caracteristici comune, și a relațiilor dintre două sau mai multe clase.
Specificarea atributelor:
vizibilitate – reprezintă protecția atributului și poate avea următoarele valori:
public – se notează cu "+"
privat – se notează cu "-"
opțional – se notează cu "#"
idAtribut – identificatorul atributului
tip – tipul atributului
valoare_impicită – valoarea inițială a atributului (opțional)
Specificarea metodelor:
vizibilitate – protecția metodei, poate avea aceleași valori ca în cazul atributelor, public ("+"), privat ("-"), opțional ("#")
idMetoda – identificatorul metodei
idP1 … idPn – parametru metodă
tip1 … tipn – tipul parametrului
tip_returnat – tipul valorii returnate de metodă
Fig. 6.13 – Exemplu clasă – diagramă UML
Relațiile din cadrul diagramei de clase sunt reprezentate grafic printr-o succesiune de segmente orizontale sau verticale care leagă o clasă de alta. Acestea pot fi:
relații de generalizare – se referă la o strctură ierarhică ce aplică principiul moștenirii. Moștenirea este o relație de generalizare care se reprezintă printr-o linie cu săgeata îndreptată de la subclasă la clasa părinte
relații de asociere – o clasă se află în relație cu o altă clasă pe o durată mai mare de timp. Aceste relații se formează îm momentul în care o proprietate a unei clase ține o referință către o instanță a altei clase. Este cel mai răspândit tip de relație, iar pentru descrierea asocierii se folosește o linie simplă
relații de realizare – relații prin care unul dintre elemente "garantează" realizarea unor acțiuni prin intermediul celuilalt element. În cadrul UML, interfețele sunt asociate acestui tip de relații. Reprezentarea se face similar ca în cazul moștenirii, doar că linia este punctată
relații de dependență – o relație semantică între două sau mai multe elemente, insă nu descriu o legătură permanentă între clase. O modificare în una din clase poate forța modificarea celeilalte
Agregarea reprezintă definirea unei noi clase ce include una sau mai multe date membre care au ca tip clase deja definite. Ne permite construirea de clase complexe pornind de la clase mai simple. Există două tipuri de agregare:
compoziție – subobiectele agregate aparțin exclusiv agregatului din care fac parte, iar durata de viață coincide cu cea a agregatului. reprezentarea grafică se face printr-o linie și un romb plin ce pleacă de a clasa ce agregă.
agregarea propriu-zisă – subobiectele au o existență independență de agregatele ce le partajează. Mai mult, un obiect poate fi partajat de mai multe agregate. Reprezentarea grafică se face printr-o linie și un romb gol ce pleacă de la clasa ce agregă.
În continuare, în Fig. 6.14, se va ilustra diagrama UML pentru aplicația creată. Aceasta conține 3 clase, fiecare clasă având propirul "părinte", astfel se preiau funcționalitățile claselor "parinte" și se adaugă o serie de elemente proprii pentru fiecare clasă "copil". Acest tip de relație există în MenuActivity, care este "copil", și ActionBarActivity, care este părinte, între MapsActivity și FragmnetActivity, și între MarkerInfoActivity și Activity.
Clasa MenuActiviy, care este și activitatea de start, are ca atributie două butoane cu ajutorul cărora se poate lansa câte un nou Intent. După cum s-a explicat în Capitolul 6.5 se prezintă următoarele butoane:
butonul Youtube lansează un videoclip ce ne prezintă orașul București,
butonul Maps, după cum indică și numele acestuia, prin apăsarea lui se va crea un nou Intent care va accesa, încarca și lansa harta Google Maps.
Metoda public void onCreate este apelată atunci când se crează activitatea și conține următoarele:
setContentView(R.layout.activity_menu)ce setează layout-ul resursei definit în fișierul activity_menu.xml care va apărea pe ecranul dispozitivului
se preia instanța primului buton, Map: Button button = (Button)findViewById(R.id.mapsButton);
se face apelul funcției OnClickListener prin intermediul interfeței View.OnClickListener care va crea un nou Intent de tip MapsActivity ce va lansa o nouă activitate, apelându-se metoda startActivity(intent)
similar și pentru butonul YouTube, se crează un nou obiect de tip Button care preia instanța butonului
se apelează metoda OnClickListener() atunci când butonul va fi apăsat. Se va crea un nou intent ce primește ca parametru un link de YouTube, pe care îl va lansa prin apelarea metodei startActivity(intent).
Activitatea prin care avem acces la hartă se lanseză odată ce am apăsat pe butonul Map, deci prin crearea Intent-ului de tip MapsActiviy.java și lansarea acestuia.
Clasa MapsActivity face posibilă interacțiunea cu harta Google.
Se definesc trei atribute:
un atribut public denumit Title_Tag de tip String pentru a punea avea acces la numele marker-ului atunci când se apasă pe el
un atribut privat de tip List<MarkerModel>, adică o listă denumită listOfMarker care va fi de tip MarkerModel
un atribut privat mMap de tip GoogleMap
În metoda privată setUpMap() se inițializează markerele de pe hartă și se activează afișarea locației curente a utilizatorului pe hartă, reprezentată printr-un cerculeț albastru. Se înițiază:
un obiect de tip MarkerOptions căruia îi atribuim coordonatele marker-ului și un nume cu ajutorul funcției addMArker
o listă de tip Strings care se inițializează ca o listă de tip Array, ArrayList, List<String> listOfYoutubeLinks1 = new ArrayList, în care se adaugă link-urile YouTube ce pot fi vizualizate de către utilizatori
Pentru a putea adăuga markerele în lista ListOfMarker de a avea acces la toate link-urile stabilite și de a prelua instanțele marker-ului creat, se crează un obiect de tip MarkerModel, care va fi adăugat în această listă, folosind comanda listOfMarker.add(markerModel1), markerModel1 fiind obiectul de tip MarkerModel creat.
Aceași pași se fac pentru toate markerele create și la care vrem să avem acces. La finalul acestei metode, se apelează o altă metodă, și anume setUpListOfComments(), care este de tip privat.
Metoda setUpListOfComments de tip privat în interiorul căreuia se face cererea HTTP și de a primi răspunsul sub formă de JSON, ulterior făcând parsarea. Tot în această metodă, atributul progressDialog se inițializează ca un obiect tip ProgressDialog, care este o căsuță, în care va apărea un mesaj pentru a se putea încărca comentariile tuturor link-urilor de YouTube.
Metoda setUpIfNeeded() este de tip privat și se apelează pentru a verifica existența hărții Google.
Metoda OnCreate(Bundle bundle) în care, prin intermediul layout-ului activity_maps.xml se iau parametrii necesari afișării hărții. De asemenea, tot aici se inițializează atributul listOfMarker cu o listă ArryList de tip MarkerModel: ArrayList<MarkerModel> și se apelează funcția setUpMapIfNedeed().
metoda onMarkerClick are ca parametru un obiect de tip Marker. În interiorul acesteia se crează un for care parcurge toate markerele introduse în lista de markere listOfMarker. În interiorul acestui for se verifică dacă markerul este egal cu marker-ul apăsat de către utilizator, iar în cazul afirmativ, se crează un nou intent de tip MarkerInfoAcivity, și de asemenea, asocierea: MarkerInfoActivity._ListOfYoutubeModels = (ArrayList<YoutubeModel>)
markerModel._ListOfYoutubeModels
Această asociere setează valoarea listei de link-uri din MarkerInfoActivity.java, preluată de la MarkerModel, marker-lui ce a fost apăsat. Apoi se pornește noua activitate prin comanda startActivity(intent).
Metoda onResume() este apelată atunci când activitatea va începe să interacționeze cu utilizatorul
Clasa MapsActivity.java conține două clase inner, și anume MarkerModel și YoutubeModel
clasa inner, MarkerModel, conține următoarele două atribute declarate public:
_Marker care este de tip Marker
_ListOfYouTubeModels care este o listă de tipul YoutubeModels
De asemenea, conține constructorul MarkerModel care are doi parametrii: un parametru de tip Marker, iar celălalt de tip List<Strigs>.
În interiorul constructorului se înițializează _Marker cu valoaea marker și _ListOfYoutubeModels cu o listă de tip ArrayList<YoutubeModel>(). Mai precis, aceste două atribute iau valoarea parametrilor primiți de la funcția MarkerModel.
Se crează un for care parcurge lista de link-uri YouTube în care au fost introduce link-urile YouTube a tuturor markerelor create și adaugă link-urile Youtube care sunt de forma YoutubeModel în lista _ListOfYoutubeModels. Această clasă ne ajută să păstrăm toate datele unui marker într-un singur obiect.
Fig. 6.1 – Diagrama de clasă UML a aplicației
clasa inner, YoutubeModel, conține următoarele atribute declarate public:
atributul _YoutubeLink de tip String
atributul _ListOfComments de tip List<String>
Acestă clasă inner este folosită pentru setarea și obținerea liste de comentarii asociate fiecărui link YouTube, în urma parsării răspunuslui API primit.
Clasa MarkerInfoActivity permite vizualizarea link-urile atașate markerului care a fost apăsat, lista de comentarii atașate link-ului YouTube selectat, cât și vizionarea link-urilor.
Aceasta conține următoarele atribute:
_YoutubeLinkSpinner de tip Spinner – creat pentru vizualizarea tuturor link-urilor Youtube atașsate marker-ului
_ListOfYouTubeComments de tip ArryList<String>
_ListOfYoutubeModels de tip ArrayList<YoutubeModel> declarat public
Toate implementările acestei clase se face în interiorul metodei onCreate(Bundle savedInstanceState).
se preia instanța pentru afișarea titlului fiecărui marker
se inițializează un obiect de tip List<String> cu valoare unei noi Arrylist, List<String> listOfLinks = new ArrayList<String>() care va conține lista de link-uri asociate markerului
se crează un for care parcurge toate obiectele youtubeModel din lista _ListOfYoutubeModels și în interiorul căruia se adaugă link-ul _YoutubeLink din youtubeModel în lista listOfLinks.
se crează spinner-ul
se preiaua instanțele butonului Play, care, atunci când va fi apăsat va crea un nou intent care va lansa link-ul ales de către noi din spinner
se inițializează _ListOfYoutubeComments cu o listă de tip ArrayList<String>
se verifică dacă dimensiunea _ListOfYouTubeComments este diferită de 0, iar în acest caz se vor adăuga toate comentariile link-ului de YouTube selectat.
se preiau instanțele pentru vizualizarea listei de comentarii
atunci când se selectează link-ul din spinner , prin intermediul funcției public void onItemSelected adăugăm lista de comentarii în listă:
_ListOfYoutubeComments.addAll(_ListOfYoutubeModels
.get(_YoutubeLinksSpinner .getSelectedItemPosition())
.getListOfComments());
apoi se declară partea în care putem să adăugăm un comentariu și avem posibilitatea să îl trimitem, apăsând butonul Send. Acest lucru se face preluând instața pentru buton și câmpul în care putem se poate introduce comentariul. Apoi, când se apasă butonul se verifică dacă lungimea textului este diferită de zero, adică dacă s-a introdul măcar un caracter în câmpul de comentarii, lista de comentarii se va reactualiza cu cel nou adăugat, iar în caz că nu se introduce niciun caracter, se va afișa un mesaj de eroare.
6.3 JSON
JSON (JavaScript Object Notation) este o notație simplă și compactă pentru obiectele JavaScript. Obiectele pot fi ușor convertite în șiruri de caractere pentru a putea fi memorate și transmise (în rețea sau între aplicații). Partea bună a JSON este faptul că un obiect exprimat în JSON este de fapt exprimat într-un cod JavaScript. Există avantajul unei parsări automate în JavaScript. Trebuie doar ca JavaScript să interpreteze conținutul a unui șir de caractere JSON fără alte convertoare.
6.3.1 Sintaxa JSON
Datele JSON sunt exprimate ca o secvență a unui parametru și o pereche de valori, fiecare pereche folosind o coloană de caractere pentru a separa parametrul de valoare. Aceste perechi "parametru" : "valoare" sunt separate între ele prin virgulă.
"param1":"valoare1",
"param2:valoare2",
În final, totată această secvență este scrisă între acolade pentru a forma obiectul JSON, reprezentând datele noaste:
var jsonObject = {
"param1":"valoare1",
"param2":"valoare2",
"param3":"valoare3"
}
Obiectul jsonObject, definit aici, folosește un set de notații standarde JavaScript. Obiectele scrise folosind notația JSON poate avea proprietăți și metode accesate direct folosind notația uzuală cu punct.
alert(jsonObject.param1); // alertează "valoare1"
În mod mai general, JSON este o sintaxă pentru schimbul de date în format String (șir de caractere). Nu doar obiecte, ci orice tip de date care pot fi scrise sub formă de o serie de perechi parametru:valoare poate fi exprimat în notația JSON.
Este ușor să convertești un obiect JSON într-un șir de caractere printr-un proces numit serializare; datele serializate sunt utile pentru memorare sau transmisie de-a lungul rețelei.
JSON se poate folosi, oarecum, ca un XML; prin intermediul JSON se ușurează facilitează citirea codulului. De asemenea, parsând fișiere XML mari poate fi un proces încet, în timp ce JSON oferă scriptului un obiect Java, gata de a putea fi folosit [33].
Acesta oferă anumite avantaje:
ușor de a fi citit atât pentru oameni cât și pentru calculator
este un concept simplu – un obiect JSON nu este altceva decât a serie de perechi de tip parametru:valoare încadrat de două acolade
ușor de a fi creat și parsat
un subset JavaScript – însemnând că nu este nevoie de interpretatori speciali sau de alte pachete adiționale
6.3.2 Android JSON
Comunicațiile de date sunt un lucru comun în aplicațiile Android. Chiar dacă datele sunt memorate într-o bază de date sau trimise către o altă aplicație prin Internet, acestea trebuie să fie comunicate către și de la o aplicație. JSON este unul din formatele de schimb de date care a devenit popular și este folosit în aplicațiile Android. JSON este un format rapid, ușor de folosit și de gestionat a schimbului de date.
JSON este un protocol de comunicare și schimb de date. Este considerat o alternativă a XML-ului. Principala unitate de date a JSON-ului este JSONObject care conține datele sub formă de perechi de tip parametru:valoare.
Pentru serviciile oferite de aplicațiile Android, se preferă JSON. Mesajele JSON permit structurarea datelor, și, de asemenea, sunt mai mici în comparație cu același format de date, dar aflându-se într-un mesaj XML. Mai mult de atât, este mai ușor să parsezi JSON decât XML, așadar, dispozitivele mobile consumă mai puțină memorie, baterie [[34], [35]].
De asemnea, în următorul exemplu, putem observa cum este inclus un alt obiect jsonObject sub numele de detalii într-un alt obiect jsonObject:
{
"id" : "A101",
"numeprodus" : "Smartphone",
"pret" : "699.99",
"detalii" : {
"ambalat" : "Junie 2015",
"dată fabricat" : "Mai 2015",
"dată expirare" : "Decembrie 2016"
}
6.4 YouTube
YouTube conduce detașat atunci când vine vorba despre a vizualiza și a distribui videoclipuri în Internet prin intermediul site-urilor web, dispozitivelor mobile, blog, email, aplicații.YouTube permite utilizatorilor sa încarce și să distribuie un videoclip într-un mod foarte simplu.
Pe YouTube, userii pot căuta videoclipuri distribuite de către alți subscriberi. În anul 2006, Youtube a fost cumpărat de către compania Google, și încă de atunci acesta a încheiat parteneriate cu firme mari cum ar fi: BBC, Sony Music Group și multe altele.
Site-ul YouTube a devenit atât de popular încât, acum, oferă un set de dezvoltare API pentru a permite dezvoltatorilor software să integreze funcționalitățile YouTube pe un site-uri web. Totodată, YouTube APIs și "tool"-urile permit programatorilor să aducă experiența YouTube și pe aplicații sau dispozitive.
6.4.1 YouTube API
YouTube APIs și "tool"-urile permit dezvoltatorilor software să integreze conținutul video și funcționalitatea YouTube pe un site, aplicații și dispozitive. În primul rând, aceștia trebuie să decidă ce tip de API și ce "tool"-uri se potrivesc cel mai bine cerințelor lor. Este de preferat ca cei familiarizați cu HTML, dar nu la fel de cunoscători a JavaScript să ia în considerare Widget-urile puse la dispoziție. Dacă aceștia cunosc JavaScript, ar trebui să arunce o privire către Player APIs, iar pentru cei ce
programează un dispozitiv sau implementează partea de server a unui site sau a unei aplicații, ar trebuie să se orienteze către YouTube Data API.
Widget – acestea sunt elementele de pagină simple pe care programatorii le pot introduce pe site-ul lor web pentru a avea acces la YouTube. Doar adăugând un videclip sau oferind posibilitatea utilizatorilor de a căuta un videoclip, crește utilizarea site-ului respectiv. Toate acestea pot fi realizate doar, adăugând câteva linii de cod JavaScript. Widget-urile sunt componente JavaScript pe care utilizatorii le pot pune pe un site web pentru a puea oferi conținutul YouTube. Spre deosebire de "custom player" care nu necesită cunoștințe în domeniul progrramării, aceste widget-uri sunt pentru cei care cunosc HTML sau JavaScript, dar nu sunt familiarizați cu programarea părții de server. Sunt disponibile două tipuri de Widget și anume, Video Bar și Video Search Control.
YouTube Player APIs – permite controlul player-ului YouTube folosind JavaScript. Acesta este player-ul de bază (cel mai des utilizat), și mai există și un player "chromeless" care permite crearea propriilor controale ale player-ului. Player APIs permit dezvoltatorilor software să stabilească modul în care utilizatorii pot controla redarea videoclipului YouTube pe site-ul web. Configurând unele setări de bază pentru interfața player-ului, se poate construi un control al "custom player". De asemnea, oferă mecanisme ce permit controlul modului de afișare al videoclipului pe site. Este important să facem diferența între două tipuri de playere: player-ul de bază, cel mai des întâlnit pe Internet, și cel de-al doilea, player-ul "chromeless", care este un "video box" ce nu dispune de control. Cel de-al doilea este implementat de către programatorii cu experiență care vor să ofere un design personalizat al player-ului utilizatorilor. Ambele tipuri de player folosesc același API.
YouTube Custom Player – dezvoltatorii software pot configura player-ul în funcție de cum vrem să apară playlistul sau videoclipurile favorite. Uneori este bine să avem un control al site-ului web fără a fi nevoie să îl edităm. YouTube Custom Player permite personalizarea player-ului YouTube și popularea acestuia cu anumite videoclipuri. Odată ce "custom player"-ul este pe site, se pot încărca conținutul și înfățișarea doar accesând site-ul YouTube și întrând în contul personal.
YouTube Data API – permite dezvoltatorilor software să încorporeze funcționalitatea YouTube în aplicații. Se pot efectua căutări, încărcări de videoclipuri, creare de playlist și multe altele. Un program se poate autentifica ca un utilizator pentru a încărca videoclipuri, a modifica playlist-ul utilizatorului și așa mai departe. YouTube Data API este esențial pentru dezvoltatorii software care construiesc partea de server. Este foarte util pentru aplicații care vor să integreze funcționalitățile YouTube.
YouTube Data API oferă acces la videoclipuri și la informațiile utilizatorului ce sunt memorate în serverele YouTube. Datorită acestui lucru, aplicația se poate personaliza cu informații despre utilizatori, dar la fel de bine poate conține și acțiunile efectuate de aceștia, cum ar fi, comentariile date sau rating-ul acordat unui sau mai multor videoclipuri.
Pentru a facilita lucrul cu API, există o serie de librării client care abstractizează API într-un model de obiect de limbaj specific. Aceste librării client sunt open-source și pot fi folosite și modificate sub licența Apache 2.0 [36].
6.4.2 Configurarea YouTube Data API
În general, dacă nu s-a creat deja aplicația pentru care vrem să accesăm YouTube Data API și orice alt API pus la dispoziție, cum ar fi Google Maps API, în Google Developer Console trebuie să se
obțină un ID al aplicației și apoi, indiferent dacă aceasta era creată sau s-a creat acum, trebuie să se genereze o cheie API. De asemenea, aplicația trebuie să obțină credențialul de autorizare pentru a putea folosi YouTube Data API. Există două tipuri de credențiale:
OAuth 2.0 – aplicația trebuie să trimită un token OAuth 2.0 cu orice cerere care accesează date private ale utilizatorului. Aplicația trimite credențiale OAuth 2.0 pentru aplicații web, conturi sau aplicații instalate
API Keys – o cerere care nu oferă un token OAuth 2.0 trebuie să trimită o cheie API. Aceasta identifică proiectul și oferă acces, interogări și raporturi API.
Pentru aplicația realizată trebuie să se utilizeze credențialul API Key. Totodată, trebuie să se asigure faptul că aplicația permite folosirea serviciului YouTube Data API, iar acest lucru se face urmând următorii pași:
se selectează proiectul pentru care se vrea accesul la YouTube Data API din Google Developer Console
în meniul APIs&auth, se apasă pe API, iar în această listă trebuie ca statusul pentru YouTube Data API v3 să fie activat, dacă nu este, se activează
se selectează Credentials și se crează o nouă cheie API de tip Browser Keys – se folosește daca aplicația rulează pe un motor de căutare web
Așa cum se observă în Fig. 6.1, există o cheie genertă pentru Google Maps, de tip Android Key care a fost creată și generată în Capitolul 5 și noua cheie de tip Browser Key pentru a putea folosi YouTube ca server în aplicație [[37], [38]].
Fig. 6.2 – Generarea Browser Key pentru YouTube Data API
6.4.2.1 Obținerea listei de comentarii
YouTube Data API permite integrarea funcțiilor executate pe site-ul YouTube pe propriul site web sau aplicație.
O resursă reprezintă un tip de item care cuprinde o parte a performanțelor YouTube, cum ar fi video, playlist. Resursele sunt reprezentate ca obiecte JSON.
Resursa commentThread oferă informații despe comentariile asociate unui videoclip YouTube, care conține comentariile de tip "top level" cât și răspunsurile la acestea, dacă există. Această resursă poate reprezenta comentariile despre un videoclip sau un canal.
Atât comentariile "top level" cât și răspunsurile sunt o resursă de tip comment introdusă în resursa commentThread. Resursa commentThread nu conține toate răspunsurile la comentariile "top level", dar pentru a putea realiza acest lucru, trebuie folosită metoda comment.list. De asemnea, trebuie luat în considerare că nu toate comentariile au un răspuns.
Mai jos este lista de parametrii pe care o suportă această interogare:
part – un parametru necesar; este de tipul String (șir de caractere) și specifică o listă separată, prin virgulă, a unor sau mai multor proprietăți ale resursei commentThread care vor fi incluse în răspunsul API
allThreadsRelatedToChannelId – un parametru de tip filtru; este de tip String și înștiințează API să returneze toate thread-urile asociate cu un anumit canal. Răspunsul poate să conțină comentariile despre canal sau despre videoclipurile din canal
channelId – un parametru de tip filtru; este de tip String și înștiințează API să returneze thread-urile care conțin comentariile despre un anumit canal. Răspunsul nu va conține comentariile lăsate la un videoclip
id – un parametru de tip filtru; este de tip String și specifică o listă separată prin virgulă de ID-uri ale thread-urilor pentru resursele care sunt preluate
videoId – un parametru de tip filtru; este de tipul String și înștiințează API să returneze o listă a thread-urilor asociate cu un ID al unui videoclip
maxResult – un parametru opțional; este de tipul număr natural întreg și specifică numărul maxim de itemi care ar trebui returnați în răspunsul API
moderationStatus – un parametru opțional; este de tipul Sring și poate fi folosit într-o cerere de autorizare.
order – un parametru opțional; este de tip String și specifică ordinea în care răspunsul API ar trebui să afișeze thread-urile
pageToken – un parametru de tip opțional; este de tipul String și identifică o pagină specifică în setul de rezultate care ar trebui returnată. În răspunsul API, această proprietate identifică următoare pagină a rezultatului care poate fi recuperată
searchTerms – un parametru opțional; este de tip String și înștiințează API să afișeze în răspunsul API doar comentariile care conțin anumite cuvinte cheie
textFormat – un parametru opțional; este de tipul String și identifică dacă API ar trebui să returneze comentariile în format HTML sau text [39]
Pentru a vedea cererea și răspunsul API, se folosește API Explorer pentru a apela această metodă în care se pot introduce datele online, accesând următorul site:
https://developers.google.com/youtube/v3/docs/commentThreads/list
Apoi se completează câmpurile descrise mai jos și se introduce site-ul generat în motorul de căutare, împreună cu cheia Browser API obținută, pentru a putea observa răspunsul API. Acesta este afișat în Fig. 6.2.
Pentru a obține cererea HTTP trebuie să se completeze următorii parametrii:
part : snippet – ce este un obiect ce conține detaliile de bază despre un video, cum ar fi titlul, descrierea, tag-uri si alte caracteristici.
videoId : 7pEbwTPC-Ng – este ID-ul unui videoclip YouTube ce poate fi găsit în link-ul unde rulează acesta, aflându-se după elementul "="
Apoi se apasă Execute, iar mai jos se generează cererea care este sub forma:
GET https://www.googleapis.com/youtube/v3/commentThreads?part=snippet&id SK9fsEw085U&key={YOUR_API_KEY}
Fig. 6.3 – API Response
După cum se poate observa, se pune automat ID-ul videoclipului, iar la final trebuie să se introducă cheia API care a fost obținută anterior (Capitol 6.1.3). Astfel în locul {YOUR_API_KEY} se introduce cheia generată, și anume, AIzaSyBp7i36q75LSFI92ngIsBrAGJku76FvHJQ .
6.4.3 Accesul la lista de comentarii
Pentru a putea avea acces la lista de comentarii asociate fiecărui link YouTube, trebuie să facem o cere și un răspuns http. Executarea unei metode HTTP implică una sau mai multe schimburi de tipul
cerere/răspuns HTTP. Principalul punct de conectare este interfața HttpClient care definește cele descrise mai sus.
6.4.3.1 Cererea HTTP
Toate cererile HTTP au o metodă specifică, care conține cererea URI, a lunk-ului, și versiunea de protocol HTTP. HttpClient suportă toate metodele HTTP definite în HTTP/1.1 cum ar fi: GET, HEAD, PUT, DELETE, OPTIONS.Există o clasă specifică ăentru fiecare tip demetodă: HttpGet, HttpHead, HttpPut, HttpDelete, HttpOptions.
Cererea Request-URI este un identificator de resursă uniform (Uniform Resource Identifier) care identifică resursa căreia i se aplică cererea. Cererea HTTP constă într-o schemă de protocol, nume gazdă, calea resursei, interogrări opționale, și fragmente opționale.
6.4.3.2 Răspunsul HTTP
Răspunsul HTTP este un mesaj trimis de către server înapoi clientului după ce a primit și a interpretat cererea.
Odată cererea trimisă, motorul de căutare face un request de tip GET către server, iar după ce serverul o primește , trimite un răspuns de tip JSON, prin urmare trebuie să se facă parsarea pentru Android. Astfel, răspunsul se preia sub formă de șir de caractere, String.
6.5 Android Manifest
Proiectul este creat pentru platforma Android având în spate limbajul de programare Java. Ca orice proiect Android, principalul fișier de configurare este AndroidManifest.xml. Pentru început se definește pachetul dorit de noi care trebuie să fie unic.
Un pachet este legat de un set de clase. Proiectul conține mai multe clase legate între ele cu un singur scop, și anume să ofere funcționalitatea aplicației Android.
Toate numele pachetelor din sistemul Android trebuie să fie unice. Numele pachetului este folosit ca un identificator al aplicației de către sistemul de operare Android.
În continuare se adaugă permisiunile necesare în proiect și care trebuie acceptate de către utilizator la instalarea aplicației. În acest caz, sunt necesare permisiunile pentru conexiunea la Internet, scrierea pe cardul de memorie și permisiunea pentru GPS și hartă și se pot găsi în Anexa 1. Urmează secțiunea de application unde se specifică resursele, proprietățile și componentele aplicației:
elementul android:allowBackUp – când este setat pe "true" acest element oferă un punct de repornire al aplicației, așa încât în cazul în care utilizatorul restartează dispozitivul sau actualizează sistemul, în mod automat atunci când aplicația este reinstalată, pornește de la back-up-ul salvat în cloud
elementul android:icon – definește icon-ul aplicațieipe care utilizatorul îl poate vedea. Există diferite dimensiuni ale icon-ului în funcție de rezoluția ecranului. Ține de sistem să aleagă icon-ul optim pentru rezoluția dispozitivului oferit.
elementul android:label – este numele aplicației pe care utilizatorul îl vede pe dispozitiv
elementul android:theme – acest element specifică stilul aplicației. Stilul este un grup de proprietăți – lungime, lățime, culoare, fundal, care determină înfățișareași formatul widget-urilor sau a ecranului. Acesta este definit în fișierul res/values/styles.xml.
elementul activity – fiecare activitate trebuie definită în fișierul manifest. Astfel, fiecare activitate adăugată în proiect trebuie înregistrată în fișierul AndroidManifest.xml
elementul android:name – acest element indică clasa Java asociată activității. Se poate folosi numele complet al pachetului sau numele clasei ori se poate pune punct apoi numele activității, de exemplu:android:name=".MenuActivity" sau
android:name="proiectlicenta.etti.ro.proiectlicentagmaps.MenuActivity
elementul android:label – atunci când este asociat în tagul <activity>, acest element oferă numele activității care este afișat pe ecran.
elementul intent-filter – este foarte important. În acest mod poți spune sistemului Android când și cum să activeze activitatea
elementul <action> – este numit android.intent.action.MAIN. MAIN indică că această activitate este principala activitate a aplicației care este punctul de intrare.
elementul <category> – este numit android.intent.category. LAUNCHER și indică cum să pornească această activitate. LAUNCHER înseamnă că poate fi lansat de pe icon-ul de lansare din dispozitiv [41].
Acestea sunt elementele necesare pe care orice fișier manifest al oricărui proiect Android trebuie să le aibă pentru a funcționa. Alte activități care mai trebuie adăugate sunt MapsActivity.java și MarkerInfoActivity.java.
De asemenea, se adaugă elementul <meta-data> necesar pentru GoogleMaps, mai exact versiunea de gms cât și API key generat în Developer Console.
6.6 MenuActivity
Fiind activitatea de start are doar funcția de meniu unde sunt afișate cele două butoane. Aceste două butoane sunt create în layout prin intermediul unui fișier xml specific clasei aflat în directorul /res/layout/activity_menu.xml, având codul sursă în Anexa 2.
În acest fișier xml se află un LinearLayout. LinearLayout este unul din cele mai simple și comune tipuri de layout folosit de dezvoltatorii Android pentru a organiza interfața cu utilizatorul. Acesta organizează interfața în mod vertical sau orizontal. Atunci când orientarea layout-ului este verticală, toate componentele din interior sunt organizate într-o singură coloană, iar atunci când orientarea este orizontală, toate componentele sunt organizate într-un singur rând.
În cazul nostru, LinearLayout este setat cu orientarea verticală și are proprietatea de a prelua dimensiunile ecranului [42].
Componentele "width" (lățime) și "height" (înălțime) se pot seta "fill_parent" care îi spun layout-ului să folosească tot spațiul disponibil de pe ecran sau se poate seta "wrap_content", așa cum este și în cazul aplicației, prin care se folosesște doar spațiul necesat pentru conținut.
Cele două butoane sunt puse în interiorul acestui layout. Elemetul <Button> cuprinde:
elementul android:id – indică faptul că orice obiect trebuie să aibă un identificator de tip integer asociat pentru o identificare unică în program. Atunci când aplicația este compilată, se face referire la identificator ca fiind un număr întreg, dar în mod obișnuit, în cadrul fișierului xml, i se atribuie un șir de caractere: android:id= "@+id/mapsButton", mapsButton fiind identificatorul de tip String al butonului. Simbolul "@" indică faptul că XML-ul trebuie să facă conversia șirului de caractere și să îl identifice ca o resursă. Simbolul "+" anunță că este un nume de resursă nou care trebuie creat și adăugat în fișierul de resurse R.java.
elementul android:layout_width="200dp" – specifică lățimea butonului, care în cazul nostru este de 200dp
elementul android:text="@string/Maps" – indică numele butonului care va apărea atunci când rulăm aplicația pe un emulator.
Datorită faptului că avem două butoane, vor exista două elemente de tip <Button>, personalizate pentru fiecare buton în parte. Această activitate se poate vedea în Fig. 6.1.
MenuActivity.java, ca orice activitate, are constructorul implicit și metoda apelată automat void OnCreate(Bundle bundle). În această metodă se definește ce view îi este asociat, în cazul acesta, activity_menu.xml. După cum am precizat anterior, în cadrul acestui xml se află două butoane identificate printr-un id. Pentru a le prelua, se folosește o metodă specifică Activity-ului și anume (Button)findViewById(R.id.mapsButton), mapsButton fiind identificatorul butonului.
Fig. 6.4 – Activitatea MenuActivity Fig. 6.5 – Apăsarea butonului YOUTUBE
După preluarea instanței butonului, se setează metoda View.OnClickListener() ce este apelată atunci când se apasă butonul. Se crează un obiect de tipul View.OnClickListener în care se inițializează un nou intent de tipul MapsActivity.java, iar startActivity(intent) va lansa o nouă activitate, după cum putem observa și în codul din Anexa 2.
Similar este și butonul YouTubeButton, cu diferența că noul intent creat nu mai lansează o nouă activitate, ci va lansa un view generat de Android, având drept parametru un link YouTube, așa cum se poate observa în Fig. 6.2. Astfel, se pornește instanța de vizualizat link-ul, oferindu-i utilizatorului posibilitatea de a alege dacă dorește lansarea videoclipului din aplicația YouTube sau din motorul de căutare Internet.
După preluarea instanței butonului, se setează metoda View.OnClickListener() ce este apelată atunci când se apasă butonul. Se crează un obiect de tipul View.OnClickListener în care se inițializează un nou intent de tipul MapsActivity.java, iar startActivity(intent) va lansa o nouă activitate, după cum putem observa și în codul din Anexa 2.
Similar este și butonul YouTubeButton, cu diferența că noul intent creat nu mai lansează o nouă activitate, ci va lansa un view generat de Android, având drept parametru un link YouTube, așa cum se poate observa în Fig. 6.2. Astfel, se pornește instanța de vizualizat link-ul, oferindu-i utilizatorului posibilitatea de a alege dacă dorește lansarea videoclipului din aplicația YouTube sau din motorul de căutare Internet.
6.7 MapsActivity
Clasa MapsActivity.java extinde FragmentActivity și implementează metode de la com.google.android.gms.maps.GoogleMap.OnMarkerClickListener.
GoogleMap.OnMarkerClickListener definește metode care sunt apelate atunci când se apasă pe un marker, de exemplu metoda onMarkerClick care primește ca parametru un obiect de tip Marker.
Un Fragment reprezintă o porțiune din interfața cu utilizatorul sau o operație care rulează în interiorul unui Activity. O singura activitate poate conține mai multe fragmente și mai multe fragmente pot fi refolosite în diferite activități. Putem spune că un fragment este un tip de sub-activitate care poate fi utilizat în mai multe activități [43]. Principalul avantaj al folosirii fragmentelor este faptul că se pot refolosi componentele în diferite layout-uri. Fragmentele trebuie introduse în interiorul activităților, nu pot rula independent de activități. Google oferă librăria Java care trebuie inclusă în aplicație, implementând suportul pentru fragmente,
android.support.v4.app.FragmentActivity, care este clasa de bază pentru toate activitățile care caracteristici ale fragmentelor [43]. Aceste două tag-uri declarate sunt folosite ca și chei atunci când se transmit date activității create în momentul în care se apasă pe marker.
Metoda setUpMapIfNeeded este prima metodă apelată, iar aceasta are rolul de a verifica dacă există o hartă, iar în cazul afirmativ, se apelează metoda setUpMap() și se setează setOnMarkerClickListener ceea ce înseamnă că atunci când se apasă pe marker se apelează metoda onMarkerClick. În metoda setUpMap() se adaugă noi markere, iar acest lucru se face prin intermediul googlemap.addMarker a unui nou obiect de tip MarkerOption ce are ca poziție un nou obiect de tip LatLng și denumirea dorită pentru markerul creat.
De asemenea, această activitate include și partea în care se interpretează răspunsul primit de către YouTube Data API. Mai întâi, se inițializează un thread, un fir de execuție, care execută porțiuni distincte de cod în paralel în interiorul aceluiasși proces. Apoi, se crează un for ce parcurge toată lista de markeri, iar pentru fiecare marker se mai crează un for ce parcurge lista de link-uri YouTube asociată, scopul fiind obținerea identificatorului fiecărui videoclip ce va fi folosit în continuarea în Cererea HTTP. În această afișată mai jos a necesitate divizarea link-ului pentru obținerea răspunsului API acolo unde trebuie introdus fiecare identificator al videoclipului, mai precis este o generalizare a
câmpurilor introduse în subcapitolul anterior, iar la final se adaugă cheia YouTube Data API obținută, care este aceeași pentru fiecare videoclip.
URI("https://www.googleapis.com/youtube/v3/commentThreads?part=snippet&videoId=" + splitUrl[1] + "&key=AIzaSyBp7i36q75LSFI92ngIsBrAGJku76FvHJQ"));
În continuare, după ce serverul a primit și a interpretat cererea făcuta, se primește răspunsul de tip JSON. Pentru a putea avea acces la lista de comentarii a fiecărui link YouTube, trebuie să se preia pe nivele datele din răspunsul primit, până se ajunge la preluarea listei de comentarii, care se să fie afișată în aplicație. Pentru acest lucru, se crează mai multe obiecte de tip JSONObject care iau aceste informații.
JSONObject itemJsonObj = items.getJSONObject(i);
JSONObject snippedJsonObj = itemJsonObj.getJSONObject("snippet");
JSONObject topLevelComment =
snippedJsonObj.getJSONObject("topLevelComment");
JSONObject snippet = topLevelComment.getJSONObject("snippet");
String textDisplay = snippet.getString("textDisplay");
Într-o listă de tip ArryList<String> se salvează toate aceste informații pentru fiecare link și o trimite către clasa inner YoutubeModel care are rolul de obține și de seta lista de comentarii.
6.7.1 Adăugarea Markerelor
În continuare vom vorbi despre adăugarea mai multor markere pe hartă pentru a avea ca rezultat o hartă interactivă, de unde vom avea posibilitatea să alegem un loc pe care dorim să îl vizităm.
Un marker indică o locație de pe hartă. Următorul exemplu ne arată cum să adăugăm un marker pe o hartă. Marker-ul se creează la coordonatele (Latitudine, Longitudine) = (44.4278, 26.087378).
LatLng latlng1 = new LatLng(44.4278, 26.087378);
Marker marker1 = googlemap.addMarker(markeroptions .position(latlng1)
.title("Casa Poporului"));
Pentru a avea mai multe markere, se crează pentru fiecare câte un obiect care aparține clasei LatLng, care este o clasă ce reprezintă o pereche de coordonate de tip latitudine și longitudine, salvată sub formă de grade, și un obiect de tip Marker, care conține modelul de clasă ce aparține de Google Maps Android API pentru crearea unui marker plasat pe hartă, de exemplu, pentru un marker, să îl denumim Marker 2, vom crea un obiect latlng2 unde vom da coordonatele noului Marker 2, și un obiect marker2, care reprezintă identitatea noului marker adăugat. Obiectul markeroptions ce aparține clasei MarkerOptions() trebuie declarat înainte și este folosit pentru atribuirea poziției și numelui markerului, așa cum este exemplificat în Anexa 2.
După execuția programului se va afișa harta ca în Figura 6.3, unde avem patru markere, cel de la Casa Poporului, Muzeul Antipa, Muzeul Țăranului Român și cel din dreapta care are coordonatele hotelului Intercontinental, reprezentând și punctul 0 al orașului București și altele.
Fig. 6.6 – Afișarea mai multor Markere pe hartă
6.7.2 Activitatea unui Marker
Fiecare marker are o listă de comentarii și o listă de link-uri YouTube. Pentru acest lucru am creat o clasă "inner".
O clasă Java inner este o clasă declarată în interiorul unei clase. O clasă inner are acces la toate câmpurile și metodele a clasei din care face parte, în cazul nostru MapsActivity – chiar dacă sunt pivate [44]. Clasa inner creată se numește MarkerModel și are rolul de a păstra toate datele markerului într-un singur obiect care, apoi, este adăugat într-o listă. Această clasă conține:
_Marker – este instanța de marker creată în metoda setUpMap()
_ListOfYouTubeLink – lista de link-uri YouTube
_ListOfComments – lista de comentarii
Listele de obiecte sunt de tipul ArrayLists<String>, iar crearea lor se face prin metoda new ArrayList<>(Arrays.asList(new String[]{})).
După ce a fost creat un obiect markermodel de tip MarkerModel, acesta este adăugat în ListOfMarker, care este o listă de tip ArrayList și este folosit în continuare în metoda onMarkerClick(). În această metodă se parcurg toate obiectele din lista de markere, iar dacă există în listă un marker egal cu markerul pe care utilizatorul l-a apăsat, atunci se crează un nou intent de tipul
MarkerInfoActivity.class și se transmit parametrii către această clasă prin intermediul intent.putStringArrayListExtra cu tag-ul specific fiecărei liste.
Să luăm exemplul pentru Markerul 6, căruia i-am atribuit deja coordonatele (Latitudine, Longitudine) = (44.4479, 26.0677), reprezentând Arcul de Triumf.
După cum se va vedea în Fig. 6.4 și Fig. 6.5, îi atribui patru link-uri YouTube, iar la linkul selectat apar comentariile preluate din YouTube..
Fig.6.7 – Afișarea link-urilor YouTube Fig. 6.8 – Afișarea listei de comentarii
6.8 MarkerInfoActivity
Această activitate conține o listă de vizualizat link-urile YouTube, un buton de pornit link-ul YouTube, o listă de vizualizat comentarii și un câmp unde se pot adăuga noi comentarii. Noile comenatrii se fac prin scrierea textului în câmpul disponibil și apăsarea butonului Send, iar comentariul va fi adăugat la sfârșitul listei. Layout-ul acestei clase Java îl putem găsi în Anexa 3.
În metoda onCreate(Bundle savedInstanceState) se preiau cele două liste specificate în intent cu ajutorul metodei getStringArrayListExtra ce primește ca parametru cheia transmisă în clasa MapsActivity (Anexa 3).
Se crează un nou ArrayAdapter pentru afișarea tuturor link-urilor YouTube și, de asemenea, este asociat unui spinner, ca în Fig. 6.4. ArrayAdapter este o alegere bună atunci când există o singură coloană de date sau când datele vin de la o resursă de tip array [45].
La fel ca în clasa MenuActivity, se preia butonul playButton și se crează un nou intent cu link-ul ales în spinner.
De asemenea, lista de comentarii are și ea un ArrayAdapter în care îi este transmis _ListOfComments preluat din intent.
Fig. 6.9 – Comentariu adăugat Fig. 6.10 – Eroare "Nu se poate adăuga text gol"
Butonul sendComment are ca acțiune preluarea textului din chenarul de comentarii, iar dacă acesta nu este gol, este adăugat în lista de comentarii. Apoi se anunță adapter-ul setat la listview că datele au fost schimbate și trebuie să se facă o reactualizare. Acest lucru se observă în Fig 6.6. În cazul în care se apasă butonul Sent, dar nu se scrie nimic în câmpul destinat comentariilor, va apărea o eroare ca în Fig. 6.7.
6.9 Rularea aplicați
Pentru a putea rula aplicația, în mediul de dezvoltare se apasă butonul Run și se alege dispozitivul pe care se vrea afișarea acesteia. Pentru acest lucru, s-au ales două dispozitive, unul virtual, creat cu ajutorul programului Genymotion, iar al doilea fiind un telefon mobil Samsung Galaxy Core Prime.
6.9.1 Dispozitiv virtual Motorola Moto X
Pentru a putea rula aplicația pe calculator, s-a folosit programul Genymotion care oferă o gamă mai mare de dispozitive virtuale, în comparație cu ce oferă ADV din mediul de dezvoltare Eclipse.
Fig. 6.11 – Caracteristici tehnice emulator
S-a ales dispozitivul virtual Motorola Moto X, ilustart în Fig. 6.9, cu versiunea de Android 4.4.4 (API 19). Pentru a îl instala s-au urmat pașii din capitolul 3.6. Acest dispozitiv prezintă caracteristici tehnice afișate în Fig. 6.8.
Pentru a putea avea acces la hartă, a trebuit să se instaleze Google Play Services. Acest lucru este posibil descărcând de pe Internet un fișier specific de tip arhivă care se instalează în emulator cu drag and drop.
După instalarea Google Play Stervices, a trebuit să se mai instaleze o arhivă pentru a se încărca harta Google. Aceste două instalări suplimentare au fpst făcute ulterior, când s-a observat că emulatorul nu deschidea harta, inițial, apoi că nu se încărca harta, cu toate că pe telefonul mobil aplicația mergea corespunzător.
6.9.2 Dispozitiv Samsung Galaxy Core Prime
Pentru a testa aplicația și pe un dispozitiv fizic, oferind posibilitatea unui transport mai ușor și aplicația rulând pe el și fără o conexiune la calculator, s-a ales dispozitivul din gama Samsung, similar cu cel din Fig. 6.10. Acesta are o versiune a sistemului de operare Android 4.4.4 , similar ca emulatorul.
Pentru a putea rula aplicația pe telefon, a trebuit să se intre în modul Build. Acest lucru a fost posibil prin apăsarea repetată a câmpului Build number care se află în meniul Settings->About device. După afișarea mesajului că s-a intrat în modul de dezvoltare, în meniul Settings apare un nou câmp, și anume Developer options. Setarea care se face în interiorul acestui câmp, este bifarea căsuței în care se specifica pornirea în modul Debugg atunci când există o conexiune USB cu calculatorul.
În Fig. 6.11 și Fig. 6.12 putem observa emulatorul și dispozitivul mobil pe care s-a rulat aplicația.
Fig. 6.12 – Emulator Motorola Moto X Fig. 6.13 – Dispozitiv Mobil Samsung Galaxy Core prime
Concluzii
În urma elaborării proiectului, constat funcționalitățile avansate ale telefoanelor mobile, ce folosesc rețeaua de comunicații mobile pentru a putea oferi facilități de nivel înalt utilizatorilor.
În primul capitol am abordat tema rețelelor mobile, care au o mare importanță atunci când vine vorba despre utilizarea tehnologiei cu ajutorul lor. Evoluția acestor rețele ne ajută pe noi, deținătorii dispozitivelor Smartphone, să avem acces la diferite aplicații care ne pot ajuta în viața de zi cu zi sau aplicații de divertisment sau de socializare. Datorită faptului că studiul rețelelor de comunicații mobile se află într-o continuă dezvoltare și se descoperă noi metode prin care se poate mări transferul de date, duce la cresterea utilizării aplicațiilor complexe pe terminalele mobile. În prezent, rețeaua 4G este implementată la nivel global și separă traficul din downlink de cel din uplink , ajungând la viteze mult mai mari față de rețelele predecesoare, cum ar fi 1 Gb/s în downlink și 500 Mb/s în uplink. WiMAX este, de asemenea, o rețea wireless ce se dorește a fi implementată, dar costurile acesteia sunt foarte mari.
Al doilea capitol face o scurtă prezentare a sistemului de operare Android și a terminalelor ce funcționează pe acest sistem de operare. Astfel, aflăm că Android este cel mai răspândit la ora actuală și o altă caracteristică importantă constă în faptul că este "open-source", adică permite oricărui utilizator să aducă schimbări la nivel software și să le distribuie mai departe și altor utilizatori pentru a putea avea acces la acele îmbunătățiri. De asemenea, Licenta Apache v2 permite furnizorilor de servicii și producatorilor de dispoztive să facă schimbări la nivel softare, însă, fără a le distribui și altor producători. Chiar dacă se realizează asceste schimbări, caracteristicile unui dispozitiv mobil ce rulează pe sistemul de operare Android sunt aceleași. Ultima versiune ce implementată pe dispozitivele mobile este 5.0 sau Lollipop.
Următorul capitol ne introduce în lumea programării și ne prezintă mediile integrate de dezvoltare Eclipse și Android Studio, dar și kit-ul de dezvoltare necesar pentru construirea, testarea și depanarea unei aplicații, Android SDK. Eclipse a fost cel mai răspândit mediu de dezvoltare, dar în ultima perioadă Android Studio a devenit cel mai utilizat program pentru conceperea aplicațiilor Android. Eclipse oferă posibilitatea creării și altor tipuri de proiecte, cum ar fi proiecte Java, iar pentru a putea realiza o aplicație pentru sistemul de operare Android, trebuie instalat plug-in-ul Android Development Tools, astfel, oferind posibilitatea dezvoltatorului software să folosească cele necesare pentru dezvoltarea unei astfel de aplicații. De asemenea, emulatoarele se încarcă foarte greu, ocupă multe resurse și unele nu suportă instalarea serviciilor Google Play Services, care sunt necesare pentru a avea acces la hartă. În schimb, Android Studio este special conceput pentru realizarea aplicațiilor pentru sistemul de operare Android, este mult mai fiabil și mai ușor de folosit, iar gama de dispozitive virtuale ce pot fi instalate este mult mai mare. Pentru a putea începe dezvoltarea unei aplicații avem nevoie de librării, modele de coduri sursă, de documentații pentru API, emulatoare, iar toate acestea le gutem găsi și downloada din Android SDK Manager. Acesta se poate folosi și de către Eclipse și de către Android Studio, dacă vrem să lucrăm în ambele medii integrate de dezvoltare, trebuie doar să specificăm locul unde se află stocat pentru ca programele să poate avea acces la cele necesare pentru a putea compila aplicația. De asemenea, crearea unui fișier .apk este necesară pentru a putea rula aplicația pe orice dispozitiv, care rulează pe un nivel API sau versiune de Android cuprins între nivelul de API minim și maxim ales atunci când am creat aplicația.
Capitolul patru ne face o scurtă prezentare despre ceea ce înseamnă cuvântul locație atunci când se vorbește despre module de servicii pe bază de localizare. Pentru a determina locația unui dispozitiv, și implicit a unui utilizator, avem nevoie de coordonate, care sunt oferite de către GPS sau rețeaua mobilă. În funcție de furnizorul de locație ales, trebuie să facem compromisuri, de exemplu, pentru o mai bună acuratețe și precizie folosim GPS-ul, dar acesta implică un consum mai mare al bateriei, în schimb, dacă alegem rețelele mobile, putem avea o precizie mai mică acolo unde nu avem semnal foarte bun, dar în schimb avem un consum mai mic al bateriei. Și, bineînțeles, ne trebuie un "traducător" care să facă conversia adreselor ce pot fi citite de către orice utilizator în coordonate pentru a putea fi interpretate, ulterior, în aplicație.
Pentru a putea realiza o aplicație folosind module de servicii pe bază de localizare, deci, având acces la harta Google, trebuie să obținem cheia Google Maps Key și să instalăm tool-urile necesare din Android SDK Manager ce ne permit accesul la Google Play Services. Astfel, în capitolul 5 sunt descriși toți pașii de obținere a cheii API și rularea unui program, deja realizat de către Android Studio, alegând opțiunea pentru aplicațiea ce folosește harta. Acest program ne arată faptul că am creat o cheie API corespunzătoare și că a fost introdusă în fișierele aplicației pentru a putea downloada harta din serverele Google și de a o vizualiza.
Ultimul capitol face o descriere practică a aplicației, care are acum acces la harta Google, după cum ne-a fost prezentat anterior. Am creat o aplicație ce utilizează site-ul YouTube pentru a putea adăuga comentarii unui videoclip sau doar pentru a vedea opiniile altor utilizatori despre un anumit loc. Pentru a avea posibilitatea de a accesa informațiile de la YouTube, a trebuit să introduc un nou API și anume ,YouTube Data API, și să generez un alt tip de cheie, care să ne permită apelarea unor informații de la YouYube. De asemenea, am descris toți pașii pe care i-am urmat pentru a avea acces la YouTube și, nu în ultimul rând, m-am familiarizat cu conceptul de JSON, care se află într-un răspuns API, ce conține comentariile unui videoclip ce voiam să fie vizibil în aplicație.
Pentru a descrie structura sistemului s-a folosit reprezentarea cu ajutorul diagramelor de clasă UML.
Bibliografie
Retta Guy, The evolution of mobile teaching and learning, Editura Informing Science Press, 2009
Minoru Etoh, Next Generation Mobile System, Editura Wiley, 2005
Ajay R. Mishra, Fundamentals of Cellular Network Planning and Optimisation: 2G/2.5G/3G… Evolution to 4G, Editura Wiley, Aprilie 2004
Iti Saha Misra, Wireless Communication and Networks 3G and Beyond, Editua McGraw Hill Education, 2009
Sumit Kasera, 3G Networks. Architecture, Protocols and Procedures, Editura Tata McGraw-Hill, 2004
Iti Saha Misra, Wireless Communication and Networks 3G and Beyond, Editua McGraw Hill Education, 2009
http://nutaq.com/en/blog/gsm-networks-%E2%80%93-part-1-overview, accesat la data 23 martie
Todor Cooklev, Wireless Communication Standard: A study of IEEE 802.11, 802.15, 802.16, Editura Wiley, 2011
http://semtop.blogspot.ro/2010/01/3-3g-architecture.html, accesat la data 28 martie
Xincheng Zhand, LTE-Advanced Air Interface Technology, Editura CRC Press, 2013
Mark Beams, Android Phones: Beginner's Guide 2015, Editura CreateSpace Independent Publishing Platform, 2015
Răzvan Rughiniș, Rețele locale, Editura Computer Science, 2008
http://cellphones.about.com/od/phoneglossary/g/What-Is-An-Andorid-Phone.htm , accesat la data de 7 aprilie
John Eddy, Google on the Go: Using an Android-Powered Mobile Phone, Editura Que Publishing, 2009
Chandra Monhan, Operating Systems , Editura PHi Learning Private Limited, 2013
Sheran A. Gunasekera, Android Apps Security, Editura Apress, 2012
http://ocw.cs.pub.ro/courses/pdsd/labs/00, accesat la data de 10 aprilie
Rohit Tamma, Learning Android Forensics, Editura Packt Publishing, 2015
http://cellphones.about.com/od/phoneglossary/g/What-Is-An-Andorid-Phone.htm , accesat la data de 7 aprilie
http://developer.android.com/sdk/installing/installing-adt.html, accesat la data de 15 aprilie
Ziguard Mednieks, Programming Android Second Edition, Editura O'Reilly Media, 2012
http://www.techopedia.com/definition/4220/android-sdk, accesat la data de 23 aprilie
Belen Cruz Zapata, Android Studio Essentials, Editura Packt Publishing, 2015
http://www.itcsolutions.eu/2011/09/08/android-tutorial-concepte-activitati-si-resurse-ale-unei-aplicatii-android/, accesat la data de 25 aprilie
http://www.slideshare.net/AlexeyUstenko/android-application-structure
http://www.srccodes.com/p/article/23/build-android-application-package-file-apk-using-eclipse-ide-and-android-development-tools-adt-plugin, accesat la date de 01.06.2015
http://developer.android.com/tools/building/index/html , accesat la date de 01.06.2015
http://blog.siliconstraits.vn/reversing-android-apk-file/, accesat la data de 18.05.2015
Axel Kupper, Location-Based Services: Fundamentals and Operation, Editura Wiley, 2005
http://www.cs.dartmouth.edu/~campbell/cs65/lecture17/lecture17.html, accesat la data de 28.05.2015
Jin Soung Yoo, Spatial Query Processing and Data Mining Methods for Location Based Services, Editura ProQuest Infromation and Learning Company, 2007
https://developers.google.com/maps/documentation/javascript/tutorial, accesat la data de 28.05.2015
Phil Ballard, JavaScript in 24 hours, Sams Teach Yourself, Editura Pearson Education, 2015
Godfrey Molan, ANdroid Best Practiices, Editura Apress, 2014
B.M. Harwani, The Android Tablet Developer's CookBook, Editura Pearson Education, 2013
John W. Rittinghouse, Cloud Computing: Implementations, Management and Security, Editura CRC Press, anul 2009
https://developers.google.com/youtube/v3/docs/, accesat la data 24.06.2015
https://developers.google.com/youtube/v3/getting-started, accesat la data 24.06.2015
https://developers.google.com/youtube/v3/docs/commentThreads, accesat la data 24.06.2015
http://www.tutorials4android.com/android-manifest-file/, accesat la data 30.05.2015
http://code.tutsplus.com/tutorials/android-user-interface-design-linear-layouts–mobile-4047, accesat la data 30.05.2015
http://examples.javacodegeeks.com/android/core/app/fragment/android-fragments-example/, accesat la data de 04.06.2015
https://newcircle.com/s/post/1250/android_fragments_tutorial, accesat la data 04.06.2015
http://www.javatpoint.com/java-inner-class, accesat la data 19.06.2015
Lauren Darcey, Android Wireless Application Development: Android essentials, Editura Developer's Library , 2012
Anexa 1
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="proiectlicenta.etti.ro.proiectlicentagmaps" >
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<!–
The ACCESS_COARSE/FINE_LOCATION permissions are not required to use
Google Maps Android API v2, but are recommended.
–>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<permission
android:name="com.sapientnitro.inhouse.drop.activities.permission.MAPS_RECEIVE"
android:protectionLevel="signature" />
<uses-permission
android:name="com.sapientnitro.inhouse.drop.activities.permission.MAPS_RECEIVE"
android:required="false" />
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="@string/google_maps_key" />
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<activity
android:name="proiectlicenta.etti.ro.proiectlicentagmaps.MenuActivity"
android:label="@string/title_activity_menu" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="proiectlicenta.etti.ro.proiectlicentagmaps.MapsActivity"
android:label="@string/title_activity_maps" >
</activity>
<activity
android:name="proiectlicenta.etti.ro.proiectlicentagmaps.MarkerInfoActivity"
android:label="@string/title_activity_markerinfo" >
</activity>
</application>
</manifest>
Anexa 2
MenuActivity.java
package proiectlicenta.etti.ro.proiectlicentagmaps;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Button;
// Referenced classes of package app.proiectlicenta.ro.proiectlicenta:
// MapsActivity
public class MenuActivity extends ActionBarActivity
{
public MenuActivity()
{
}
protected void onCreate(Bundle bundle)
{
super.onCreate(bundle);
setContentView(R.layout.activity_menu);
Button button = (Button)findViewById(R.id.mapsButton);
View.OnClickListener onclicklistener = new View.OnClickListener() {
public void onClick(View view)
{
Intent intent = new Intent(getApplicationContext(), MapsActivity.class);
startActivity(intent);
}
};
button.setOnClickListener(onclicklistener);
Button button1 = (Button)findViewById(R.id.YouTubeButton);
View.OnClickListener onclicklistener1 =
new View.OnClickListener() {
public void onClick(View view)
{
Intent intent = new Intent("android.intent.action.VIEW", Uri.parse("https://www.YouTube.com/watch?v=9KEvVPZgJXs"));
startActivity(intent);
}
};
button1.setOnClickListener(onclicklistener1);
}
}
activity_menu.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_centerInParent="true">
<Button
android:layout_width="200dp"
android:layout_height="wrap_content"
android:text="@string/button_maps"
android:id="@+id/mapsButton"/>
<Button
android:layout_width="200dp"
android:layout_height="wrap_content"
android:text="@string/button_YouTube"
android:id="@+id/YouTubeButton"/>
</LinearLayout>
</RelativeLayout>
Anexa 3
MapsActivity.java
package proiectlicenta.etti.ro.proiectlicentagmaps;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.internal.zzi;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
public class MapsActivity extends FragmentActivity
implements com.google.android.gms.maps.GoogleMap.OnMarkerClickListener
{
public static final String Title_Tag = "TitleTag";
private List<MarkerModel> listOfMarker;
private GoogleMap mMap;
private ProgressDialog progressDialog;
public MapsActivity()
{
}
private void setUpMap()
{
GoogleMap googlemap = mMap;
googlemap.setMyLocationEnabled(true);
MarkerOptions markeroptions = new MarkerOptions();
LatLng latlng1 = new LatLng(44.4278, 26.087378);
Marker marker1 = googlemap.addMarker(
markeroptions.position(latlng1)
.title("Casa Poporului"));
List<String> listOfYoutubeLinks1 = new ArrayList<String>(
Arrays.asList(new String[]{
"https://www.youtube.com/watch?v=geVhRtxPIJI",
"https://www.youtube.com/watch?v=PjBUEwUfcik"}));
MarkerModel markerModel1 = new MarkerModel(
marker1, listOfYoutubeLinks1);
listOfMarker.add(markerModel1);
LatLng latlng2 = new LatLng(44.4371, 26.1022);
Marker marker2 = googlemap.addMarker(
markeroptions.position(latlng2)
.title("Intercontinental"));
List<String> listOfYoutubeLinks2 = new ArrayList<String>(
Arrays.asList(new String[]{
"https://www.youtube.com/watch?v=Hr5ZOnK7c-4",
"https://www.youtube.com/watch?v=iCn9BBbwJ_Y"}));
MarkerModel markerModel2 = new MarkerModel(
marker2, listOfYoutubeLinks2);
listOfMarker.add(markerModel2);
LatLng latlng3 = new LatLng(44.45384, 26.08267);
Marker marker3 = googlemap.addMarker(
markeroptions.position(latlng3)
.title("Muzeul Taranului Roman"));
List<String> listOfYoutubeLinks3 = new ArrayList<String>(
Arrays.asList(new String[]{
"https://www.youtube.com/watch?v=q_2ncobWuwg",
"https://www.youtube.com/watch?v=kurhNG9mXqs"}));
MarkerModel markerModel3 = new MarkerModel(
marker3, listOfYoutubeLinks3);
listOfMarker.add(markerModel3);
LatLng latlng4 = new LatLng(44.4530, 26.0845);
Marker marker4 = googlemap.addMarker(
markeroptions.position(latlng4)
.title("Muzeul Antipa"));
List<String> listOfYoutubeLinks4 = new ArrayList<String>(
Arrays.asList(new String[]{
"https://www.youtube.com/watch?v=XSKTzmMA7bg",
"https://www.youtube.com/watch?v=T5y-FRsNgR4"}));
MarkerModel markerModel4 = new MarkerModel(
marker4, listOfYoutubeLinks4);
listOfMarker.add(markerModel4);
LatLng latlng5 = new LatLng(44.4401, 26.1007);
Marker marker5 = googlemap.addMarker(
markeroptions.position(latlng5)
.title("Ateneul Roman"));
List<String> listOfYoutubeLinks5 = new ArrayList<String>(
Arrays.asList(new String[]{
"https://www.youtube.com/watch?v=CmBhtGwgQtU",
"https://www.youtube.com/watch?v=56P9TAOOJEc", "https://www.youtube.com/watch?v=-y0lEwASjtg"}));
MarkerModel markerModel5 = new MarkerModel(
marker5, listOfYoutubeLinks5);
listOfMarker.add(markerModel5);
LatLng latlng6 = new LatLng(44.4479, 26.0677);
Marker marker6 = googlemap.addMarker(
markeroptions.position(latlng6)
.title("Arcul de triumf"));
List<String> listOfYoutubeLinks6 = new ArrayList<String>(
Arrays.asList(new String[]{
"https://www.youtube.com/watch?v=AEJPLruERD4",
"https://www.youtube.com/watch?v=cB0P8jnWHFA",
"https://www.youtube.com/watch?v=HRHsEp7tVeE",
"https://www.youtube.com/watch?v=KwO7GsScJuE"}));
MarkerModel markerModel6 = new MarkerModel(
marker6, listOfYoutubeLinks6);
listOfMarker.add(markerModel6);
LatLng latlng7 = new LatLng(44.4379, 26.0636);
Marker marker7 = googlemap.addMarker(
markeroptions.position(latlng7)
.title("Gradina Botanica"));
List<String> listOfYoutubeLinks7 = new ArrayList<String>(
Arrays.asList(new String[]{
"https://www.youtube.com/watch?v=VfvXJn3Ptls",
"https://www.youtube.com/watch?v=f_EYGmqbQus"}));
MarkerModel markerModel7 = new MarkerModel(
marker7, listOfYoutubeLinks7);
listOfMarker.add(markerModel7);
LatLng latlng8 = new LatLng(44.4317, 26.0988);
Marker marker8 = googlemap.addMarker(
markeroptions.position(latlng8)
.title("Biserica Stavropoleos"));
List<String> listOfYoutubeLinks8 = new ArrayList<String>(
Arrays.asList(new String[]{
"https://www.youtube.com/watch?v=8JGRLkYbeS0",
"https://www.youtube.com/watch?v=BEnPFLCoM2A",
"https://www.youtube.com/watch?v=GnVZjsqLlpA" }));
MarkerModel markerModel8 = new MarkerModel(
marker8, listOfYoutubeLinks8);
listOfMarker.add(markerModel8);
LatLng latlng9 = new LatLng(44.4385, 26.1302);
Marker marker9 = googlemap.addMarker(
markeroptions.position(latlng9)
.title("Muzeul National de Arta"));
List<String> listOfYoutubeLinks9 = new ArrayList<String>(
Arrays.asList(new String[]{
"https://www.youtube.com/watch?v=K9K2GcsnZLY",
"https://www.youtube.com/watch?v=fjMvCQ0Gvas",
"https://www.youtube.com/watch?v=pc3zKCjascw" }));
MarkerModel markerModel9 = new MarkerModel(
marker9, listOfYoutubeLinks9);
listOfMarker.add(markerModel9);
LatLng latlng10 = new LatLng(45.0292, 25.7933);
Marker marker10 = googlemap.addMarker(
markeroptions.position(latlng10)
.title("Palatul Cantacuzino"));
List<String> listOfYoutubeLinks10 = new ArrayList<String>(
Arrays.asList(new String[]{
"https://www.youtube.com/watch?v=kmPVbNczjBg",
"https://www.youtube.com/watch?v=qyus5ijRaow" }));
MarkerModel markerModel10 = new MarkerModel(
marker10, listOfYoutubeLinks10);
listOfMarker.add(markerModel10);
LatLng latlng11 = new LatLng(44.4347, 26.0917);
Marker marker11 = googlemap.addMarker(
markeroptions.position(latlng11)
.title("Parcul Cismigiu"));
List<String> listOfYoutubeLinks11 = new ArrayList<String>(
Arrays.asList(new String[]{
"https://www.youtube.com/watch?v=wie6bF4vOOk",
"https://www.youtube.com/watch?v=tIc20-lQtIQ" }));
MarkerModel markerModel11 = new MarkerModel(
marker11, listOfYoutubeLinks11);
listOfMarker.add(markerModel11);
LatLng latlng12 = new LatLng(44.4298, 26.1028);
Marker marker12 = googlemap.addMarker(
markeroptions.position(latlng12)
.title("Curtea Veche"));
List<String> listOfYoutubeLinks12 = new ArrayList<String>(
Arrays.asList(new String[]{
"https://www.youtube.com/watch?v=OLaz4bFqlKg"}));
MarkerModel markerModel12 = new MarkerModel(
marker12, listOfYoutubeLinks12);
listOfMarker.add(markerModel12);
GoogleMap googlemap1 = mMap;
LatLng zoomLocation = new LatLng(44.4371, 26.1022);
googlemap1.animateCamera(CameraUpdateFactory
.newLatLngZoom(zoomLocation, 13));
setUpListOfComments();
}
private void setUpListOfComments() {
progressDialog = ProgressDialog.show(this, "Se preiau comentariile!", "Va rog sa asteptati");
Thread thread = new Thread(new Runnable(){
@Override
public void run() {
try {
for (MarkerModel markerModel : listOfMarker){
for (YoutubeModel youtubeModel : markerModel._ListOfYoutubeModels) {
String splitUrl[] = youtubeModel._YoutubeLink.split("=");
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet();
try {
request.setURI(new
URI("https://www.googleapis.com/youtube/v3/commentThreads?part=snippet&videoId=" +
splitUrl[1] +
"&key=AIzaSyBp7i36q75LSFI92ngIsBrAGJku76FvHJQ"));
} catch (URISyntaxException e) {
e.printStackTrace();
}
try {
HttpResponse response = client.execute(request);
String responseStr = new BasicResponseHandler()
.handleResponse(response);
JSONArray items = (JSONArray) mainObject.get("items");
ArrayList <String> listOfComms = new ArrayList<String>();
for(int i = 0 ; i < items.length(); i++) { JSONObject itemJsonObj = items.getJSONObject(i);
JSONObject snippedJsonObj = itemJsonObj
.getJSONObject("snippet");
JSONObject topLevelComment = snippedJsonObj
.getJSONObject("topLevelComment");
JSONObject snippet = topLevelComment
.getJSONObject("snippet");
String textDisplay = snippet.getString("textDisplay");
listOfComms.add(textDisplay);
}
youtubeModel.setListOfComments(listOfComms);
} catch (IOException e) {
e.printStackTrace();
}
}
}
progressDialog.dismiss();
} catch (Exception e) {
e.printStackTrace();
}
}
});
thread.start();
}
private void setUpMapIfNeeded()
{
if (mMap == null)
{
mMap = ((SupportMapFragment)getSupportFragmentManager()
.findFragmentById(R.id.map)).getMap();
if (mMap != null)
{
setUpMap();
mMap.setOnMarkerClickListener(this);
}
}
}
protected void onCreate(Bundle bundle)
{
super.onCreate(bundle);
setContentView(R.layout.activity_maps);
listOfMarker = new ArrayList<MarkerModel>();
setUpMapIfNeeded();
}
public boolean onMarkerClick(Marker marker)
{
for(MarkerModel markerModel : listOfMarker){
if (markerModel._Marker.equals(marker)){
Intent intent = new Intent(MapsActivity.this,
MarkerInfoActivity.class);
intent.putExtra(Title_Tag, marker.getTitle());
MarkerInfoActivity._ListOfYoutubeModels = (ArrayList<YoutubeModel>)
markerModel._ListOfYoutubeModels;
startActivity(intent);
return true;
}
}
return false;
}
protected void onResume()
{
super.onResume();
setUpMapIfNeeded();
}
}
class MarkerModel{
public Marker _Marker;
public List<YoutubeModel> _ListOfYoutubeModels;
public MarkerModel (Marker marker, List<String> listOfYoutubeLinks){
_Marker = marker;
_ListOfYoutubeModels = new ArrayList<YoutubeModel>();
for (String youtubeLink : listOfYoutubeLinks)
_ListOfYoutubeModels.add(new YoutubeModel(youtubeLink));
}
}
class YoutubeModel{
public String _YoutubeLink;
public List<String> _ListOfComments;
public List<String> getListOfComments() {
return _ListOfComments;
}
public void setListOfComments(List<String> listOfComments) {
this._ListOfComments = listOfComments;
}
public YoutubeModel (String youtubeLink){
_YoutubeLink = youtubeLink;
}
}
activity_maps.xml
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/map" tools:context=".MapsActivity"
android:name="com.google.android.gms.maps.SupportMapFragment" />
google_maps_api.xml
<resources>
<!–
TODO: Before you run your application, you need a Google Maps API key.
To get one, follow this link, follow the directions and press "Create" at the end:
https://console.developers.google.com/flows/enableapi?apiid=maps_android_backend&keyType=CLIENT_SIDE_ANDROID&r=53:CC:D5:09:D6:98:32:B4:53:BF:02:BD:8C:06:82:C1:2D:C8:EC:A0%3Bproiectlicenta.etti.ro.proiectlicentagmaps
You can also add your credentials to an existing key, using this line: 53:CC:D5:09:D6:98:32:B4:53:BF:02:BD:8C:06:82:C1:2D:C8:EC:A0;proiectlicenta.etti.ro.proiectlicentagmaps
Once you have your key (it starts with "AIza"), replace the "google_maps_key"
string in this file.
–>
<string name="google_maps_key" translatable="false" templateMergeStrategy="preserve">
AIzaSyA8kFB1cOHdVrsdLEzcqBkbzrWCF6xGDmk
</string>
</resources>
Anexa 4
MarkerInfoActivity.java
package proiectlicenta.etti.ro.proiectlicentagmaps;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class MarkerInfoActivity extends Activity {
Spinner _YoutubeLinksSpinner;
ArrayList<String> _ListOfYoutubeComments;
public static ArrayList<YoutubeModel> _ListOfYoutubeModels;
public MarkerInfoActivity(){
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_markerinfo);
((TextView)findViewById(R.id.titleLabel)).setText(getIntent()
.getStringExtra(MapsActivity.Title_Tag));
List<String> listOfLinks = new ArrayList<String>();
for (YoutubeModel youtubeModel : _ListOfYoutubeModels)
listOfLinks.add(youtubeModel._YoutubeLink);
ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String> (this, android.R.layout.simple_spinner_item, listOfLinks);
spinnerArrayAdapter.setDropDownViewResource(android.R.layout
.simple_spinner_dropdown_item);
Button playYoutubeButton = (Button)
findViewById(R.id.playYoutubeButton);
playYoutubeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent("android.intent.action.VIEW", Uri.parse((String)_YoutubeLinksSpinner.getSelectedItem()));
startActivity(intent);
}
});
_ListOfYoutubeComments = new ArrayList<String>();
if (_ListOfYoutubeModels.size() != 0)
_ListOfYoutubeComments.addAll(_ListOfYoutubeModels.get(0)
.getListOfComments());
//List of comments functionality
ListView commentsListView = (ListView)
findViewById(R.id.commentsListView);
final ArrayAdapter<String> commentsListViewAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, _ListOfYoutubeComments);
commentsListView.setAdapter(commentsListViewAdapter);
// Youtube spinner functionality
_YoutubeLinksSpinner =
(Spinner) findViewById(R.id.youtubeLinksSpinner);
_YoutubeLinksSpinner.setAdapter(spinnerArrayAdapter);
_YoutubeLinksSpinner.setOnItemSelectedListener(
new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
_ListOfYoutubeComments.clear();
_ListOfYoutubeComments.addAll(_ListOfYoutubeModels.get(_YoutubeLinksSpinner.getSelectedItemPosition()).getListOfComments());
commentsListViewAdapter.notifyDataSetChanged();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
//Commnet button functionality
final EditText commentEditText = (EditText)
findViewById(R.id.commentEditText);
Button sendCommButton = (Button)
findViewById(R.id.sendCommentImageButton);
sendCommButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(commentEditText.getText().toString().length() != 0) {
_ListOfYoutubeComments.add(0, commentEditText.getText().toString());
commentsListViewAdapter.notifyDataSetChanged();
}else
Toast.makeText(getApplicationContext(), "Nu se poate adauga un text gol", Toast.LENGTH_LONG).show();
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}
activity_markerinfo.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!–<WebView–>
<!–android:layout_height="0dp"–>
<!–android:layout_width="match_parent"–>
<!–android:layout_weight=".4"–>
<!–android:id="@+id/youtubeWebView"–>
<!–/>–>
<TextView
android:layout_width="match_parent"
android:layout_height="40dp"
android:id="@+id/titleLabel"
android:layout_gravity="center"
android:textColor="@color/black"
android:textSize="20dp"
android:textStyle="bold"
android:gravity="center" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@color/white">
<TextView
android:layout_width="0dp"
android:text="@string/youtube_label"
android:layout_height="match_parent"
android:layout_weight=".2"
android:layout_gravity="center"
android:gravity="center" />
<Spinner
android:id="@+id/youtubeLinksSpinner"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight=".3"
/>
</LinearLayout>
<Button
android:id="@+id/playYoutubeButton"
android:text="@string/youtube_play_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/red"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@color/white">
<EditText
android:id="@+id/commentEditText"
android:imeOptions="actionDone"
android:singleLine="true"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight=".8"
android:hint="@string/enter_comment" />
<Button
android:id="@+id/sendCommentImageButton"
android:layout_width="73dp"
android:layout_height="match_parent"
android:text="@string/send_comment"
android:background="@color/white"/>
</LinearLayout>
<ListView
android:layout_height="0dp"
android:layout_width="match_parent"
android:layout_weight=".8"
android:id="@+id/commentsListView" />
</LinearLayout>
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: Retele Si Servicii de Telefonie Mobila 3g 4g Wireless (ID: 163386)
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.
