Indrum ator stiint i c: [602113]
UNIVERSITATEA DIN CRAIOVA
FACULTATEA DE MATEMATIC A S I S TIINT E ALE
NATURII
SPECIALIZAREA INFORMATIC A
LUCRARE DE LICENT A
^Indrum ator stiint ic:
Lect.univ.dr. Claudiu Ionut Pop ^ rlan
Absolvent: [anonimizat] ^ rbu
Craiova
2014
UNIVERSITATEA DIN CRAIOVA
FACULTATEA DE MATEMATIC A S I S TIINT E ALE
NATURII
SPECIALIZAREA INFORMATIC A
APLICAT IE ANDROID PENTRU
OPTIMIZAREA RUTELOR DE
TRANSPORT ^IN CRAIOVA
^Indrum ator stiint ic:
Lect.univ.dr. Claudiu Ionut Pop ^ rlan
Absolvent: [anonimizat] ^ rbu
Craiova
2014
Cuprins
1 Introducere ^ n Android 5
1.1 Scurt istoric . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.2 Generalit at i . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.3 Android SDK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.4 Componentele unei aplicat ii . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.4.1 Intents si Intent Filters . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.4.2 Activit at i . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.4.3 Servicii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.4.4 Furnizorii de cont inut . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.4.5 Fire de executie si procese . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.4.6 AsyncTask . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.5 Resurse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.5.1 Asigurarea resurselor . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.5.2 Accesarea resurselor . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.5.3 Manipularea schimbarilor din timpul rularii . . . . . . . . . . . . . . . . 20
1.6 Manifest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.6.1 Conventii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.6.2 Caracteristici ale sierului . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.6.3 Biblioteci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2 Google Maps 23
2.1 Prezentare General a Google Maps . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.2 Localizare si h art i . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.2.1 Serviciile de localizare . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.2.2 Google Maps Android API . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.3 Strategii de localizare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.3.1 Erori ^ n determinarea locat iei . . . . . . . . . . . . . . . . . . . . . . . 25
2.3.2 Actualizarea locat iei . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.3.3 Denirea unui model . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.4 Senzori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.4.1 Senzori de mi scare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3
Cristina Elena S ^ rbu CUPRINS
2.4.2 Senzori de pozit ie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.4.3 Senzorii de mediu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.5 Google Maps Android API v2 . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.5.1 Instalarea Android SDK . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.5.2 Instalarea si congurarea Google Play Services SDK . . . . . . . . . . . 34
2.5.3 Obt inerea certicatului Android si API Key . . . . . . . . . . . . . . . . 36
2.5.4 Specicarea permisiunilor . . . . . . . . . . . . . . . . . . . . . . . . . 38
2.5.5 Ad augarea h art ii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3 Prezentarea aplicat iei 40
3.1 Prezentare General a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.2 Prezentarea structural a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.3 Prezentarea funct ional a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4 Concluzii 56
5 Bibliograe 57
4
Capitolul 1
Introducere ^ n Android
5
Cristina Elena S ^ rbu Capitolul 1: Introducere ^ n Android
1.1 Scurt istoric
Android este un sistem de operare bazat pe Linux si este destinat in primul rand pentru
dispozitivele mobile cu ecran tactil, cum ar smartphone-urile sau tabletele.
Android, Inc a fost inintata in Palo Alto, California, in octombrie 2003 de catre Andy
Rubin(co-fondatorul companiei Danger), Bogat Miner(co-fondatorul companiei Wildre Commu-
nications, Inc.), Nick Sears(fost vicepresedinte al T-Mobile) si Chris White(dezvoltator la WebTv).
In 2005, Google a achizitionat compania Android iar in 2007 Android a fost lansat odata cu fon-
darea Open Handset Alliance, un consortiu de hardware, software si companii de telecomunicatii.
Primul smartphone la dispozitia publicului care ruleaza Android a fost lansat in octombrie
2008.
Din luna mai 2012, Android a devenit cel mai popular sistem de operare mobil si este un
lider de piata in majoritatea tarilor, inclusiv Statele Unite. In cele mai multe piete de telefoane,
cele Android sunt cele mai populare cuprinzand mai mult de jumatate din vanzarile globale de
smartphone-uri. Din septembrie 2013, un miliard de dispozitive Android au fost activate.
Android ofera un cadru bogat ce permite construirea de aplicatii inovatoare si jocuri pentru
dispozitive mobile. [2]
1.2 Generalit at i
Aplicatiile Android sunt dezvoltate folosind Java si pot portate relativ usor pe noua plat-
forma. Alte caracteristici ale Android includ un motor grac 3D(bazat pe suport software), suport
pentru bazele de date oferit de SQLite si un browser web integrat.
In timp ce recunoaste si permite dezvoltarea UI, Android sprijina, de asemenea, noul aspect
UI bazat pe XML.
Una dintre cele mai interesante caracteristici ale Android-ului este aceea ca, din cauza arhitec-
turii sale, aplicatiile provenite de la terti devoltatori sunt executate cu acceasi prioritate de sistem
ca si cele ce vin la pachet cu sistemul central. Aceasta caracteristica este o abatere majora de
la cele mai multe sisteme, care dau o prioritate mai mare de executie aplicatiilor venite la pachet
cu sistemul decat aplicatiilor create de terti dezvoltatori. De asemenea, ecare aplicatie este
executata in propriul r de executie folosind o masina virtuala. [8]
In afara de SDK-ul foarte generos si bibliotecile bine formate, caracteristica cea mai interesanta
pentru dezvoltatorii Android este aceea ca se ofera acces la tot ce are acces si sistemul de operare,
Cu alte cuvinte, daca se doreste crearea unei aplicatii ce utilizeaza GPS-ul dispozitivului, se
permite accesul la acesta.
Pe langa toate caracteristicile disponibile din partea Android, Google a introdus unele aplicatii
proprii. Dezvoltatorii de aplicatii Android pot lega de aplicatiile lor anumite aplicatii Google, cum
ar Google Maps sau Google Search.
6
Cristina Elena S ^ rbu Capitolul 1: Introducere ^ n Android
1.3 Android SDK
Kit-ul de dezvoltare software Android (SDK) include un set complet de instrumente de dez-
voltare. Acestea includ un program de depanare, biblioteci, un emulator bazat pe QEMU, doc-
umentatie, monstre de cod si tutoriale. Platformele de dezvoltare sprijinite in prezent includ
calculatoare care ruleaza Linux, Mac OS si Windows. In momentul de fata se poate dezvolta
software Android direct pe sistemul de operare Android folosind AIDE(Android IDE Java, C++).
[2]
Mediul de dezvoltare sprijinit ocial (IDE) este Eclipse folosind plugin-ul Android Development
Tools (ADT), desi IDE InteliJ IDEA sprijina pe deplin dezvoltarea Android si NetBeans IDE
sprijina, de asemenea, dezvoltarea Android prin intermediul unui plugin.
In plus, dezvoltatorii pot folosi orice editor de text pentru a edita siere Java si XML, apoi
folosind instrumente de linie de comanda (Java Development Kit si Apache Ant sunt necesare)
pentru a crea, construi si depana aplicatii Android, precum si de a controla dispozitivele Android
atasate.
Imbunatatirile aduse de Android SDK merg mana in mana cu dezvoltarea de ansamblu a
platformei Android. De asemenea, SDK, sprijina si versiuni mai vechi ale platformei Android.
Instrumentele de dezvoltare sunt componente ce pot descarcate, astfel dupa ce a fost descarcata
cea mai recenta versiune si platforma, platforme mai vechi si instrumente pot descarcate pentru
teste de compatibilitate.
Aplicatiile Android au extensia .apk si sunt salvate in folderul /data/app pe sistemul de operare
Android. Pachetul APK contine siere .dex(exacutabile Dalvik), siere de resurse, etc.
Android Debug Tool (ADB) este un set de instrumente incluse in pachetul Android SDK.
Contine atat programe client-side cat si server-side, care comunica unul cu altul. ADB este
accesat de obicei prin intermediul liniei de comanda desi exista numeroase interfete grace ce
controleaza ADB.
Fastboot este un protocol de diagnostic inclus in pachetul SDK utilizat in principal pentru a
modica sistemul de siere
ash printr-o conexiune USB de la computerul gazda. Este nevoie ca
dispozitivul sa e pornit in modul boot sau in modul Second Program Loader in care se efectueaza
initializarea hardware-ului cel mai de baza. Dupa activarea protocolului pe dispozitiv, va accepta
un set specic de comenzi trimise prin USB, folosind o linie de comanda. [2]
1.4 Componentele unei aplicat ii
Framework-ul Android permite crearea unor aplicatii bogate si inovative utilizand un set de
componente reutilizabile.
7
Cristina Elena S ^ rbu Capitolul 1: Introducere ^ n Android
1.4.1 Intents si Intent Filters
Un Intent este un obiect de mesagerie ce poate utilizat pentru a solicita o actiune de la o
alta componenta a aplicatiei. Desi intent-urile faciliteaza comunicarea dintre componente in mai
multe feluri, exista trei cazuri de utilizare fundamentale:
Pentru a incepe o activitate: o activitate reprezinta o singura asare intr-o aplicatie; se
poate crea o noua instanta unei Activity prin trecerea unui Intent la startActivity(). Intent-
ul descrie activitatea si pastreaza toate datele necesare. Pentru a primii un rezultat cand
activitatea se termina se apeleaza startActivityForResult(); activitatea primeste rezultatul
ca un obiect de tip Intent separat.
Pentru a incepe un serviciu: un Service este o componenta ce efectueaza operatiuni
in fundal, fara o interfata de utilizator. Se poate incepe un serviciu pentru a efectua o
operatie o singura data(cum ar descarcarea unui sier) prin transmiterea unui intent
metodei startService(); Intent-ul descrie serviciul ce trebuie sa inceapa si pastreaze toate
datele necesare. Daca serviciul este proiectat cu o interfata client-server, se poate lega cu
serviciul unei alte componente prin transmiterea unui intent metodei bindService().
Pentru a oferii o transmisiune: o transmisie este un mesaj ce poate primit de orice
aplicatie. Sistemul trimite diferite emisii pentru evenimentele de sistem, cum ar atunci
cand sistemul porneste sau se incarca. Se poate trimite o emisie altor aplicatii prin tran-
simterea unui intent metodelor sendBroadcast(), sendOrderedBroadcast() sau sendSticky-
Broadcast().
Tipuri de intent
Intent-uri explicite: specica componenta de start prin nume(numele clasei complet).
De obicei se foloseste un intent explicit pentru a incepe o componenta. Cand se creeaza
un intent explicit care sa pornesca o activitate sau un serviciu, sistemul porneste imediat
componenta aplicatiei specicata in obiectul Intent.
Intent-uri implicite: nu specica o componenta dar, in schimb, declara o actiune generala
care sa o efectueze. Cand se creeaza un intent implicit, sistemul gaseste componenta
potrivita sa inceapa activitatea prin compararea continutului intent-ului cu ltrele de intent
declarate n sierul manifest ale altor aplicatii de pe dispozitiv. Daca intent-ul se potriveste
cu un intent lter, sistemul porneste componenta si trimite obiectul Intent, insa daca mai
multe se potrivesc, sistemul aseaza un dialog ce permite utilizatorului sa aleaga ce aplicatie
sa foloseasca.
Crearea unui intent
Un intent poarta informatii pe care sistemul le foloseste pentru a determina ce componenta
sa porneasca(cum ar numele exact al componentei sau ce categorie de componente ar trebui
8
Cristina Elena S ^ rbu Capitolul 1: Introducere ^ n Android
sa primeasca intent-ul), plus informatiile pe care componenta destinatar le foloseste pentru a
indeplini in mod corespunzator actiunea.
Informatiile din cadrul unui intent sunt urmatoarele:
Numele componentei: este un pas optional insa este informatia care face un intent ex-
plicit, fara numele componentei intentul este unul implicit si sistemul decide ce componenta
ar trebui sa primeasca intent-ul bazat pe informatiile unui alt intent; astfel, daca se doreste
apelarea unei anumite componente trebuie specicat numele acesteia. Cand se apeleaza un
serviciu trebuie declarat in mod obligatoriu numele componentei. Numele unei componente
se poate seta cu urmatoarele metode: setComponent(), setClass(), setClassName() .
Actiunea: un string ce specica ce actiune se va indeplini; exemplu de actiuni ce apeleaza
o activitate: ACTION VIEW : actiune folosita intr-un intent prin metoda startActivity()
cand exista informatii ce pot asate de o activitate; ACTION SEND : actiune folosita
cand exista informatii ce pot asate prin intermediul altei aplicatii.
Datele: URI-ul(un obiect Uri) care referentiaza datele ce trebuie accesate si/sau tipul
MIME de date; pentru a seta doar datele de tip URI se apeleaza metoda setData(), pentru
a seta datele de tip MIME se apeleaza metoda setType(), iar pentru amandoua se apeleaza
setDataAndType().
Categoria: un string continand informatii aditionale despre tipul de componenta pe care un
intent ar trebui sa il suporte; pot exista o innitate de categorii insa majoritatea intent-urilor
nu necesita una.
Extra: se pot adauga date suplimentare prin metoda putExtra().
Flag-uri: pot arata sistemului cum sa pornesca o activitate.
1.4.2 Activit at i
O activitate este o componenta a aplicatiei ce ofera o asare cu care utilizatorii pot interac-
tiona pentru a executa anumite actiuni, cum ar sa apeleze un contact, sa faca o fotograe, sa
trimita un email sau sa vizualizeze o harta. Fiecarei activitati ii este data o fereastra in care sa
aseze interfata. O aplicatie este de obicei compusa din mai multe activitati ce sunt legate una
de cealalta. De obicei, una dintre activitati este cea principala, ind asata la lansarea aplicatiei.
Fiecare activitate poate apela o alta activitate pentru a realiza anumite actiuni; de ecare data
cand o noua activitate este pornita, precedenta este oprita dar sistemul o pastreaza intr-o stiva.
Crearea unei activitati
Pentru a crea o activitate trebuie creata o subclasa ce mosteneste clasa Activity; in subclasa
vor trebui implementate metode de reapelare pe care sistemul le apeleaza cand activitatea trece
prin diferite stari, cum ar cand activitatea este creata, oprita, reluata sau distrusa.
Cele mai importante metode sunt:
9
Cristina Elena S ^ rbu Capitolul 1: Introducere ^ n Android
onCreate() este metoda care trebuie implementata obligatoriu, sistemul o apeleaza cand
se creeaza activitatea, aici se initializeaza componentele esentiale ale activitatii si cel mai
important, trebuie apelata metoda setContentView() pentru a deni ce va asa activitatea.
onPause() sistemul apeleaza aceasta metoda cand utilizatorul paraseste activitatea(desi
asta nu semnica ca activitatea este distrusa).
Declararea unei activitati in Manifest
Pentru ca o activitate sa e accesibila in cadrul sistemului, ea trebuie declarata in sierul
Manifest. Declararea se realizeaza cu ajutorul elementului <activity >in cadrul elementului
<application >. Exemplu:
1 <manifest … >
2 <application … >
3 <activity android:name=".ExempluActivity">
4 …
5 </application … >
6 </manifest>
Exista mai multe atribute care pot incluse in elementul activity insa atributul android:name
este singurul care nu trebuie sa lipseasca, acesta specica numele clasei activitatii.
Utilizarea ltrelor pentru intent-uri
Un element <activity >poate specica ltre pentru intent-uri utilizand elementul <intent-
lter>pentru a declara cum alte componente ale aplicatiei o pot activa. Cand se creeaza o noua
aplicatie, activitatea care este creata automat include un ltru ce declara activitatea ca principal
si este adaugata in categoria "launcher". Exemplu:
1<activity
2 android:name="ExempluActivity"
3 android:icon="@drawable/app_icon">
4 <intent-filter>
5 <action android:name="android.intent.action.MAIN"/>
6 <category android:name="android.intent.category.LAUNCHER"/>
7 </intent-filter>
8</activity>
Elementul <action>specica faptul ca este punctul principal al aplicatiei iar elementul
<category >specica faptul ca activitatea respectiva va asata la lansarea aplicatiei. Pentru
ecare tip de intent trebuie inclus un element <intent-lter >ce contine elementul <action>
si optional elementul <data>si/sau elementul <category >.
Declansarea unei activitati
Declansarea unei activitati se poate realiza prin transmiterea unui intent ce descrie activitatea
metodei startActivity(). Intent-ul specica e activitatea ce se doreste pornita ori descrie tipul
de actiune ce se va efectua.
10
Cristina Elena S ^ rbu Capitolul 1: Introducere ^ n Android
Cel mai adesea se doreste lansarea unei activitati cunoscute, acest lucru se poate realiza prin
crearea unui intent care deneste explicit activitatea folosind numele clasei. Exemplu:
1 Intent intent = new Intent(this, SignInActivity.class);
2 startActivity(intent);
Daca se doreste obtinerea unui rezultat din partea activitatii, declansarea se va realiza prin
apelarea metodei startActivityForResult(). Apoi, pentru a primi rezultatul din activitatea ulte-
rioara se va implementa metoda onActivityResult().
Inchiderea unei activitati se poate realiza prin apelarea metodei nish(), sau se poate opri o
activitate pornita anterior prin apelarea metodei nishActivity(). Insa, in cele mai multe cazuri, nu
este recomandata inchiderea activitatii folosind metodele descrise mai sus. Sistemul administreaza
ciclul de viata al unei activitati, astfel, apelarea acelor metode nu este necesara.
Gestionarea ciclului de viata al unei activitati
Gestionarea ciclului de viata prin implementarea metodelor este necesara pentru a dezvolta o
aplicatie puternica si
exibila. O activitate poate sa existe in trei stari:
Resumed | activitatea este in prim-plan;
Paused | o alta activitate este in prim-plan, dar aceasta este inca vizibila;
Stopped | activitatea este minimizata, inca activa.
Implementarea ciclului de viata [1] (gura 1.1)
1public class ExempluActivity extends Activity {
2@Override
3 public void onCreate(Bundle savedInstanceState) {
4 super.onCreate(savedInstanceState);
5 // Activitatea este creata
6 }
7 @Override
8 protected void onStart() {
9 super.onStart();
10 // Activitatea este pe punctul de a deveni vizibila
11 }
12 @Override
13 protected void onResume() {
14 super.onResume();
15 // Activitatea a devenit vizbila
16 }
17 @Override
18 protected void onPause() {
19 super.onPause();
20 // O alta activitate este in prim-plan
11
Cristina Elena S ^ rbu Capitolul 1: Introducere ^ n Android
21}
22 @Override
23 protected void onStop() {
24 super.onStop();
25 // Activitatea nu mai este vizibila
26 }
27 @Override
28 protected void onDestroy() {
29 super.onDestroy();
30 // Activitatea este pe punctul de a fi distrusa
31 }
32}
Figure 1.1: Ciclul de viata al unei activitati [1]
12
Cristina Elena S ^ rbu Capitolul 1: Introducere ^ n Android
1.4.3 Servicii
Un serviciu este o componenta a aplicatiei care poate sa efectueze operatii de lunga durata
in fundal si nu ofera o interfata. O alta componenta poate declansa un serviciu si acesta va
continua sa ruleze in fundal chiar daca utilizatorul foloseste o alta aplicatie. Un serviciu poate
avea doua forme:
Started | un serviciu este pornit cand o componenta(spre exemplu, o activitate) il apeleaza
prin metoda startService(). Un serviciu poate rula o perioada nedeterminata, chiar daca
componenta ce l-a declansat a fost distrusa. De obicei, un serviciu realizeaza o singura
operatie si nu returneaza niciun rezultat.
Bound | un serviciu este legat cand o componenta i se ataseaza prin apelarea metodei
bindService(). Un astfel de serviciu ofera o interfata de tip client-server ce permite compo-
nentelor sa interactioneze cu serviciul, sa trimita cereri, sa obtina rezultate. Acest serviciu
ruleaza atata timp cat o alta componenta este legata de el. Multiple componente se pot
lega in acelasi timp de un serviciu, insa in momentul ce acestea nu mai sunt legate serviciul
este distrus.
Pentru crearea unui serviciu, trebuie creata o subclasa Service si in implementare trebuie
apelate urmatoarele metode:
onStartCommand() | sistemul apeleaza aceasta metoda cand o componenta cere ca ser-
viciul sa e pornit prin apelarea metodei startService(). Dupa ce aceasta metoda este
executata, serviciul este pornit si va rula in fundal. Insa dupa ce iti executa sarcina, servi-
ciul trebuie oprit iar acest lucru se realizeaza prin metodele stopSelf() sau stopService();
onBind() | sistemul apeleaza aceasta metoda cand o componenta doreste sa se ataseze
la un serviciu, se foloseste metoda bindService();
onCreate() | sistemul apeleaza metoda cand este creat pentru a efectua procedurile de
congurare;
onDestroy() | sistemul apeleaza aceasta metoda cand serviciul nu mai este folosit.
Daca o componenta apeleaza startService() pentru a declansa un serviciu, atunci acesta va
rula pana ce va oprit folosind una din metodele predenite.
Daca o componenta apeleaza bindService() pentru a crea un serviciu, atunci acesta va rula
atata timp cat component ramane atasata de el.
Declararea serviciului in Manifest
Pentru declararea unui serviciu se va adauga in interiorul elementului <application >elementul
<service >.
13
Cristina Elena S ^ rbu Capitolul 1: Introducere ^ n Android
1 <manifest…>
2 <application…>
3 <service android:name=".ExempluService" />
4 </application>
5 </manifest>
Declansarea unui serviciu
Declansarea unui serviciu se poate realiza e dintr-o activitate e dintr-o componenta prin
transmiterea unui Intent metodei startService().
1 Intent intent = new Intent(this, HelloService.class);
2 startService(intent);
Intreruperea unui servciu
Un serviciu trebuie sa-si gestioneze ciclul de viata (gura 1.2), iar acest lucru este necesar
deoarece sistemul nu opreste sau nu distruge serviciul decat daca trebuie sa recupereze memo-
rie insa serviciul va continua sa ruleze dupa aceea. Astfel, servicul va trebui sa se intrerupa prin
apelarea metodei stopSelf() sau o alta componenta poate sa-l opreasca prin metoda stopService().
Figure 1.2: Ciclul de viata al unui serviciu[1]
14
Cristina Elena S ^ rbu Capitolul 1: Introducere ^ n Android
1.4.4 Furnizorii de cont inut
Furnizorii de continut gestioneaza accesul la un set structurat de date. Incapsuleaza datele si
ofera mecanisme pentru denirea securitatii datelor. Furnizorii de continut sunt interfata standard
ce conecteaza datele dintr-un proces ce ruleaza cu un altul.
Un furnizor este o parte a unei aplicatii Android ce ofera propria interfata pentru lucrul
cu datele. Cu toate acestea, furnizorii de continut sunt folositi de alte aplicatii ce acceseaza
furnizorul.
Accesarea unui furnizor
O aplicatie acceseaza datele de la un furnizor de continut folosind un obiect de tip Con-
tentResolver. Obiectul de tip ContentResolver din procesul aplicatiei clientului si obiectul Con-
tentProvider din aplicatia ce detine furnizorul, manevreaza automat procesul de comunicatie. De
asemenea, ContentProvider, actioneaza ca un strat de abstractizare intre depozitul de date si
asarea externa a datelor sub forma unui tabel. Pentru accesarea unui furnizor trebuie ceruta o
permisiune in sierul Manifest.
URI-uri de continut
Un URI de continut este un URI ce identica datele unui furnizor. URI-urile de continut includ
numele simbolic al intregului furnizor(autoritatea) si numele care indica catre un tabel(o cale).
Obiectul de tip ContentResolver elimina autoritatea URI-ului si o foloseste pentru a o com-
para cu un tabel de furnizori cunoscuti. ContentResolver-ul poate trimite argumentele dintr-o
interogare furnizorului corespunzator.
Preluarea datelor de la furnizor
Pentru preluarea datelor de la un furnizor trebuie parcursi urmatorii pasi:
1. Solicitarea permisiunii de acces de citire pentru furnizor: pentru preluarea datelor de la un
furnizor, aplicatiei trebuie sa ii se ofere permisiunea de a citii datele. Acesta permisiune
nu se poate cere in momentul rularii, ci trebuie specicata in sierul Manifest, folosind
<uses-permission >si numele exact al permisiunii denita de furnizor.
2. Denirea codului ce trimite o interogare catre furnizor.
Crearea unui furnizor de continut
Un furnizor de continut administreaza accesul la un depozit central de date. Desi furnizorii
de continut sunt folositi pentru a face datele disponibile altor aplicatii, se pot avea activitati in
aplicatie ce permit utilizatorului sa interogheze si sa modice datele administrate de furnizor.
Se implementeaza un furnizor de continut atunci cand se doreste:
Transmiterea unor date complexe sau siere altor aplicatii;
Permiterea utilizatorilor copierea datelor dintr-o aplicatie in alte aplicatii;
Asigurarea sugestilor de cautare personalizate utilizand cadrul de cautare.
15
Cristina Elena S ^ rbu Capitolul 1: Introducere ^ n Android
Nu este necesara implementarea unui furnizor pentru a utiliza o baza de date SQLite daca
utilizarea acesteia este in intregime in propria aplicatie.
Pasii necesari construirii unui furnizor:
1. Proiectarea stocarii datelor. Un furnizor de continut ofera date in doua moduri:
Date sier: date care merg, in mod normal, in siere, cum ar fotograile, audio sau
video.
Date structurate: date ce in mod normal intra intr-o baza de date, vector sau o
structura similara. Se stocheaza datele intr-un model ce este compatibil cu tabele
formate din linii si coloane. O linie reprezinta o entitate, cum ar o persoana sau
un articol dintr-un inventar. O coloana reprezinta anumite date pentru entitate, cum
ar numele persoanei sau pretul articolului respectiv. Acest tip de date se stocheaza
folosind o baza de date SQLite, insa se poate folosi orice tip de stocare persistent.
2. Denirea unei implementari concrete a clasei ContentProvider si a metodelor cerute. Aceasta
clasa este interfata dintre date si restul sistemului Android.
3. Denirea autoritatii furnizorului, URI-urile sale de continut, numele coloanelor, permisiunile
ce vor necesare aplicatiilor ce vor accesa datele.
4. Adaugarea altor piese optionale, cum ar exemple de date sau o implementare a Abstract-
ThreadSyncAdapter ce poate sincroniza datele dintre furnizor si datele de pe cloud.
1.4.5 Fire de executie si procese
Cand o componenta a unei aplicatii porneste si aplicatia nu are alte componente ce ruleaza,
sistemul porneste un nou proces Linux pentru aplicatie cu un sigur r de executie. Implicit toate
componentele ale aceleasi aplicatii ruleaza acelasi proces si r de executie. Daca o componenta
se declanseaza si mai exista un alt proces pentru acea aplicatie atunci componenta va pornita
in acel proces ce foloseste acelasi r de executie.
Procesele
Implicit, toate componentele ale aceleasi aplicatii ruleaza in acelasi proces si acest lucru nu ar
trebui schimbat, insa daca se doreste controlul asupra carui proces apartine o anumita componenta
se poate realiza in manifestul aplicatiei.
Fiecare element din Manifest – <activity >,<services >,<receiver >,<provider >- pot contine
atributul android:process ce specica procesul in care o componenta ar trebui sa ruleze. Se poate
folosi atributul pentru a specica anumite componente ce utilizeaza acelasi proces.
Elementul <activity >poate contine atributul pentru a seta o valoare implicita ce se aplica
tuturor componentelor.
16
Cristina Elena S ^ rbu Capitolul 1: Introducere ^ n Android
Sistemul poate decide oprirea anumitor procese atunci cand memoria este redusa si solicitata
de alte procese mai importante in acel moment. Atunci cand decide ce procese sa opreasca,
sistemul alege acele procese ale activitatilor ce nu mai sunt folosite de utilizator.
Ciclul de viata al unui proces
Desi, sistemul, incearca sa mentina un proces cat mai mult posibil, la un moment dat va
trebui sa faca loc pentru noi procese sau pentru cele mai importante. Pentru a determina ce
procese sa pastreze si pe care sa le distruga, sistemul, plaseaza ecare proces intr-o ierarhie a
importantei bazata pe componentele ce ruleaza in proces si starea acelor componente. In acea
ierarhie a importantei proceselor exista cinci nivele:
1. Foreground process: proces ce este solicitat pentru ceea ce face utilizatorul in momentul
de fata, un proces poate considerat asa daca indeplineste urmatoarele conditii:
Gazduieste o activitate cu care interactioneaza utilizatorul;
Gazduieste un serviciu ce este legat de activitatea cu care interactioneaza utilizatorul;
Gazduieste un serviciu ce ruleaza in prim plan;
Gazduieste un serviciu ce executa una din metodele sale;
Gazduieste un BroadcastReceiver ce iti executa metoda onReceive().
2. Visible process: proces ce nu are nicio componenta in prim plan, dar poate afecta ceea
ce utilizatorul vizualizeaza pe ecran, un proces poate considerat vizibil daca una din
urmatoarele conditii este adevarata:
Gazduieste o activitate ce nu este in prim plan, dar este vizibils utilizatorului
Gazduieste un serviciu ce este legat de o activitate vizibila sau in prim plan.
3. Service process: un proces ce ruleaza un serviciu ce a fost pornit folosind metoda startSer-
vice() si nu intra intr-una din categoriile de mai sus.
4. Background process: un proces ce mentine o activitate ce nu este vizibila utilizatorului.
5. Empty process: un proces ce nu are nicio componenta activa.
Firele de executie
Atunci cand o aplicatie este lansata in executie sistemul creeaza un thread pentru aplicatie
numit "main". Acesta este foarte important deoarce este responsabil cu trimiterea evenimentelor
catre widget-uri, incluzand evenimentele de desenare.
Sistemul nu creeaza un thread separat pentru ecare instanta a unei componente, toate aces-
tea ce ruleaza in acelasi proces sunt instantiate in thread, iar apelurile pentru ecare componenta
sunt trimise de la acel thread.
Cand aplicatia efectueaza o munca anevoiasa ca raspuns la interactiunea cu utilizatorul, acest
thread poate avea o performanta slaba. Spre exemplu, daca totul se intampla in UI thread,
17
Cristina Elena S ^ rbu Capitolul 1: Introducere ^ n Android
efectuarea unor operatii lungi cum ar accesul la internet sau interogari asupra unei baze de date
va bloca intreaga interfata. Cand un thread este blocat niciun eveniment nu poate trimis iar din
perspectiva utilizatorului aplicatia pare sa stea sau ii poate aparea "Application not responding".
1.4.6 AsyncTask
Aceasta clasa permite realizarea unor operatiuni de fundal si publicarea rezultatelor in interfata
fara a nevoita sa utilizeze re de executie si/sau handler-e. A fost dezvolata pentru a o clasa
ajutatoare pentru Thread si Handler. In mod ideal este utilizata pentru a realiza operatiuni
de scurta durata(cel mult cateva secunde). O sarcina de acest tip este denita de 3 tipuri
generice, si anume: Params, Progress si Result si are patru pasi: onPreExecute, doInBackground,
onProgressUpdate si onPostExecute.
Tipurile AsynkTask[1]:
1. Params | tipul de parametri trimisi catre sarcina la executie;
2. Progress | tipul de unitati de progres publicat in timpul realizarii operatiunilor din fundal;
3. Result | tipul de rezultat oferit de operatiunile din fundal. Nu toate tipurile sunt folosite
de o sarcina asincrona iar pentru a arata acest lucru se va nota unul dintre tipuri ca Void.
Cei patru pasi[1]:
1. onPreExecute() | apelata de interfata inaintea executarii sarcinii;
2. doInBackground(Params…) | apelata imeditat dupa onPreExecute(), si este folosita pen-
tru a realiza sarcini de o durata mai lunga;
3. onProgressUpdate(Progress…) | folosita pentru a asa orice fel de progres in interfata al
executiei sarcinii din fundal;
4. onPostExecute(Result) | apelata dupa operatiunea din fundal se incheie.
Anularea executarii unei sarcini se poate realiza in orice moment prin apelarea metodei can-
cel(boolean).
1.5 Resurse
Resursele, cum ar imaginile si sirurile de caractere din codul aplicatie, ar trebui external-
izate pentru a putea intretinute independent. Externalizarea permite, de asemenea, si oferirea
unor resurse alternative ce suporta diferitele conguratii ale dispozitivelor, cum ar dimensiunea
ecranelor. Pentru a oferii aceasta compatibilitate a aplicatiei cu diferite conguratii, resursele
trebuie organizate in directorul res/ din proiectul aplicatiei folosind diferite sub-directoare ce
grupeaza resursele dupa tip si conguratie. Pentru orice tip de resursa se pot specica resurse
implicite sau alternative:
18
Cristina Elena S ^ rbu Capitolul 1: Introducere ^ n Android
Resursele implicite: sunt acelea ce ar trebui folosite indiferent de conguratia dispozitivului
sau atunci cand nu exista o resursa alternativa ce se potriveste conguratiei;
Resurse alternative: sunt acelea proiectate de catre dezvoltator pentru conguratii speci-
ce, se recomanda denumirea directorului cu un nume adecvat pentru a face mai usoara
identicarea unui grup de resurse valabile pentru o anumita conguratie.
1.5.1 Asigurarea resurselor
Directorul res/ contine toare resursele(in subdirectoare), numele directoarelor sunt foarte
importante:
animator/ | siere XML ce denesc property animations;
anim/ | siere XML ce denesc tween animations;
color/ | siere XML ce denesc o lista de culori;
drawable/ | siere Bitmap(.png, .jpg, .gif) sau siere XML ce se gasesc in urmatoarele
subtipuri de resurse drawable: siere Bitmap, State lists, Shapes, Animation drawables, sau alte
drawables;
layout/ | siere XML ce denesc interfata;
menu/ | siere XML ce denesc meniurile aplicatiei;
raw/ | siere arbitrare pentru a salvate in forma bruta;
values/ | siere XML ce contin valori simple, cum ar siruri de caractere, numere intregi si
culori.(arrays.xml, colors.xml, dimens.xml, strings.xml, styles.xml).
Furnizarea de resurse alternative
Este importanta furnizarea resurselor alternative pentru conguratii diferite, spre exemplu intr-
o aplicatie este incurajata existenata unor resurse alternative pentru diferite densitati ale ecranelor.
In momentul rularii, sistemul, va detecta conguratia dispozitivului si va incarca resursa potrivita
conguratiei.
1.5.2 Accesarea resurselor
O resursa dintr-o aplicatie se poate folosi prin referirea la ID-ul sau. Toate ID-urile resurselor
sunt denite in clasa R din proiect, aceasta ind generata automat de unealta aapt. Cand aplicatia
este compilata aapt genereaza clasa R ce contine ID-urile resurselor din directorul res/. Pentru
ecare tip de resursa exista o subclasa R (R.drawable pentru resurse drawable) si pentru ecare
resursa de acel tip exista un numar intreg static (R.drawable.icon); acest numar intreg este ID-ul
resursei ce poate folosit pentru preluarea resursei. Desi in clasa R sunt ID-urile specicate, nu
ar trebui cautat acolo un ID, un astfel de ID este compus din:
Tipul resursei (string, drawable, layout);
Numele resursei (numele sierului sau valoare din android:name).
19
Cristina Elena S ^ rbu Capitolul 1: Introducere ^ n Android
Accesarea resurselor se poate realiza in doua feluri:
In cod: folosind un numar intreg static dintr-o subclasa a clasei R, cum ar R.string.hello
(string este tipul resursei iar hello este numele acesteia);
1 ImageView imageView = (ImageView) findViewById(R.id.myimageview);
2 imageView.setImageResource(R.drawable.myimage);
In XML: folosind o sintaxa speciala XML, cum ar @string/hello (string este tipul resursei
iar hello este numele acesteia).
1 <Button
2 android:layout_width="fill_parent"
3 android:layout_height="wrap_content"
4 android:text="@string/submit" />
1.5.3 Manipularea schimbarilor din timpul rularii
Anumite conguratii ale dispozitivului se pot schimba in momentul rularii (cum ar orientarea,
limba, disponibilitatea tastaturii). Cand acest lucru se intampla, sistemul reporneste activitatea
(onDestroy() este apelat ind urmat de onCreate()). Acest comportament ajuta aplicatia sa se
adapteze noii conguratii prin reincarcarea automata cu resurse alternative ce se potrivesc cu
noua conguratie. Pentru a manipula o astfel de situatie in mod corespunzator este important
ca activitatea sa-si restaureze starea anterioara prin intermediul ciclului de viata in care sistemul
va apela onStateInstanceState() inainte sa distruga activitatea, astfel incat datele despre starea
aplicatiei sa poata salvate. Sunt situatii in care repornirea aplicatiei ii restaurarea unor cantitati
semnicative de date poate costisitoare si poate crea o experienta de utilizare slaba.
Intr-o astfel de situatie exista doua optiuni:
1. Retinerea unui obiect in timpul schimbarii de conguratie: permite aplicatiei sa reporneasca
cand conguratiile se schimba dar transporta un obiect la noua instanta a activitatii;
2. Manevrarea schimbarii de conguratie de catre dezvoltator: previne repornirea aplicatiei de
catre sistem insa primeste un callback cand conguratiile de schimba pentru ca dezvoltatorul
sa actualizeze activitatea.
1.6 Manifest
Manifest-ul resprezinta una din partile cele mai importante ale unei aplicatii. Fiecare aplicatie
trebuie sa aiba un sier AndroidManifest.xml in folderul principal. Acest sier pastreaza informatii
esentiale despre aplicatie necesare sistemului Android, informatii pe care sistemul trebuie sa le
aiba inaintea rularii. Printre altele, sierul AndroidManifest.xml face urmatoarele lucruri:
20
Cristina Elena S ^ rbu Capitolul 1: Introducere ^ n Android
Denumeste pachetul Java pentru aplicatie, numele pachetului serveste ca un identicator
unic pentru aplicatie;
Descrie componentele aplicatiei activitatile, serviciile, furnizorii de continut si broadcast
receivers. Denumeste clasele ce implementeaza ecare componenta;
Determina ce procese vor administra componentele aplicatiei;
Declara permisiunile necesare interactiunii cu anumite componente;
Declara nivelul minim al API-ului;
Listeaza bibliotecile de care aplicatia trebuie sa e legata;
1.6.1 Conventii
In general, anumite conventii si reguli se aplica tuturor elementelor si atributelor din manifest:
Elementele: doar elementele <manifest >si<application >sunt necesare, ambele trebuie
sa e prezente si pot avea loc o singura data. Majoritatea celorlalte elemente pot avea loc
de mai multe ori sau deloc, insa unele dintre ele trebuie sa e prezente pentru ca manifestul
sa poata realiza ceva;
Atributele: in principiu, toate atributele sunt optionale, insa unele trebuie precizate pentru
ca un element sa-si realizeze scopul;
Declararea numelor claselor: se realizeaza printr-un atribut de tip android:name, numele
poate sa includa intreaga destinatie a pachetului sau daca primul caracater este un punct,
ceea ce urmeaza dupa acesta va atasat numelui pachetului:
1 <service android:name="com.example.project.SecretService">
sau
1 <service android:name=".SecretService">;
Valori multiple: daca se vor specica mai multe valori, elementul va repetat;
Valorile resurselor: unele atribute au valori ce pot asate utilizatorilor, spre exemplu un
icon sau un o eticheta a unei activitati, valorile atributelor ar trebui localizate si setate de
la o resursa sau tema.
1.6.2 Caracteristici ale sierului
Intent Filters
Componentele principale ale unei aplicatii sunt activate de intent-uri. Sistemul localizeaza o
componenta potrivita pentru a raspunde unui intent, lanseaza o noua instanta a componentei
21
Cristina Elena S ^ rbu Capitolul 1: Introducere ^ n Android
daca este nevoie si o transfera intent-ului. Din moment ce sistemul trebuie sa stie inaintea lansarii
unei componente ce intent-uri poate aceasta manipula, intent lters sunt specicati in manifest
ca elemente de tip <intent-lter >. O componenta poate avea mai multe ltere, ecare descriind
o capacitate diferita.
Imagini si etichete
Unele elemente au atributele android:icon si android:label pentru imagini de mici dimensiuni si
etichete ce pot asate utilizatorilor. Unele au si atributul android:description pentru o explicatie
mai pe larg ce poate si aceasta asata. Imaginea si eticheta setata in elementul <application >
sunt cele implicite pentru ecare componenta a aplicatiei.
Permisiuni
O permisiune este o restrictie ce limiteaza accesul la o parte din cod sau la datele de pe
dispozitiv. Limitarea este impusa pentru protejarea datelor si a codului ce poate utilizat intr-un
mod necorespunzator, lucru ce poate afecta experienta de utilizare.
Fiecare permisiune este identicata de o eticheta unica. Deseori eticheta indica actiunea ce
este restrictionata. Exemplu[1]:
1 android. permission .READ OWNER DATA
2 android. permission .SET WALLPAPER
3 android. permission .DEVICE POWER
4 android. permission .CALL EMERGENCY NUMBERS
1.6.3 Biblioteci
Fiecare aplicatie este legata de biblioteca implicita Android, aceasta include pachetele de
baza pentru crearea de aplicatii (clase precum Activity, Service, Intent, Button, Application,
ContentProvider si altele). Daca aplicatia utilizeaza cod din alte biblioteci trebuie specicat in
manifest. Manifest-ul trebuie sa contina un element <uses-library >pentru ecare biblioteca.
22
Capitolul 2
Google Maps
23
Cristina Elena S ^ rbu Capitolul 2: Google Maps
2.1 Prezentare General a Google Maps
Google Maps este o aplicatie web de cartograere pentru desktop si dispozitive mobile.
Aceasta ofera imagini din satelit, harti stradale si posibilitatea de-a explora strazile de la nivelul
solului.
Aplicatia Google Maps pentru dispozitivele mobile a fost lansata de Google pentru Android
pe 23 septembrie 2008.
Google Maps pentru dispozitive mobile este cea mai populara aplicatie pentru smartphone-uri,
cu peste 54% din utilizatorii de smartphone-uri la nivel mondial folosind-o cel putin o data pe
luna. [4]
Se poate crea o harta bazata pe activitati folosind Google Maps ca un element pentru in-
terfata cu utilizatorul. Se ofera acces deplin asupra hartii, permintand controlul setarilor de
asare, modicarea nivelului de zoom si mutarea locatiei. Utilizand suprapunerile, se pot adnota
harti si manipula datele introduse de utilizator pentru a oferi o harta ce contine informatii si
functionalitate.
Hartile si servicile bazate pe localizare folosesc latitudinea si longitudinea pentru a indica
locatii geograce, dar utilizatorii prefera asarea unei adrese concrete. Pentru asta, Android,
furnizeaza un Geocoder ce permite convertirea de la valori latitudinale sau longitudinale la adrese
concrete.
Cartograerea, geocodicarea si serviciile bazate pe localizare furnizeazs o unealta importanta
ce incorporeaza mobilitatea nativa a dispozitivului in aplicatiile dezvoltate.
2.2 Localizare si h art i
Aplicatiile pentru dispozitivele mobile ce contin harti si servicii de localizare ofera o experi-
enta convingatoare. Dezvoltarea unor astfel de aplicatii necesita utilizarea claselor din pachetul
android.location si Google Maps Android API.
2.2.1 Serviciile de localizare
Sistemul Android ofera accesul la serviciile de localizare prin intermediul claselor din pachetul
android.location. Componenta principala a cadrului de localizare este serviciul LocationMan-
ager, aceasta ofera API-uri pentru a determina locatia si directia dispozitivului. Instantierea unui
LocationManager nu se poate face direct, astfel se va cere sistemului o instanta prin apelarea get-
SystemService(Context.LOCATION SERVICE). Aceasta metoda va returna un "handler" pentru
noua instanta. [9]
Atunci cand aplicatia va avea un LocationManager, va putea realiza urmatoarele lucruri:
Interogarea listei cu toti LocationProvider{ ii pentru ultima locatie cunoscuta a utilizatoru-
lui;
24
Cristina Elena S ^ rbu Capitolul 2: Google Maps
Inregistrarea sau anularea inregistrarii actualizarilor periodice ale locatiei curente de la furni-
zorul de locatie;
Inregistrarea sau anularea inregistrarii pentru ca un Intent dat sa e pornit daca dispozitivul
ajunge in apropierea unei anumite zone.
2.2.2 Google Maps Android API
Cu ajutorul API-ului Google Maps pentru Android se pot adauga harti aplicatiilor, datele ind
provenite de la Google Maps. API-ul manipuleaza automat accesul la serverele Google Maps,
descarcarea datelor, asarea hartii si gesturile tactile efectuate asupra hartii. Se mai poate folosi
API-ul si pentru adaugarea marcatoarelor, poligoanelor si suprapunerilor si pentru a schimba
modul de vizualizare al hartii.
Clasa principala din Google Maps Android API este MapView. Aceasta aseaza harta cu
datele obtinute de la serviciul Google Maps. Clasa va capta gesturile tactile pentru a misca harta
automat si, de asemenea, ofera toate elementele UI necesare utilizatorilor pentru a controla harta.
[5]
API-urile Google Maps pentru Android nu sunt incluse in platforma Android, dar sunt disponi-
bile pe orice dispozitiv ce ruleaza Android 2.2 sau mai mare.
Pentru integrarea Google Maps intr-o aplicatie este necesara instalarea librariilor Google Play
Services.
2.3 Strategii de localizare
Atunci cand se dezvolta aplicatii ce folosesc localizarea se poate utiliza GPS-ul si Network
Location Provider al sistemului Android pentru a obtine locatia utilizatorului. Desi, GPS-ul, este
cel mai precis, functioneaza numai in aer liber, consuma bateria dispozitivului destul de rapid si
mai important, nu returneaza locatia foarte rapid. Furnizorul de locatie prin retea al Android-ului
determina locatia utilizatorului folosind semnalul de la retele mobile sau WI-FI, oferind informatii
referitoare la locatie atat in aer liber cat si inauntrul unei cladiri, raspunsul ind rapid si nivelul
de energie folosit ind mult mai mic. Pentru a obtine locatia se pot folosi atat ambele cat si doar
una din metode.
2.3.1 Erori ^ n determinarea locat iei
Exista mai multe motive pentru care determinarea locatiei poate contine erori. Unele surse
ale acestor erori pot :
Multitudinea surselor de localizare: GPS, Cell-ID si Wi-Fi pot oferi locatia unui utilizator,
alegerea celui folosit este o chestiune de compromisuri in precizie, viteza de localizare si
ecienta bateriei;
25
Cristina Elena S ^ rbu Capitolul 2: Google Maps
Miscarile utilizatorului: deoarece locatia utilizatorului se schimba, aceasta trebuie estimata
periodic;
Precizie diferita: estimarile de localizare provenite de la ecare sursa pot destul de diferite;
spre exemplu, o locatie oferita de o anumita sursa acum 10 secunde poate mai precisa
decat cea mai noua locatie oferita de o alta sursa sau chiar de aceeasi.
2.3.2 Actualizarea locat iei
Pentru a primi actualizari ale locatiei de la LocationManager se va apela metoda requestLo-
cationUpdates(), careia i se va transmite un LocationListener. Acesta trebuie sa implementeze
anumite metode pe care Location Manager le apeleaza cand locatia se schimba. Codul urmator
arata cum se deneste un LocationListener si cum se cer actualizarile unei locatii:
1//Obtinerea unei referinte de la Location Manager
2LocationManager locationManager = (LocationManager) this.getSystemService
(Context.LOCATION_SERVICE);
3//Definirea unui listener ce raspunde la actualizarile locatiei
4LocationListener locationListener = new LocationListener() {
5 public void onLocationChanged(Location location) {
6 // Apelata cand o noua locatie este gasita de furnizor.
7 makeUseOfNewLocation(location);
8 }
9 public void onStatusChanged(String provider, int status, Bundle extras){}
10 public void onProviderEnabled(String provider) {}
11 public void onProviderDisabled(String provider) {}
12};
13//Inregistrarea listener-ului cu LocationManager pentru a primi actualizarile
14// locatiei
15locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0,
locationListener);
Primul parametru din metoda requestLocationUpdates() este tipul de furnizor folosit, urma-
torii doi parametri permit controlarea frecventei de actualizare (al doilea ind intervalul de timp
minim dintre noticari iar al treilea distanta minima schimbata dintre noticari, setand aceste
valori 0 se vor solicita noticari de actualizare a locatiei cat mai frecvent posibil) iar ultimul
parametru este LocationListener-ul ce este apelat pentru actualizarea locatiei. Pentru a actualiza
locatia folosind GPS-ul se va inlocui NETWORK PROVIDER cu GPS PROVIDER.
Solicitarea permisiunilor
Pentru a primii actualizarile de la NETWORK PROVIDER sau GPS PROVIDER trebuie cerute
permisiuni de la utilizator, acest lucru se realizeaza prin declararea in Manifest a uneia dintre cele
doua permisiuni specice(ACCESS COARSE LOCATION sau ACCESS FINE LOCATION). Fara
permisiuni aplicatia va esua in momentul cererii de actualizari ale locatiei.
26
Cristina Elena S ^ rbu Capitolul 2: Google Maps
1<manifest … >
2 <uses permission android:name="android.permission.ACCESS FINE LOCATION" / >
3</manifest >
2.3.3 Denirea unui model
Aplicatiile bazate pe localizare sunt obisnuite, dar obtinerea locatiei este destul de dicila
datorita preciziei scazute, miscarilor utilizatorului, multitudinii de metode pentru obtinerea locatiei
si dorinta de-a conserva bateria dispozitivului. Pentru a depasi obstacolele intalnite in incercarea
de-a obtine o locatie cat mai precisa si totodata de-a pastra energia bateriei trebuie denit un
model consistent ce specica felul in care aplicatia obtine locatia.
Fluxul obt inerii locat iei
Procedurile urmatoare specica felul in care locatia utilizatorului ar trebui obtinuta:
1. Lansarea in executie a aplicatiei;
2. Dupa o perioada, relativ scurta, se incepe "ascultarea" pentru actualizari de la furnizorii
locatiei;
3. Mentinerea celei mai bune estimari ale locatiei curente, prin ltrarea noilor dar mai putin
precise locatii;
4. Incetarea ascultarii pentru actualizari ale locatiei;
5. Se prota de ultima cea mai buna estimare a locatiei.
Inceperea ascultarii pentru actualizari
Uneori se doreste inceperea ascultarii imediat ce aplicatia a fost lansata in executie insa trebuie
tinut cont de faptul ca ferestrele lungi de ascultare pentru detectarea locatiei pot consuma foarte
multa baterie dar perioadele scurte pot avea un rezultat nesatisfacator, locatia rezultata neind
precisa.
Inceperea ascultarii pentru actualizari se realizeaza prin apelarea metodei requestLocationUp-
dates():
1String locProvider = LocationManager.NETWORK_PROVIDER;
2locationManager.requestLocationUpdates(locProvider, 0, 0, locationListener);
Obtinerea unei rezolvari rapide folosind ultima locatie cunoscuta
Datorita faptului ca uneori timpul necesar listener-ului pentru a primi locatia poate destul de
lung se poate utiliza ultima locatie obtinuta prin apelarea metodei getLastKnownLocation(String):
1String locProvider = LocationManager.NETWORK_PROVIDER;
2Location lastKnownLocation = locatManager.getLastKnownLocation(locProvider);
27
Cristina Elena S ^ rbu Capitolul 2: Google Maps
Incetarea ascultarii pentru actualizari
Momentul in care ar trebui sa se opreasca ascultarea variaza in functie de complexitatea
aplicatiei. Un mic decalaj, intre momentul in care locatia este obtinuta si momentul in care este
folosita, va imbunatati precizia estimarii locatiei. Trebuie tinut intotdeauna cont de faptul ca
ascultarea pentru perioade lungi de timp va consuma o cantitate considerabila de energie, astfel
de indata ce locatia a fost obtinuta ascultarea trebuie oprita. Aceasta operatiune se face prin
apelare metodei removeUpdates(PendingIntent):
1 locationManager.removeUpdates(locationListener);
Mentinerea celei mai bune estimari
Exista situatii in care cea mai noua locatie obtinuta sa nu e chiar cea mai precisa. Astfel, ar
trebui aleasa cea mai buna estimare a locatiei iar acest lucru se poate realiza prin introducerea
anumitor criterii de selectie:
Se verica daca locatia obtinuta este semnicativ mai noua decat cea estimata anterior;
Se verica daca precizia locatiei obtinuta este mai buna sau mai putin buna decat cea
estimata anterior;
Se verica ce tip de furnizor a obtinut noua locatie si se determina care este cel mai de
incredere furnizor.
2.4 Senzori
Majoritatea dispozitivelor, ce ruleaza sistemul de operare Android, au incorporati senzori ce
masoara miscarea, orientarea si diferite conditii de mediu. Acesti senzori pot furniza date cu o
precizie crescuta si sunt foarte folositori atunci cand se doreste monitorizarea 3D a miscarilor
ori pozitionarea dispozitivului sau daca se doreste monitorizarea schimbarilor de mediu din jurul
dispozitivului. Spre exemplu, o aplicatie pentru meteo ar putea folosi senzorul de temperatura
al dispozitivului si senzorul de umiditate pentru a calcula si a raporta nivelul de roua. Sau, o
aplicatie de calatorie ce ar putea utiliza senzorul geomagnetic si accelerometrul pentru a raporta
directia dintr-o busola. Platforma Android suporta trei mari categorii de senzori:
Senzori de miscare: acestia masoara forta de acceleratie si forta de rotatie de-a lungul
a trei axe; in aceasta categorie intra accelerometrele, senzorii de gravitatie, giroscoapele si
senzori ai vectorilor de rotatie;
Senzori de mediu: acesti senzori masoara diferiti parametrii de mediu, cum ar temper-
atura si presiunea aerului, umiditatea; in aceasta categorie intra barometrele, fotometrele
si termometrele;
Senzori de pozitie: acesti senzori masoara pozitia zica a dispozitivului; in aceasta
categorie intra senzorii de orientare si magnetometrele.
28
Cristina Elena S ^ rbu Capitolul 2: Google Maps
Se pot accesa senzorii disponibili pe dispozitiv si obtine datele de la senzori prin utilizarea
cadrului senzor Android(Android Sensor Framework). Acest cadru furnizeaza clase si interfete
ce ajuta la realizarea diferitelor sarcini specice senzorilor. Spre exemplu, se poate folosi cadrul
pentru a:
Determina ce senzori sunt disponibili pe dispozitiv;
Determina capacitatea unui anumit senzor;
Obtinerea datelor si denirea ratei minime la care se obtin aceste date;
Inregistrarea sau anularea inregistrarii unui listener ce monitorizeaza schimbarile.
Framework-ul de senzori al Android-ului permite accesarea mai multor tipuri de senzori. Unii
dintre acestia sunt de tip hardware iar altii de tip software. Cei hardware sunt senzorii zici, cei
construiti intr-un dispozitiv. Ei obtin datele prin masurarea directa a proprietatiilor de mediu,
cum ar accelerarea, forta campului geomagnetic sau schimbarea unghiulara. Senzorii de tip
software imita oarecum senzorii hardware insa acestia obtin datele de la unul sau mai multi
senzori hardware. Senzorul de acceleratie liniara si senzorul de gravitatie sunt un exemplu de
senzori software.
Sensor Framework
Acest framework este parte a pachetului android.hardware si include urmatoarele clase si
interfete:
SensorManager | se foloseste pentru instantierea serviciului de senzor; aceasta clasa ofera
diferite metode pentru accesarea senzorilor, inregistrarea sau anularea inregistrarii unui
listener pentru senzor si pentru obtinerea informatiilor despre orientare; de asemenea, mai
ofera si cateva constante senzor ce sunt folosite pentru a rapora precizia senzorului sau
calibrarea lor;
Sensor | se foloseste pentru instantierea unui anumit senzor; aceasta clasa ofera diferite
metode ce ajuta la determinarea capacitatilor unui senzor;
SensorEvent | este folosita de sistem pentru a crea un obiect ce furnizeaza informatii
despre un eveniment al senzorului; un astfel de obiect include informatii despre datele
concrete ale senzorului, tipul senzorului ce a generat evenimentul, precizia datelor;
SensorEventListener | aceasta interfata se poate folosi pentru a apela metodele ce primesc
noticariile cand valorile sau precizia senzorului se schimba.
Senzorii se folosesc pentru a indeplini doua sarcini de baza:
1. Identicarea senzorilor si a capacitatilor acestora: este o operatiune necesara la lansarea
in executie a aplicatiei, daca aceasta are anumite proprietati ce se bazeaza pe anumite
capacitati ale senzorilor;
29
Cristina Elena S ^ rbu Capitolul 2: Google Maps
2. Monitorizarea evenimentelor: este modalitatea prin care se obtin datele concrete ale sen-
zorului; un eveniment de acest tip se intampla ori de cate ori un senzor va detecta o
schimbare in parametrii pe care ii masoara.
Identicarea senzorilor si a capacitatilor acestora
Framework-ul pentru senzori furnizeaza cateva metode ce usureaza la executie a
area sen-
zorilor diponibili pe dispozitiv. API-ul furnizeaza metode ce permit determinarea capacitatilor
ecarui senzor.
Pentru a determina ce senzori sunt disponibili trebuie obtinuta o referinta catre serviciul de
senzori. Acest lucru se realizeaza prin instantierea clasei SensorManager si prin apelarea metodei
getSystemService(), careia i se va atribui un argument SENSOR SERVICE.
1 private SensorManager mSensorManager;
2 mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Pentru a obtine o lista cu ecare senzor disponibil se va apela metoda getSensorList().
1 List<Sensor> deviceSensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);
Daca se doreste listarea senzorilor doar de un anumit tip, in locul constantei TYPE ALL se
va folosi unul dintre tipurile de senzori (TYPE GYROSCOPE,TYPE GRAVITY,
TYPE LINEAR ACCELERATION).
Se mai poate determina daca un anumit tip de senzor exista pe dispozitiv prin apelarea
metodei getDefaultSensor() careia ii se atribuie o constanta ce specica tipul de senzor.
1 private SensorManager mSensorManager;
2 mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
3 if (mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) != null){
4 // Exista un magnetometru.
5 }else{
6 // Nu exista un magnetometru.
7 }
Metodele clasei Sensor pot utilizate pentru a determina capacitatile si atributele unui sen-
zor. Acest lucru este folositor atunci cand se doreste ca aplicatia sa aiba un comportament diferit
in functie de senzorii disponibili sau capacitatile lor. Spre exemplu, se pot folosi metodele ge-
tResolution() si getMaximumRange() pentru a obtine rezolutia senzorului si o gama maxima de
masurare.
Monitorizarea evenimentelor
Monitorizarea datelor preluate de la senzor necesita implementarea a doua metode ale inter-
fetei SensorEventListener:
onAccuracyChanged() | metoda este apelata atunci cand exista schimbari ale acuratetii
si furnizeaza o referinta catre obiectul de tip Sensor ce va schimba noua acuratete a
30
Cristina Elena S ^ rbu Capitolul 2: Google Maps
senzorului; acuratetea este reprezentata de una din cele patru constante de stare( SEN-
SOR STATUS ACCURACY LOW, SENSOR STATUS ACCURACY MEDIUM,
SENSOR STATUS ACCURACY HIGH, SENSOR STATUS ACCURACY UNRELIABLE);
onSensorChanged() | metoda este apelata cand senzorul raporteaza o noua valoare si va
furniza un obiect de tip SensorEvent.
Sistemul de coordonate
Framework-ul exprima valorile folosind un sistem de coordonate cu trei axe. Pentru majoritatea
senzorilor, sistemul de coordonate este denit in functie de ecranul dispozitivului, atunci cand
este tinut in pozitie verticala, pozitia implicita. Cand este tinut in pozitia implicita axa X este
orizontala si orientata catre dreapta, axa Z este orientata catre exteriorul ecranului iar axa Y este
verticala si orientata in sus. Sistemul de coordonate este folosit de urmstorii senzori:
Accelerometrul
Senzorul de gravitatie
Giroscopul
Senzorul de acceleratie liniara
Senzorul geomagnetic
Foarte important de retinut este faptul ca axele din sistemul de coordonate nu se schimba
atunci cand orientarea ecranului se schimba, cu alte cuvinte, sistemul de coordonate nu se schimba
cand dispozitivul se misca. De asemenea, de retinut faptul ca aplicatia nu trebuie sa presupuna
ca orientarea implicita a dispozitivului este portret, deoarece orientarea implicita a unor tablete
este cea de landscape iar sistemul de coordonate (gura 2.1) este intotdeauna bazat pe orientarea
implicita a dispzitivului.
Figure 2.1: Sistemul de coordonate folosit de Sensor API[1]
31
Cristina Elena S ^ rbu Capitolul 2: Google Maps
2.4.1 Senzori de mi scare
Senzorii de miscare sunt utilizati pentru a monitoriza miscarile dispozitivului, cum ar rotatia,
inclinarea, balansarea. Miscarea este o re
exie a miscarilor utilizatorului dar poate si re
exia
zica a mediului in care se a
dispozitivului. In primul caz se monitorizeaza miscarea in functie
de cadrul de referinta al dispozitivului, iar in cel de-al doilea caz se monitorizeaza miscarea in
functie de cadrul de referinta exterior. De obicei, senzorii de miscare nu sunt folosii pentru a
monitoriza pozitia dispozitivului, dar pot folositi impreuna cu alti senzori pentru a determina
pozitia dispozitivului relativa la cadrul de referinta exterior. Toti senzorii de miscare intorc vectori
multi-dimensionali de valori senzor pentru ecare SensorEvent.
Utilizarea accelerometrului
Accelerometrul masoara acceleratia aplicata dispozitivului si forta gravitationala. Conceptual,
accelerometrul determin acceleraia aplicata unui dispozitiv prin msurarea fortelor ce sunt aplicate
asupra senzorului in sine, insa intotdeauna forta gravitationala in
uenteaza acceleratia masurata.
Accelerometrul foloseste sistemul de coordonate standard al senzorilor.
Utilizarea senzorului de gravitatie
Senzorul de gravitatie ofera un vector tridimensional ce indica directia si magnitudinea grav-
itatiei. Unitatile de masura si sistemul de coordonate sunt aceleasi cu cele folosite de ac-
celerometru. Cand dispozitivul este in repaus, datele asate de senzorul de gravitatie ar trebui sa
e identice cu cele asate de accelerometru.
Utilizarea giroscopului
Giroscopul masoara rotatia in rad/s in jurul axei XYZ a dispozitivului. Foloseste acelasi
sistem de coordonate ca si cel intalnit la accelerometru. Giroscoapele standard ofera date de
rotatie brute, fara a ltra sau a corecta zgomotele, aceste zgomote vor initia anumite erori.
2.4.2 Senzori de pozit ie
Senzorii de pozitie sunt utilizati pentru a determina locatia dispozitivului in cadrul de referinta
exterior. Platforma Android pune la dispozitie doi senzori ce permit determinarea locatiei: senzorul
pentru campul geomagnetic si senzorul de orientare. De asemenea, este pus la dispozitie si
senzorul de proximitate(determina cat de aproape se a
a un obiect de dispozitiv). Senzorul
pentru campul magnetic, cunoscut sub numele de Compass Sensor, si senzorul de proximitate
sunt senzori hardware. Senzorul de orientare este de tip software si isi capata informatiile de la
accelerometru si magnetometru. Senzorii de pozitie nu sunt folositi pentru a monitoriza miscarile
dispozitivului(inclinarea, impingerea).
Senzorul de orientare si compass-ul returneaza vectori multi-dimensionali de valori de tip
senzor pentru ecare SensorEvent. De exemplu, senzorul de orientare furnizeaza intr-un singur
eveniment de tip senzor valori ale intensitatii campului geomagnetic pentru ecare dintre cele trei
axe ale sistemului de coordonate. Senzorul de proximitate ofera o singura valoare pentru ecare
32
Cristina Elena S ^ rbu Capitolul 2: Google Maps
eveniment de tip senzor. Senzorul de orientare a fost declarat "deprecated" o data cu aparitia
versiunii 2.2 a Android-ului(Nivel API 8).
Utilizarea magnetometrului
Acest senzor permite monitorizarea schimbarilor in campul magnetic al pamantului. Furnizeaza
date despre intensitatea campului pentru ecare dintre cele trei axe ale sistemului de coordonate.
De obicei, acest senzor nu se foloseste direct, ci se foloseste giroscopul pentru a determina mis-
carile de rotatie sau se utilizeaza accelerometrul si magnetometrul impreuna cu metoda getRota-
tionMatrix() pentru a obtine matricea de rotatie si matricea de inclinatie.
Utilizarea senzorului de proximitate
Senzorul de proximitate permite stabilirea distantei unui obiect fata de dispozitiv. De obicei,
pentru a stabili distanta dintre utilizator si dispozitiv, spre exemplu cand utilizatorul primeste
sau face un apel telefonic. Majoritatea senzorilor de proximitate returneaza distanta in cm, insa
exista si senzori ce returneaza valori binare ce reprezinta aproape sau departe. In acest caz,
senzorul raporteaza valoarea maxima(de obicei, >5cm) in starea "departe" si valoarea minima
in starea "aproape". Se poate determina intervalul maxim al senzorului prin apelarea metodei
getMaximumRange().
2.4.3 Senzorii de mediu
Senzorii de mediu sunt folositi pentru a monitoriza umiditatea mediului ambiant, presiunea
ambientala, temperatura din jurul dispozitivului. Spre deosebire de senzorii de miscare si cei de
pozitie, senzorii de mediu nu intorc un vector multi-dimensional de valori pentru ecare Sen-
sorEvent ci cate o singura valoare pentru ecare eveniment.
Toti senzorii de mediu sunt de tip hardware si sunt disponibili numai daca producatorul dis-
pozitivului le-a introdus. Cu exceptia senzorului de lumina, folosit pentru a controla luminozitatea
ecranului, senzorii de mediu nu sunt intotdeauna disponibili pe un dispozitiv. Din acest motiv, in
momentul executiei este importanta vericarea existentei senzorilor de mediu, inainte de-a incerca
preluarea de date.
2.5 Google Maps Android API v2
Crearea unei noi aplicatii Android ce utilizeaza Google Maps Android API v2 presupune ur-
marea mai multor pasi ce asigura buna functionare a aplicatiei, si anume:
1. Instalarea Android SDK.
2. Descarcarea si instalarea Google Play services SDK, pachet ce include si Google Maps
Android API.
3. Obtinerea cheii API (pas ce consta in inregistrarea proiectului in consola Google API pentru
a obtine un certicat pentru aplicatie).
33
Cristina Elena S ^ rbu Capitolul 2: Google Maps
4. Specicarea permisiunilor in manifest.
5. Adaugarea hartii in aplicatie
6. Publicarea aplicatiei.
2.5.1 Instalarea Android SDK
Devoltarea aplicatilor Android necesita, in primul rand, instalat Eclipse IDE. Android pune la
dispozitie un plugin pentru dezvoltarea aplicatiilor numit Android Development Tools(ADT)[5].
Integrarea plugin-ului ADT in Eclipse IDE se realizeaza astfel:
1. Pornire Eclipse, apoi selectare Help ÝInstall New Software
2. Selectare Add.
3. In dialogul Add Repository se va introduce la Name "ADT Plugin" iar la Location linkul:
https://dl-ssl.google.com/android/eclipse/ .
4. Selectare "OK".
5. In dialogul "Available Software", se selecteaza casuta din dreptul "Developer Tools" iar
apoi butonul Next.
6. In fereastra urmatoare va asata o lista cu tool-urile ce se vor descarca, se selecteaza
Next.
7. Selectare Finish.
8. Cand instalarea s-a sfarsit Eclipse-ul trebuie repornit.
Dupa ce Eclipsul a repornit, trebuie specicata locatia folderului Android SDK. Astfel, in
fereastra ce va aparea Welcome to Android Development se va selecta Use existing SDKs iar
apoi se va selecta locatia in care se a
a Android SDK.
2.5.2 Instalarea si congurarea Google Play Services SDK
Instalarea si congurarea Google Play services SDK presupune, in primul rand, crearea unui
proiect Android in Eclipse.
1. Selectati File ÝNewÝAndroid Application Project.
2. Completati campurile ce apar (gura 2.2):
34
Cristina Elena S ^ rbu Capitolul 2: Google Maps
Figure 2.2: Setarea proprietatilor proiectului
Application Name: este numele aplicatiei ce va aparea si utilizatorilor;
Project Name: este numele proiectului si este vizibil in Eclipse;
Package Name: este numele pachetului; in acest exemplu s-a folosit com.example.exempluaplicatie
insa nu se poate publica aplicatia pe Google Play folosind com.example;
Minimum Required SDK: este cea mai mica versiune a sistemului Android suportat
de aplicatie;
Target SDK: indica ultima versiune de Android pe care a fost testata aplicatia;
Complie With: este versiunea platformei pe care se va compila aplicatia;
Theme: specica tema interfetei aplicatiei.
Selectati Next
3. In urmatoarea fereastra este recomandat sa se pastreze setarile prestabilite. Selectati Next.
4. Urmatoarea fereastra permite crearea unei iconite pentru aplicatie. Selectati Next.
5. In acest moment se va putea alege un model pentru o activitate de unde se va incepe
dezvoltarea aplicatiei (gura 2.3). Selectati Next.
Figure 2.3: Setari pentru activitate
6. In fereastra ce urmeaza se vor putea denumi activitatea, numele layout-urilor si selecta un
tip de navigare (gura 2.4).
35
Cristina Elena S ^ rbu Capitolul 2: Google Maps
Activity Name: reprezinta numele clasei activitatii principale;
Layout Name: numele layout-ului pentru activitatea principala;
Fragment Layout Name: numele layout-ului pentru continutul fragmentat al activ-
itatii;
Navigation Type: se poate alege tipul de navigare in aplicatie.
Selectati Finish
Figure 2.4: Setari pentru activitate si layout
Instalarea Google Play services SDK se realizeaza prin Android SDK Manager. Dupa instalare
se va adauga Google Play services ca o librarie Android, iar apoi Google Play services va trebui
referentiat proiectului Android creat.
In AndroidManifest.xml, in elementul <application >se vor insera urmatoarele linii de cod:
1<meta-data
2 android:name="com.google.android.gms.version"
3 android:value="@integer/google_play_services_version" />
2.5.3 Obt inerea certicatului Android si API Key
Accesul la severele Google Maps este conditionat de obtinerea cheii Maps API. Aceasta cheie
se obtine de la Google APIs Console prin furnizarea certicatului si numele pachetului aplicatiei.
Adaugarea cheii in aplicatie se face prin inserarea unui element in sierul AndroidManifest.xml al
aplicatiei[5].
Cheia Maps API se bazeaza pe o forma scurta a certicatului digital al aplicatiei, cunoscut
sub numele de SHA-1 ngerprint . Acest ngerprint este un sir de caractere unic generat de
algoritmul de hashing SHA-1. Pentru a obtine amprenta SHA-1 pentru certicat trebuie folosit
certicatul corect, deoarece este posibil sa existe doua certicate:
Debuge certicate: este generat automat de Android SDK cand se realizeaza un debug
de la linia de comanda sau cand se ruleaza proiectul din Eclipse fara a exportat ca
36
Cristina Elena S ^ rbu Capitolul 2: Google Maps
o aplicatie. Se foloseste doar cu aplicatiile ce sunt in testare, in niciun caz nu trebuie
publicata aplicatia cu acest certicat.
Release certicate: este generat de Android SDK atunci cand se publica aplicatia.
Asarea amprentei pentru certicatul de debug
1. Localizati sierul debug.keystore
OS X i Linux:/.android/
Windows 8:C:nUsersnnumele utilzatoruluin.androidn
2. Asarea amprentei SHA-1
OS X i Linux, intr-o fereastra introduceti:
keytool -list -v -keystore~/.android/debug.keystore -alias androiddebugkey -storepass
android keypass android
Windows 8, in command prompt introduceti:
keytool -list -v keystore "%USERPROFILE% n.androidndebug.keystore" -alias an-
droiddebugkey -storepass android keypass android
3. Se va asa amprenta SHA-1
Asarea amprentei pentru certicatul de lansare al aplicatiei
1. Localizati sierul keystore al certicatului de lansare. Se pot asa alias-urile pentru toate
cheile din keystore prin introducerea comenzii: keytool -list -keystore your keystore name
"your keystore name" se va inlocui cu intreaga cale si numele keystore-ului.
2. Inserati la un terminal sau in command prompt: keytool -list -v -keystore your keystore name
-alias your alias name
3. Se va asa amprenta SHA-1
Crearea unui proiect API in consola Google APIs
1. Cu ajutorul unui browser, accesati https://console.developers.google.com/
In cazul in care nu ati mai folosit Google APIs Console, vi se va sugera crearea unui
proiect pentru a urmari utilizarea Google Maps Android API. Selectati Create Project
iar consola va crea un nou proiect numit API Project.
2. Selectati Services din bara de navigare din stanga.
3. Cautati Google Maps Android API v2 si comutati pe On.
37
Cristina Elena S ^ rbu Capitolul 2: Google Maps
Obtinerea cheii Google Maps API
1. Selectati proiectul din Google APIs Console.
2. Vericati daca serviciul Google Maps Android API v2 este activat.
3. Din bara de navigare din stanga selectati API Access .
4. Selectati Create New Android Key .
5. In dialogul ce apare introduceti amprenta SHA-1 urmata de ";" si apoi de numele pachetului
aplicatiei.
6. Consola va asa cheia pentru aplicatie.
Adaugarea cheii API in aplicatie
In sierul AndroidManifest.xml, in elementul <application >se va insera urmatorul element:
1<meta-data
2 android:name="com.google.android.maps.v2.API_KEY"
3 android:value="API_KEY />
Se va inlocui API KEY cu cheia generata de consola Google APIs.
2.5.4 Specicarea permisiunilor
Google Maps Android API necesita specicarea unor permisiuni pentru a putea functiona, si
anume:
android.permission.INTERNET | utilizat de API pentru a descarca harta de la serverele
Google Maps;
android.permission.ACCES NETWORK STATE | permite API-ului sa verice starea conex-
iunii pentru a stabili daca se pot descarca date;
android.permission.WRITE EXTERNAL STORAGE | permite API-ului sa depoziteze datele
hartii in memoria dispozitivului;
android.permission.ACCES COARSE LOCATION | permite API-ului sa foloseasc WiFi-
ul sau reteaua mobila pentru a determina pozitia dispozitivului (aceasta permisiune este
optionala);
android.permission.ACCESS FINE LOCATION | permite API-ului sa acceseze GPS-ul
pentru a determina pozitia dispozitivului [5].
38
Cristina Elena S ^ rbu Capitolul 2: Google Maps
2.5.5 Ad augarea h art ii
Cel mai simplu mod de a verica daca aplicatia este congurata corect este de a adauga o
harta. Acest lucru presupune schimbarea a doua siere: XML-ul si activitatea principala:
1. In sierul XML se va insera codul urmator:
1<?xml version="1.0" encoding="utf-8"?>
2<fragment xmlns:android=http://schemas.android.com/apk/res/android
3 android:id="@+id/map"
4 android:layout_width="match_parent"
5 android:layout_height="match_parent"
6 android:name="com.google.android.gms.maps.MapFragment
7/>
2. In MainActivity.java se va adauga:
1
2package com.example.exempluaplicatie;
3import android.app.Activity;
4import android.os.Bundle;
5public class MainActivity extends Activity {
6 @Override
7 protected void onCreate(Bundle savedInstanceState) {
8 super.onCreate(savedInstanceState);
9 setContentView(R.layout.activity_main);
10 }
11}
3. Prin rularea aplicatiei harta va asata, dupa cum se poate observa in gura 2.5.
Insa, daca asarea nu se va produce, asigurati-va ca ati urmat toate etapele descrise
mai sus.
Figure 2.5: Harta
39
Capitolul 3
Prezentarea aplicat iei
40
Cristina Elena S ^ rbu Capitolul 3: Prezentarea aplicat iei
3.1 Prezentare General a
Aplicatia va optimiza transportul in comun in Craiova oferind functionalitatile de baza necesare
unui astfel de proces. Printre functionalitatiile aplicatiei, enumeram:
Posibilitatea asarii programului autobuzelor;
Posibilitatea asarii rutelor ecarei linii de autobuz;
Localizarea utilizatorului;
Asarea statiilor din imediata apropiere a utilizatorului;
Asarea unui traseu pe harta.
Aplicatia va putea instalata pe un dispozitiv ce ruleaza sistemul Android. A fost dezvoltata
pentru versiunea 4.4.2 (KITKAT) a Android-ului insa poate rula pe orice dispozitiv ce are cel
putin versiunea 4.0 (ICE CREAM SANDWICH).
3.2 Prezentarea structural a
In acest subcapitol este prezentata structura aplicatiei. Proiectul este denumit "BusApp"
(gura 3.1)iar principalele directoare ale sale sunt:
srcce contine patru pachete:
{ro.aplicatie.busapp;
{ro.aplicatie.busapp.Places;
{ro.aplicatie.busapp.PlacesModels;
{ro.aplicatie.busapp.Routes;
libs in care sunt adaugate librariile necesare anumitor functionalitati ale aplicatiei:
{android-support-v4.jar;
{gson-2.2.4.jar;
resce contine mai multe directoare importante
{drawable;
{drawable-hdpi;
{layout;
{menu;
{values;
41
Cristina Elena S ^ rbu Capitolul 3: Prezentarea aplicat iei
Figure 3.1: Fisierele Java din cadrul pachetelor
De asemenea, exista si libraria google-play-services lib.jar de care proiectul este dependent,
fara aceasta metodele ce tin de localizare si harta nu ar functiona.
Unul dintre cele mai importante siere este, desigur, AndroidManifest.xml, in cadrul acestuia
se denesc permisiunile necesare anumitor functionalitati ale aplicatiei, activitatile aplicatiei, cheia
API, nivelul minim si maxim de API si multe altele.
In continuare vom prezenta, in detaliu, sierele din cadrul pachetelor si a celorlalte directoare.
Directorul src
Pachetul ro.aplicatie.bussapp contine urmatoarele siere Java:
{ Launcher.java : contine clasa Launcher ce mosteneste clasa FragmentActivity, este
denita in sierul AndroidManifest.xml in categoria "Launcher", ceea ce semnica
faptul ca aceasta activitate va prima asata in momentul executiei aplicatiei, aceasta
clasa va asa o imagine;
{ Main.java : contine clasa Main ce mosteneste clasa TabActivity, aceasta creeaza trei
taburi formate din sierele Program.java, Map.java si Rute.java;
{ Program.java : contine clasa Program ce mosteneste FragmentActivity, in cadrul
activitatii se va asa programul autobuzelor sub forma unei liste si se va putea cauta
in functie de numele statiei si liniei;
{ ProgramDbAdapter : contine clasa ProgramDbAdapter si clasa DatabaseHelper ce
moteneste SQLiteOpenHelper, in cadrul acesteia se deneste baza de date ce contine
autobuzele si rutele lor si se incarca datele in baza de date;
{ Line.java : contine clasa Line si reprezinta un model pentru liniile de autobuze in care
se denesc diferite metode pentru obtinerea sau setarea numelor;
42
Cristina Elena S ^ rbu Capitolul 3: Prezentarea aplicat iei
{ Map.java : contine clasa Map ce mosteneste FragmentActivity in care se obtine lo-
calizarea utilizatorului, asarea statiilor din apropiere, clasa ReverseGeocodingTask ce
mosteneste AsyncTask <LatLng, Void, String >unde se face geocodicarea inversa in
momentul in care utilizatorul doreste sa vizualizeze anumite adrese de pe harta prin
plasarea unui obiect de tip Marker pe harta;
{ Rute.java : contine clasa Rute ce mosteneste FragmentActivity unde se denesc
anumite campuri si butoane, campuri de tip AutoCompleteTextView in care se vor
adauga locatiile, e locatia curenta e alte locatii; de asemenea, contine si clasa Re-
verseGeocodingTask ce mosteneste clasa AsyncTask <Location, Void, Void >ce va
ajuta la completarea acelor campuri cu adrese concrete;
Pachetul ro.aplicatie.busapp.Places :
{ GetPlacesTask.java : contine clasa GetPlacesTask ce mosteneste AsyncTask <String,
Void, PlacesResult >unde se incearca obtinerea conexiunii catre serverele Google pen-
tru a obtine statiile de autobuz;
{ PlacesAPI.java : contine clasa PlacesAPI, iar aici se denesc link-urile necesare
obtinerii unui raspuns de tip Json;
{ PlacesReceivedListener.java : contine interfata PlacesReceivedListener, cu ajutorul
careia se vor obtine date;
Pachetul ro.aplicatie.busapp.PlacesModels :
{ BusStation.java : contine clasa BusStation si reprezinta modelul pentru statiile de
autobuz in care se denesc metode de tip getName(), getVicinity() si getLatLng();
{ Geometry.java : contine clasa Geometry si este utilizata pentru facilitarea obtinerii
datelor, raspunsul de la Json pentru PlacesAPI are locatiile in interiorul unei chei de
tip geometry;
{ Location.java : contine clasa Location si reprezinta modelul in care se denesc
metode de tip getLatitude(), getLongitude() sau setLongitude(
oat longitude), etc;
{ PlacesResult.java : contine clasa PlacesResult si cu ajutorul ei se vor putea obtine
locatiile deoarece returneaza o lista de tip BusStation oferind metode pentru contin-
uarea cautarii.
Pachetul ro.aplicatie.busapp.Routes :
{ DirectionsJSONParser.java : contine clasa DirectionsJSONParser ce incearca de-
senarea rutei pe harta;
{ PlacesAutoCompleteAdapter.java : contine clasa PlacesAutoCompleteAdapter ce
mosteneste ArrayAdapter <String>si este utilizata in cadrul clasei Rute ajutand la
completarea automata a campurilor.
43
Cristina Elena S ^ rbu Capitolul 3: Prezentarea aplicat iei
Directorul res(gura 3.2):
drawable :
Figure 3.2: Fisierele din directorul drawable
{ mapicon.xml ,programicon.xml siruteicon.xml : sunt folosite de catre Main cand
se creaza cele trei tab-uri, iar in ele se regaseste denirea icon-ului ecarui tab;
drawable-hdpi (gura 3.3):
Figure 3.3: Fisierele din directorul drawable-hdpi
{in cadrul acestui director se regasesc toate imaginile folosite in aplicatie;
layout (gura 3.4):
Figure 3.4: Fisierele din directorului layout
{ launcher.xml : este folosit de activitatea Launcher, iar in cadrul acestuia se insereaza
imaginea ce va asata la rulare;
44
Cristina Elena S ^ rbu Capitolul 3: Prezentarea aplicat iei
{ tab switch.xml : este folosit de activitatea Main, contine un TabHost pentru a putea
asate tab-urile si continutul lor;
{ tab indicator.xml : este folosit tot de activitatea Main, atribuie tab-urilor imaginea
corespunzatoare, contine TextView si un ImageView;
{ tab program.xml : este folosit de activitatea Program, contine un TextView, Edit-
Text si un ListView;
{ lines info.xml : este folosit de activitatea Program, reprezinta modul de asare a
ListView-ului din cadrul activitatii si este formata din TextView-uri;
{ tab map.xml : este folosit de activitatea Map, in acesta se va asa harta si un buton
pentru asarea statiilor;
{ tab rute.xml : este folosit de activitatea Rute, aici se regasesc 2 campuri AutoCom-
pleteTextView, doua ImageView-uri si un buton;
{ list item.xml : folosit de activitatea Rute, in cadrul acestuia se denesc anumite
caracteristici de asare pentru ecare element al listei ce va aparea in momentul
completarii unuia dintre AutoCompleteTextView-uri;
values (gura 3.5):
Figure 3.5: Fisierele din directorul values
{ color.xml : in cadrul acestui xml se regasesc denite toate culorile, utilizate pentru a
personaliza string-urile;
{ dimens.xml : aici se denesc dimensiunile standard ale marginilor ecranului;
{ strings.xml : in acest sier se denesc diferite string-uri pentru a putea folosite in
unul sau mai multe siere;
{ styles.xml : in acest xml se deneste tema aplicatiei.
45
Cristina Elena S ^ rbu Capitolul 3: Prezentarea aplicat iei
3.3 Prezentarea funct ional a
Prezentarea functionala presupune prezentarea modului de utilizare al aplicatiei dar si prezentarea
a ceea ce se intampla in momentul folosirii aplicatiei.
Atunci cand aplicatia este lansata in executie, activitatea Launcher va porni si va asa imaginea
de intampinare (gura 3.6). Activitatea contine un Handler ca se va ocupa de asarea acesteia
pentru o scurta perioada de timp, 2 secunde, iar apoi va apela activitatea Main.
1new Handler().postDelayed(new Runnable() {
2 @Override
3 public void run() {
4 Intent mainIntent = new Intent(Launcher.this, Main.class);
5 Launcher.this.startActivity(mainIntent);
6 Launcher.this.finish();
7 }
8 }, SPLASH_DISPLAY_LENGHT);
Figure 3.6: Launcher
Imediat dupa expirarea timpului alocat activitatii Launcher, va apelata activitatea Main ce
va crea cele trei tab-uri, iar primul tab ce va deschis va cel in care se aseaz harta (gura
3.7).
46
Cristina Elena S ^ rbu Capitolul 3: Prezentarea aplicat iei
Figure 3.7: Tab-ul Harta
In momentul in care aceasta se creeaza metode ce seteaza harta, metode ce determina lo-
catia si metode de geocodicare inversa sunt apelate. Pentru a crea harta se apeleaza metoda
setUpMapIfNeeded():
1private void setUpMapIfNeeded() {
2 //null check pentru a confirma faptul ca nu a fost instantiata o
3 // harta inainte
4 if (mMap == null) {
5 // incercare obtinere harta de la SupportMapFragment
6 mMap = ((SupportMapFragment) getSupportFragmentManager()
7 .findFragmentById(R.id.map)).getMap();
8 // verificare daca s-a obtinut harta
9 if (mMap != null) {
10 mMap.setMyLocationEnabled(true);
11 mMap.setOnMyLocationButtonClickListener(this);
12 }
13 }
14 }
Localizarea utilizatorului se realizeaza prin metoda
1@Override
2 public void onLocationChanged(Location location) {
3 // obtinere latitudinea si logitudinea locatiei curente
4 LatLng latLng = new LatLng(location.getLatitude(),
5 location.getLongitude());
6 placesApi = new PlacesAPI(this, latLng);// places
7 CameraPosition cameraPosition = new CameraPosition.Builder()
8 .target(latLng) // Seteaza centrul hartii
9 .zoom(17) // Seteaza zoom-ul la care va fi incarcata harta
10 .bearing(0) // Seteaza orientarea hartii catre est
47
Cristina Elena S ^ rbu Capitolul 3: Prezentarea aplicat iei
11 .tilt(25) // Seteaza inclinarea hartii la 20grade
12 .build(); // Creeaza o CameraPosition de la builder
13 mMap.animateCamera(CameraUpdateFactory
14 .newCameraPosition(cameraPosition));
15 }
Daca atunci cand activitatea este creata setarile de localizare sunt oprite va asat un mesaj
(gura 3.8) ce va oferi utilizatorului posibilitatea de a le porni.
Figure 3.8: Pornire GPS
Dupa ce GPS-ul este pornit, se va produce localizarea.
In cadrul acestei activitati se intalneste functionalitatea de asare a statiilor (gura 3.9)din
apropiere prin apasarea butonului din stanga jos.
Figure 3.9: Asarea statiilor
Pentru asarea si desenarea pe harta a marcatoarelor corespunzatoare ecarei statii se apeleaza
metoda:
48
Cristina Elena S ^ rbu Capitolul 3: Prezentarea aplicat iei
1@Override
2 public void onPlacesReceived(PlacesResult result) {
3 LatLngBounds.Builder lZoomBounds = new LatLngBounds.Builder();
4 if (result != null) {
5 for (BusStation busStation : result.getStationList()) {
6 LatLng loc = busStation.getLatLng();
7 mMap.addMarker(new MarkerOptions().position(loc)
8 .title(busStation.getName())
9 .snippet(busStation.getVicinity()));
10 lZoomBounds.include(loc);
11 }
12 }
13 mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(
14 lZoomBounds.build(), 17));
15 }
Daca se doreste a
area unei anumite adrese de pe harta, utilizatorul nu trebuie decat sa
plaseze un marcator in zona respectiva. Plasarea unui marcator se face printr-o simpla atingere
a hartii, iar titlul acestuia va asa adresa (gura 3.10).
Figure 3.10: Adresa unui marcator pus de utilizator
Prin selectarea butonului de localizare a
at in dreapta sus, marcatoarele existente pe harta se
vor sterge permitand o mai buna vizibilitate a locatiei curente.
In tab-ul Program lista cu programul autobuzelor este furnizata dintr-o baza de date ce se
creeaza si se populeaza cu date in momentul lansarii aplicatiei. Aceasta baza de date contine o
tabela numita "Bus" si are 5 campuri(id, Linie, Program, Detalii si Interval), se poate observa in
gura 3.11.
49
Cristina Elena S ^ rbu Capitolul 3: Prezentarea aplicat iei
Figure 3.11: Tabela bazei de date
Tab-ul Program ofera posibilitatea vizualizarii programului autobuzelor, si anume numele liniei,
intervalul in care acestea functioneaza atat in timpul saptamanii cat si in weekend, dar si ruta
ecarui autobuz (gura 3.12).
Figure 3.12: Program Autobuze
De asemenea permite cautarea dupa numele statiei (gura 3.13) sau dupa numele auto-
buzelor(gura 3.14). Iar daca un element din lista este selectat, un mesaj ce va asa intervalul
in care respectivul autobuz circula va aparea in partea de jos a ecranului.
Figure 3.13: Cautarea dupa numele statiei
Figure 3.14: Cautarea dupa numele autobuzului
50
Cristina Elena S ^ rbu Capitolul 3: Prezentarea aplicat iei
In tab-ul activitatii Rute intalnim posibilitatea de a introduce anumite adrese in urma carora
vor asate traseele corespunzatoare (gura 3.15).
Figure 3.15: Tab-ul Rute
Ca si la tab-ul corespunzator hartii, si aici intalnim acea noticare ce atentioneaza utilizatorul
in cazul in care serviciile de localizare nu sunt pornite (gura 3.16).
Figure 3.16: Atentionare pornire GPS
In momentul selectarii butonului "Pornii GPS" aplicatia va deschide setarile pentru serviciile
de localizare de unde utilizatorul le va putea porni. Metoda apelata pentru a porni setarile pentru
GPS este:
1// Metoda ce lanseaza setarile pentru pornirea servicilor de localizare
2 private void enableLocationSettings() {
3 Intent settingsIntent = new Intent(
4 Settings.ACTION_LOCATION_SOURCE_SETTINGS);
5 startActivity(settingsIntent);
6 }
51
Cristina Elena S ^ rbu Capitolul 3: Prezentarea aplicat iei
Pentru completarea primului camp se poate selecta checkbox-ul "Utilizeaz locatia curenta"
si acesta va completa automat campul cu locatia curenta (gura 3.17).
Figure 3.17: Selectarea checkbox-ului "Utilizeaza locatia curenta"
Daca checkbox-ul este deselectat continutul sau va sters ai serviciile de localizare oprite.
Localizarea si geocodicarea inversa a locatiei se realizeaza in metoda doInBackground(Location
…params) a clasei ReverseGeocodingTask, clasa ce apartine clasei Rute si mosteneste Async-
Task<Location, Void, Void >.
1 @Override
2 protected Void doInBackground(Location… params) {
3 Geocoder geocoder = new Geocoder(mContext, Locale.getDefault());
4
5 Location loc = params[0];
6 List<Address> addresses = null;
7 try {
8 addresses = geocoder.getFromLocation(loc.getLatitude(),
9 loc.getLongitude(), 1);
10 } catch (IOException e) {
11 e.printStackTrace();
12 }
13 if (addresses != null && addresses.size() > 0) {
14 Address address = addresses.get(0);
15 // Formatare prima linie a adresei(daca exista), oras si
16 // numele tarii.
17 String addressText = String.format(
18 "%s, %s, %s",
19 address.getMaxAddressLineIndex() > 0 ?
20 address.getAddressLine(0) : "",
21 address.getLocality(),
22 address.getCountryName());
52
Cristina Elena S ^ rbu Capitolul 3: Prezentarea aplicat iei
23 // Actualizare AutoCompleteTextView in UI
24 Message.obtain(mHandler, UPDATE_ADDRESS, addressText)
25 .sendToTarget();
26 }
27 return null;
28 }
Completarea campurilor in mod automat (gurile 3.18 si 3.19) se realizeaza cu ajutorul clasei
PlacesAutoCompleteAdapter, in continutul careia se realizeaza transferul de date dintre serverul
Google si aplicatie. Datele ind preluate cu ajutorul obiectelor de tip URL sau Json. Metoda
care realizeaza conexiunea si incarca rezultatele este:
1private ArrayList<String> autocomplete(String input) {
2 ArrayList<String> resultList = null;
3 HttpURLConnection conn = null;
4 StringBuilder jsonResults = new StringBuilder();
5 try {
6 StringBuilder sb = new StringBuilder( PLACES_API_BASE + TYPE_AUTOCOMPLETE
+ OUT_JSON);
7 sb.append("?sensor=false&key=" + API_KEY);
8 sb.append("&components=country:ro");
9 sb.append("&input=" + URLEncoder.encode(input, "utf8"));
10 URL url = new URL(sb.toString());
11 conn = (HttpURLConnection) url.openConnection();
12 InputStreamReader in = new InputStreamReader(conn.getInputStream());
13 // incarca rezultatele intr-un StringBuilder
14 int read;
15 char[] buff = new char[1024];
16 while ((read = in.read(buff)) != -1) {
17 jsonResults.append(buff, 0, read);
18 }
19 }catch (MalformedURLException e) {
20 Log.e(LOG_TAG, "Error processing Places API URL", e);
21 return resultList;
22 } catch (IOException e) {
23 Log.e(LOG_TAG, "Error connecting to Places API", e);
24 return resultList;
25 } finally {
26 if (conn != null) {
27 conn.disconnect();
28 }
29 }
30 try {
31 // creare obiect JSONObject din rezultate
53
Cristina Elena S ^ rbu Capitolul 3: Prezentarea aplicat iei
32 JSONObject jsonObj = new JSONObject(jsonResults.toString());
33 JSONArray predsJsonArray = jsonObj.getJSONArray("predictions");
34 // extragere descriere locaii din rezultate
35 resultList = new ArrayList<String>(predsJsonArray.length());
36 for (int i = 0; i < predsJsonArray.length(); i++) {
37 resultList.add(predsJsonArray.getJSONObject(i)
38 .getString("description"));
39 }
40 } catch (JSONException e) {
41 Log.e(LOG_TAG, "Cannot process JSON results", e);
42 }
43 return resultList;
44 }
Figure 3.18: Completare adresa de start
Figure 3.19: Adresa de start si destinatie com-
pletate
Prin actionarea butonului "Cauta" pe harta va asat un traseu de urmat pentru a ajunge
la destinatia dorita.
In nal, pentru a parasii aplicatia utilizatorul trebuie sa actioneze butonul "Back" al sistemului
iar un dialog de atentionare va aparea permitandu-i acestuia sa aleaga daca doreste sa paraseasca
aplicatia sau nu (gura 3.20), deoarece exista posibilitatea ca utilizatorul sa apese din greseala
butonul.
54
Cristina Elena S ^ rbu Capitolul 3: Prezentarea aplicat iei
Figure 3.20: Inchiderea aplicatiei
55
Capitolul 4
Concluzii
In urma dezvoltarii acestei aplicatii am inteles modul de functionare al sistemului de operare
Android. De asemenea, aceasta tema m-a ajutat sa inteleg modul corespunzator de dezvoltare
al unei aplicatii, precum si felul in care se lucreaza cu Google Maps.
Sistemul de operare Android ofera o serie de avanjate dezvoltatorilor si utilizatorilor:
Este open source: dezvoltatorilor li se permite accesul la orice parte din cod prin intermediul
Android Software Development Kit;
Documentatia: android ofera o documentatie foarte buna permitand dezvoltatorilor in-
telegerea mult mai rapida a conceptelor;
Este foarte
exibil: adapteaza in mod automat interfata pentru a arata cat mai bine pe
diferite dispozitive;
Este foarte
exibil: adapteaza in mod automat interfata pentru a arata cat mai bine pe
diferite dispozitive;
Magazinul Google Play: permite publicarea oricarei aplicatii, oricat de des si chiar permite
alegerea tipului de segment dorit;
Aplicatiile native nu obtureaza aplicatiile dezvoltate de terti, toate acestea ruleaza in mod
egal;
Utilizatorii au la dispozitie o multitudine de aplicatii, din diferite categorii.
Aplicatiile native nu obtureaza aplicatiile dezvoltate de terti, toate acestea ruleaza in mod
egal;
Utilizatorii au la dispozitie o multitudine de aplicatii, din diferite categorii.
Google Play Services ofera caracteristici ce pot atrage utilizatorii, datorita acestei librarii se
pot implementa Maps, Google+ si multe altele.
Google Maps ofera strategii si metode excelente de localizare, baza de date pusa la dispozitie
pentru dezvoltatori este foarte bine pusa la punct, facilitand obtinerea datelor.
56
Capitolul 5
Bibliograe
[1] Android Developers: http://developer.android.com/guide/index.html
[2] Android Software Development: http://en.wikipedia.org/wiki/Android_software_
development
[3] SQLite: http://www.sqlite.org/docs.html
[4] Google Maps: http://en.wikipedia.org/wiki/Google_Maps
[5] Google Maps Android: https://developers.google.com/maps/documentation/
android/start
[6] The Google Geocoding API: https://developers.google.com/maps/documentation/
geocoding/
[7] Google Places API: https://developers.google.com/places/documentation/index
[8] Reto Meier, Professional Android Application Development, Editura Wiley Publishing, Inc.,
Indianapolis, 2009
[9] J.F. DiMarzio, Android A Programmers Guide, Editura The Mc Graw Hill, 2008
57
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: Indrum ator stiint i c: [602113] (ID: 602113)
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.
