Jurnalul de Calatorie

PROIECT DE DIPLOMĂ

Sandu Adrian

COORDONATOR ȘTIINȚIFIC

Dr. Ing. Eugen Dumitrascu

Februarie 2016

CRAIOVA

Jurnal de calatorie

Sandu Adrian

COORDONATOR ȘTIINȚIFIC

Dr. Ing. Eugen Dumitrascu

Februarie 2016

CRAIOVA

DECLARAȚIE DE ORIGINALITATE

Subsemnatul [PRENUMELE ȘI NUMELE CANDIDATULUI], student la specializarea [DENUMIREA OFICIALĂ A SPECIALIZĂRII]din cadrul Facultății de Automatică, Calculatoare și Electronică a Universității din Craiova, certific prin prezenta că am luat la cunoștință de cele prezentate mai jos și că îmi asum, în acestcontext, originalitatea proiectului meu de licență:

cu titlul [TITLUL LUCRĂRII],

coordonată de [TITLUL ȘTIINȚIFIC, PRENUMELE ȘI NUMELE COORDONATORULUI],

prezentată în sesiunea [LUNA ȘI ANUL SESIUNII DE LICENȚĂ].

La elaborarea proiectului de licență, se consideră plagiat una dintre următoarele acțiuni:

reproducerea exactă a cuvintelor unui alt autor, dintr-o altă lucrare, în limba română sau prin traducere dintr-o altă limbă, dacă se omit ghilimele și referința precisă,

redarea cu alte cuvinte, reformularea prin cuvinte proprii sau rezumarea ideilor din alte lucrări, dacă nu se indică sursa bibliografică,

prezentarea unor date experimentale obținute sau a unor aplicații realizate de alți autori fărămenționarea corectă a acestor surse,

însușirea totală sau parțială a unei lucrări în care regulile de mai sus sunt respectate, dar care are alt autor.

Pentru evitarea acestor situații neplăcute se recomandă:

plasarea între ghilimele a citatelor directe și indicarea referinței într-o listă corespunzătoare la sfârșitul lucrării,

indicarea în text a reformulării unei idei, opinii sau teorii și corespunzător în lista de referințe a sursei originale de la care s-a făcut preluarea,

precizarea sursei de la care s-au preluat date experimentale, descrieri tehnice, figuri, imagini, statistici, tabele et caetera,

precizarea referințelor poate fi omisă dacă se folosesc informații sau teorii arhicunoscute, a căror paternitate este unanim cunoscută și acceptată.

Data, Semnătura candidatului,

PROIECTUL DE DIPLOMĂ

REFERATUL CONDUCĂTORULUI ȘTIINȚIFIC

În urma analizei lucrării candidatului au fost constatate următoarele:

În concluzie, se propune:

Data, Semnătura conducătorului științific,

REZUMATUL PROIECTULUI

În capitolul doi am specificat enunțul problemei, lista cu toate imaginile și tabelele folosite la elaborarea proiectului de diplomă.

În capitolul 3 am descris pregătirea mediului de lucru și sistemul de operare Android cu toate elementele care au fost folosite pentru dezvoltarea acestei aplicații.

În capitolul 4 am descris cum a fost implementată soluția, cercetarea făcută, crearea proiectului și implementarea codului.

În subcapitolul 4.3 sunt explicate funcționalitățile create și implementate în realizarea aplicației.

Termenii cheie: android, calatorie,fotografii calatorie, aplicație smartphone.

Cuprins

1 Introducere 10

1.1 Descrierea aplicatiei 10

1.2 Scopul aplicatiei 10

2 CerinȚele problemei Și specificaȚiile funcȚionale 11

2.1 Cerintele temei 11

2.2 Lista figurilor 11

2.3 Lista tabelelor 11

3 Mediul de dezvoltare si limbajul de programare folosit 12

3.1 Mediul de dezvoltare Eclipse pentru dezvoltarea aplicațiilor Android 12

3.2 Configurare mediu de lucru 13

3.3 Ce este Android? 17

3.3.1 Versiuni Android 17

3.3.2 Arhitectura Android 18

3.4 Activități, permisiuni, resurse și alte componente utilizate 19

3.4.1 Activități 19

3.4.2 Ciclul de viata al activitatilor 20

3.4.3 Fișierul Manifest 22

3.4.3.1 Permisiuni 23

3.4.4 Activarea componentelor 25

3.4.4.1 Începerea unei activități cu intent 25

3.4.4.2 Închiderea unei activități 26

3.4.5 Resursele aplicației 26

3.4.5.1 Accesarea resurselor in Cod 28

3.4.5.2 Tipurile resurselor 28

3.4.5.3 Atributele stilului de referire a resurselor 29

3.4.6 Interfața cu utilizatorul 30

3.4.6.1 Layout-uri 30

3.4.6.2 Scrierea în XML 30

List View 32

Controale de intrare 33

3.4.7 Event Listeners 33

3.4.8 Try & catch 34

3.4.9 Toasts 35

3.4.10 Threads 35

3.4.10.1 Worker threads 35

3.4.11 Librăria SQLite 36

3.4.11.1 Elementele limbajului SQL folosite pentru a crea baza de date a aplicației: 38

3.4.11.2 Tipuri de date utilizate: 39

3.4.12 Google Maps 39

3.4.13 Structura unui proiect android 40

4 Implementarea solutiei 42

4.1 Crearea proiectului 42

4.2 Obtinere API key pentru accesarea hartilor Google 44

4.2.1 Descarcarea Serviciilor Google play 44

4.2.2 Importarea Google Play Servicii in Eclipse 45

4.2.3 Obtinerea Google Maps API key 46

4.2.4 Importare librarie 47

4.2.5 Adaugarea Map key in fisierul manifest 48

4.3 Structura aplicatiei 49

4.3.1 Clasa MainActivity 49

4.3.2 Clasa SQLiteAdapter 52

4.3.3 Clasa MapActivity 56

4.3.4 Clasa ViewRoutes 60

5 Concluzii 64

6 Bibliografie 65

7 Referinte web 66

8 Anexe 67

Introducere

Descrierea aplicatiei

Aplicatia JurnalCalatorie ofera o noua posibilitate utiliazorilor de a salva toate informatiile unui traseu efectuat si vizualizarea lor dupa o anumita perioada de timp. Aplicatia se imparte in doua module :

Traseu : modul in care se salveaza datele traseului cum ar fi : popasuri efectuate,poze facute in diferite locuri

Vizualizare rute efectuate : vizualizarea rutelor efectuate si terminate;

1.2 Scopul aplicatiei

Scopul principal al aplicatiei este de a salva si de a accesa rapid informatiile unui traseu efectuat de catre utilizator. Informatiile salvate sunt locatia si pozele facute pe traseu. Aplicatia ofera de asemenea posibilitatea vizualizarii pozelor salvate pe diferite rute efectuate de catre utilizator.

CerinȚele problemei Și specificaȚiile funcȚionale

Cerintele temei

Lista figurilor

Figure 1 – Deschidere "Variabile de mediu" 14

Figure 2 – Creare variabila de mediu 15

Figure 3 – Introducere numele si calea variabilei de mediu 15

Figure 4 – Selectare pachete SDK pentru instalare 16

Figure 5 – Add new repository 16

Figure 6 – Selectare “Developer Tools” 17

Figure 7 – Selectare director SDK 17

Figure 8 – Arhitectura Android 19

Figure 9 – Ciclul de viata al unei activitati 23

Figure 10 – Creare proiect nou 43

Figure 11 – Setare icoana proiect 44

Figure 12 – Setare tip activitate proiect 44

Figure 13 – Instalare Google Play Services SDK 46

Figure 14 – Importare Google Play services in proiect 47

Figure 15 – Obtinere cheie harti Google – pasul 1 47

Figure 16 – Obtinere cheie harti Google – pas 2: Creare cheie noua pentru Android 48

Figure 17 – Importare librarie "google services" in proiect 48

Figure 18 – Importare librarie "google services" in proiect – pas 2 49

Lista tabelelor

Table 1 – Versiuni Android 19

Table 2 – Tipuri de resurse Android 29

Table 3 – Controale folosite 34

Mediul de dezvoltare si limbajul de programare folosit

Mediul de dezvoltare Eclipse pentru dezvoltarea aplicațiilor Android

Dezvoltarea de software Android este procesul prin care noi aplicații sunt create pentru sistemul de operare Android. Aplicațiile sunt de obicei dezvoltate în limbajul de programare Java, folosind Kitul Android de dezvoltare software (SDK), dar și alte medii de dezvoltare sunt de asemenea disponibile.

Obstacole în calea dezvoltării includ faptul că Android nu utilizează standarde Java stabilite, acestea sunt Java SE și ME. Acest lucru previne compatibilitatea între aplicații Java scrise pentru acele platforme și cele scrise pentru platforma Android. Android reutilizează doar sintaxa limbajului Java și semantica, dar nu oferă bibliotecile de clasă și API-urile complete la pachet cu Java SE sau ME.

Aplicațiile Android în programare Java au limbaj scris. Instrumentele Android SDK compilează codul, împreună cu timpul și resursele din toate fișierele-în anul APK: un pachet Android, care este fișierul anului arhivă cu anul sufix apk. Un fișier APK conține tot conținutul anului, este aplicația Android și dosarul cu dispozitivele Android folosite pentru a instala aplicația.

Sistemul Android pune în aplicare principiul „least privilege”. Acesta înseamnă că, fiecare aplicație, în mod implicit, are acces numai la componentele de care are nevoie pentru a face munca și nu la mai multe. Acest lucru creează un mediu foarte sigur, în care o aplicație nu poate accesa părți ale sistemului pentru care nu este dată permisiunea.

Cu toate acestea, există modalități pentru o aplicație de a face schimb de date cu alte aplicații și pentru o aplicație de a accesa serviciile de sistem:
Este posibil de a asigura pentru două aplicații să împărtășească același ID de utilizator Linux, caz în care acestea pot accesa fișierele reciproc.

Pentru conservarea resurselor de sistem, aplicații cu același ID de utilizator pot aranja, de asemenea, să ruleze în același proces Linux și împărtășesc același VM (aplicațiile trebuie de asemenea semnate cu același certificat).
          O aplicație poate solicita permisiunea de a accesa datele de pe dispozitiv, cum ar fi contactele utilizatorului, mesaje SMS, depozitul montabil (card SD), camera, Bluetooth, și mai multe. Toate permisiunile aplicației trebuie să fie acordate de către utilizator la instalare.
Componentele aplicației sunt elementele constitutive esențiale ale unei aplicații Android.

Fiecare componentă este un alt punct prin care sistemul poate intra în aplicație. Nu toate componentele sunt puncte de intrare reale pentru utilizator, iar unele depind unele de altele, dar fiecare există ca entitate proprie și joacă un rol specific – fiecare este un bloc unic, care ajută la definirea comportamentului general al aplicației.

Configurare mediu de lucru

Pentru a fi posibila dezvoltarea aplicatiilo in IDE-ul Eclipse trebuie configurate mai intai cateva setari.

Se descarca si se instaleaza JDK(Java Development Kit);

Se descarca si se instaleaza Eclipse IDE;

Se creeaza o variabila de system Java urmand urmatorii pasi : My Computer -> “Properties” -> “Advanced System Settings” dupa care se cuntinua cu ca in imaginile de mai jos:

Se face click pe “Environment Variables”

Figure 1 – Deschidere "Variabile de mediu"

Se apasă butonul “New”

Figure 2 – Creare variabila de mediu

Se introduce numele “JDK_HOME” și locația în care este instalat kitul JDK, în cazul de față “C:\Program Files\Java\jdk1.8.0_25\”

Figure 3 – Introducere numele si calea variabilei de mediu

Descărcarea și instalarea Android SDK;

Utilizând Android SDK Manager s-au descărcat componentele care includ instrumente de dezvoltare, documentația, platforme Android, librării externe, driver-ul USB pentru Windows și exemple de aplicații:

Figure 4 – Selectare pachete SDK pentru instalare

Instalare ADT(Android Development Toolkit) Pluginpentru Eclipse:

Click “ Help” -> “Instal new software” din meniul aplicației Eclipse

Click “Add”

În formularul “Add Repository” se introduce numele ADT Plugin și pentru “Location” se completează cu adresa următoare:https://dl-ssl.google.com/android/eclipse/

Figure 5 – Add new repository

În fereastra de dialog Available Softwarese selectează checkbox-ul de lângă Developer Tools

Figure 6 – Selectare “Developer Tools”

Click “Next” și apoi “Finish”

Repornire Eclipse;

Configurare plugin-ul ADT pentru Eclipse:

Se deschide meniul Preferences prin selectarea “Window” -> “Preferences”

Selectarea categoriei “Android” din meniul din stânga

Click “Browse” și selectarea directorului unde a fost instalat Android SDK

Click Apply

Figure 7 – Selectare director SDK

Ce este Android?

Android este un sistem de operare pentru dispozitive si telefoane mobile bazat pe nucleul Linux(pentru componentele hardware si managementul proceselor) si biblioteci Java dezvoltate de Google(biblioteci audio/video,de telefonie,conectivitate,grafica,interfata utilizato,etc) Este un produs open-source dezvoltat de Google pentru a transforma telefoanele mobile in puternice masini de calcul iar motorul android permite utiliatorilor sa creeze aplicatii cu ajutorul limbajului Java.

Motorul Android este reprezentat în primul rând de un set de biblioteci care permit utilizatorilor să dezvolte aplicații Android folosind limbajul de programare Java. Aceste biblioteci oferă acces la diferite funcții ale telefonului mobil: Video/Audio,Conectivitate,Mesagerie,Apel, Locație,etc.

Cu ajutorul Android se pot dezvolta:

Aplicații care pot accesa Bluetooth,3G,WiFi,Camera,GPS,accelerometru

Aplicații pentru stocarea datelor cu ajutorul librăriei SQLite

Aplicații care includ suport media pentru redarea imaginilor sau videoclipurilor în diferite formate: AMR , MP3, MPEG4, H.264, AAC, PNG, JPG, GIF

Aplicații Android Beam – o tehnologie bazată pe NFC careprin apropierea dispozitivelor mobile permite utilizatorilor să partajeze conținut instant

Aplicații multi-touch : suportă ecrane cu posibilitate de contact în mai multe puncte concomitant.

Versiuni Android

Table 1 – Versiuni Android

Arhitectura Android

Figure 8 – Arhitectura Android

Aplicatii:

Acasa

Contacte

Telefon

Browser,etc

Framework Aplicatii:

Manager activitati

Manager de telefonie

Manager de resurse

Manager locatie

Manager de notificari

Furnizor de date

Vizualizare sistem

Librarii:

SQLite

WebKit

Libc

SSL

SGL

Open GL

FreeType

Framework Media

Linux Kernel:

Driver de display

Driver de camera

Driver audio

Driver WiFi

Driver tastatura

Driver memorie flash

Driver IPC

Managementul tensiunii.

Activități, permisiuni, resurse și alte componente utilizate

Activități

O activitate reprezintă un singur ecran cu o interfață de utilizator. O activitate este implementată ca o subclasă a activității.
Pentru a crea o activitate, trebuie să creați o subclasă de activitate (sau o subclasă existentă a ei). În subclasă, trebuie implementate metode de apel invers pe care sistemul le apelează atunci când tranziția de activitate între diferite stadii ale ciclului de viață, cum ar fi atunci când activitatea este creată, s-a oprit, a fost reluată sau distrusă.
Cea mai importantă metodă este onCreate ();

Trebuie să punem în aplicare această metodă. Sistemul solicită acest lucru atunci când creează activitatea. În cadrul punerii în aplicare, trebuie să inițializăm componentele esențiale ale activității. Cel mai important, aceasta este etapa în care trebuie să se solicite setContentView () pentru a defini aspectul activității pentru interfața cu utilizatorul.

Ciclul de viata al activitatilor

Fiecare activitate are propriul său ciclu de viață, independent de ciclul de viață al procesului asociat aplicației. O activitate are un ciclu de viață complex, deoarece aplicațiile pot avea activități multiple și doar una este în prim-plan; utilizând managerul de activități, sistemul Android gestionează o stivă de activități care se găsesc în diferite stări (pornire, în execuție, întreruptă, oprită, distrusă);

Activitatea este una dintre cele mai importante componente (alături de servicii și broadcast receivers) ale unei aplicații Android, deoarece este strâns legată de interfața cu utilizatorul. O activitate este utilizată pentru a gestiona interfața cu utilizatorul și este echivalentă cu fereastra sau formularul din aplicațiile desktop.

Înțelegerea modului în care se controlează activitatea permite să:

utilizați ciclul de viață al activității pentru a crea, vizualiza, utiliza și a opri activitățile;

salvați datele utilizatorului înainte ca activitatea să fie oprită și le restaurați atunci când activitatea este readusă în prim-plan;

creați aplicații cu mai multe formulare sau activități;

Ciclul de viață al unei activități descrie starea în care o activitate poate fi la un moment dat.

onCreate(Bundle) – apelată când activitatea este creată; folosind argumentul metodei de tip Bundleexistă posibilitatea să restabiliți starea activității, care a fost salvată într-o sesiune anterioară; după ce activitatea a fost creată, va fi pornită (onStart());

onStart() – apelată în cazul în care activitatea urmează să fie afișată; din acest punct, activitatea poate veni în prim-plan (onResume()) sau rămâne ascunsă în fundal (onStop());

onRestoreInstanceState(Bundle) – apelată în cazul în care activitatea este inițializată cu datele dintr-o stare anterioară, ce a fost salvată; în mod implicit, sistemul restaurează starea interfeței cu utilizatorul (starea controalelor vizuale, poziția cursorului, etc);

onResume() – apelată când activitatea este vizibilă, iar utilizatorul poate interacționa cu aceasta; din această stare, activitatea poate fi plasată în fundal, devenind întreruptă (onPause());

onRestart() – apelată în cazul în care activitatea revine în prim-plan dintr-o stare oprită (stopped); după aceasta, activitatea este pornită (onStart()) din nou;

onPause() – apelată atunci când sistemul aduce în prim-plan o altă activitate; activitatea curentă este mutată în fundal și mai târziu poate fi oprită (onStop()) sau repornită și afișată (onResume()); acesta este un moment bun pentru a salva datele aplicației într-un mediu de stocare persistent (fișiere, baze de date), deoarece după această fază activitatea poate fi terminată și distrusă fără a se anunța acest lucru.

onSaveInstanceState(Bundle) – apelată pentru a salva starea curentă a activității; în mod implicit, sistemul salvează starea interfeței cu utilizatorul;

onStop() – apelată în cazul în care activitatea nu mai este utilizată și nu mai este vizibilă, deoarece o altă activitate interacționează cu utilizatorul; din acest punct, activitatea poate fi repornită (onRestart()) sau distrusă (onDestroy());

onDestroy() – apelată în cazul în care activitatea este distrusă, iar memoria sa eliberată; acest lucru se poate întâmpla în cazul în care sistemul necesită mai multă memorie sau dacă programatorul termină explicit activitatea apelând metoda finish() din clasa Activity;

Figure 9 – Ciclul de viata al unei activitati

Fișierul Manifest

Înainte ca sistemul Android să poată începe o componentă a aplicației, sistemul trebuie să știe că există componenta prin citirea fișierului AndroidManifest.xml al aplicației (fișierul "manifest").

Toate componentele trebuie să fie declarate în acest fișier, care trebuie să fie la originea directorului de proiect al aplicației.

Manifestul face o serie de lucruri în plus față de declararea componentelor aplicației, cum ar fi:

Declararea nivelului API minim cerut de aplicație, pe baza căror API-uri folosește aplicația.

Declararea caracteristicilor hardware și software utilizate sau impuse de aplicație, cum ar fi camera, servicii Bluetooth sau un ecran multitouch.

Identifică orice permisiuni ale utilizatorului pe care aplicația le solicită, cum ar fi accesul la internet sau accesul de a citi contactele utilizatorului.

Biblioteci API necesare aplicației să fie legate de (altele decât Android cadru API), cum ar fi biblioteca Google Maps.

Permisiuni

O permisiune este o restricție de limitare la acces la o parte din cod sau la datele de pe dispozitiv. Limitarea este impusă pentru a proteja datele critice și codul care ar putea fi utilizat în mod abuziv pentru a denatura sau deteriora experiența utilizatorului.

Toate elementele care pot apărea în fișierul manifest sunt prezentate mai jos în ordine alfabetică. Acestea sunt singurele elemente legale; nu puteți adăuga propriile elemente sau atribute.

<action>

<activity>

<activity-alias>

<application>

<category>

<data>

<grant-uri-permission>

<instrumentation>

<intent-filter>

<manifest>

<meta-data>

<permission>

<permission-group>

<permission-tree>

<provider>

<receiver>

<service>

<supports-screens>

<uses-configuration>

<uses-feature>

<uses-library>

<uses-permission>

<uses-sdk>

Permisiuni utilizate:

<uses-sdk

android:minSdkVersion="8"

android:targetSdkVersion="22"/>

minSdkVersion = Un număr întreg care desemnează nivelul minim API necesar pentru aplicație pentru a rula. Sistemul Android va preveni utilizatorul de la instalarea aplicației dacă nivelul API al sistemului este mai mic decât valoarea specificată în acest atribut.

targetSdkVersion = Un număr întreg care desemnează nivelul API vizat de aplicație.

<uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE"/>

Permite aplicației să citească din stocarea externă sau în memoria telefonului

<uses-permissionandroid:name="android.permission.INTERNET"/>

Permite aplicației să utilizeze internetul

<uses permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

Permite aplicației să scrie date în stocarea externă sau în memoria telefonului

<activity

android:name=".MainActivity"

<intent-filter>

<actionandroid:name="android.intent.action.MAIN"/>

<categoryandroid:name="android.intent.category.LAUNCHER"/>

</intent-filter>

</activity>

Un filtru intenție care declară că activitatea răspunde la acțiunea "principală" ar trebui să fie plasat în categoria "lansator". Filtrul intenție arată astfel:
Elementul <acțiune> specifică faptul că acesta este punctul de intrare "principal" în aplicație. Elementul <categorie> specifică faptul că această activitate ar trebui să fie enumerată în lansatorul de aplicație al sistemului (pentru a permite utilizatorilor să lanseze această activitate).
În elementul <activitate>, Android: numele atributului specifică numele clasei complet calificat al subclasei Activity.

Pentru ca o activitate să fie accesibilă sistemului, activitatea trebuie să fie declarată. Activitățile sunt declarate astfel:

<activity

android:name=".RegisterActivity">

</activity>

<activity

android:name=".EditProfileActivity">

</activity>

Activarea componentelor

O intenție este creată cu un obiect ‚,Intent’’, care definește un mesaj pentru a activa fie o anumită componentă sau un anumit tip de componentă – o intenție poate fi explicită sau implicită.
Pentru activități și servicii, o intenție definește acțiunea de a efectua (de exemplu, la "vedere" sau "trimite" ceva).

De regulă, o intenție poate fi utilizată pentru:

a invoca activități din cadrul aceleiași aplicații Android;

a invoca alte activități, existente în contextul altor aplicații Android;

a transmite mesaje cu difuzare (eng. broadcast messages), care sunt propagate la nivelul întregului sistem de operare Android și pe care unele aplicații Android le pot prelucra, prin definirea unor clase ascultător specifice; un astfel de comportament este util pentru a implementa aplicații bazate pe evenimente.

Invocarea altor activitati este de fapt actiunea de activare a acelei activitati. Din acel moment activitatea nou pornita isi incepe ciclul de viata.

Începerea unei activități cu intent

O activitate poate începe o altă activitate apelând startActivity (), apoi trece la Intent care descrie activitatea pe care doriți să o începeți. Intenția specifică fie activitatea exactă pe care doriți să o începeți sau descrie tipul de acțiune pe care doriți să îl efectuați (și sistemul selectează activitatea potrivită pentru tine).

Exemplu: Start RegisterActivity din MainActivity

Intent myIntent = newIntent(MainActivity.this,

RegisterActivity.class);

startActivity(myIntent);

Închiderea unei activități

Puteți închide o activitate prin apelarea metodei sale finish(). De asemenea, puteți închide o activitate separată pe care ați început-o anterior apelând finishActivity().

Resursele aplicației

O aplicație Android este compusă din mai mult decât doar din cod – se necesită resurse care sunt separate de codul sursă, cum ar fi imagini, fișiere audio, și orice referitor la prezentarea vizuală a aplicației. Utilizarea resurselor aplicației face ușoară actualizarea diverselor caracteristici ale aplicației, fără a modifica codul și – prin furnizarea de seturi de resurse alternative – vă permite să optimizați aplicația pentru o varietate de configurații de dispozitive (cum ar fi diferite limbi și dimensiuni de ecran).
Pentru fiecare resursă în proiectul aplicației, instrumentele SDK definesc un ID unic întreg, care este folosit pentru a face referire la resursa din codul aplicaței sau din alte resurse definite în XML. De exemplu, fișierul de imagine numit background.png (salvat în res/drawable/directory), instrumentele SDK generează un ID de resurse numit R.drawable.background, care este folosit pentru a face referire la imagine și îl introduceți în interfața cu utilizatorul.

Directoare de resurse susținute în interiorul project res /directory ..

Table 2 – Tipuri de resurse Android

Accesarea resurselor in Cod

Resursele sunt accesate in cod prin ID-ul lor.
Exemplu:

Button Login = (Button) findViewById(R.id.btnLogin);

Button Exit = (Button) findViewById(R.id.btnExit);

EditText cnp = (EditText) findViewById(R.id.editCNP);

Tipurile resurselor

Fiecare dintre documentele din această secțiune descriu utilizarea, formatul și sintaxa pentru un anumit tip de resursă a aplicației care vă sunt furnizate în directorul de resurse (res /).

Color State List Resource : Definește o culoare de resurse care se schimbă în funcție de starea View.
Salvate în res / color / și accesate din clasa R.color.

Drawable Resources: Definesc diferite grafice cu bitmap sau XML.
Salvate în res / drawable / și accesate din clasa R.drawable.
Layout Resource: Definește aspectul pentru UI-ul aplicației.
Salvate în res/layout/ și accesate din clasa R.layout.
Menu Resource: Definește conținutul meniurilor aplicației.
Salvate în res / menu / și accesate din clasa R.menu.
String Resources: Definesc șiruri de caractere, tablouri string, și plural (și includ formatare șir și styling). Salvate în res / values / și accesate din clasele R.string, R.array, și R.plurals.
Style Resource: Definește aspectul și formatul pentru elementele UI.
Salvate în res / values / și accesate din clasa R.style.
Mai multe tipuri de resurse: Definesc valori, cum ar fi booleans, numere întregi, dimensiuni, culori și alte matrice.
Salvate în res / values / dar fiecare accesat de R sub-clase unice (cum ar fi R.bool, R.integer, R.dimen, etc.).

Atributele stilului de referire a resurselor

O resursă atribut de stil vă permite să faceți referință la valoarea unui atribut în tema aplicată în prezent. Referind un atribut de stil vă permite să personalizați aspectul elementelor UI stilizându-le pentru a se potrivi variațiilor standard, furnizate de tema actuală, în loc de a furniza o valoare hard-coded. Referind un atribut de stil spune în esență, "utilizează stilul care este definit de acest atribut, în tema curentă."

<EditText

android:id="@+id/editCNP" – component id

android:layout_width="wrap_content" – component width

android:layout_height="wrap_content" – component height

android:layout_alignLeft="@+id/linearLayout1"

android:layout_below="@+id/txtCNP"

android:layout_marginLeft="20dp" – distance from left

android:layout_marginTop="5dp" – distance from top

android:background="@drawable/edit_textfocused" – component background

android:gravity="center_horizontal"/>

Componenta background "edit_textfocused" este un fișier XML care specifică ce componentă din directorul drawable este folosită pentru acest fundal edittext.

Interfața cu utilizatorul

Layout-uri

Un layout definește structura vizuală pentru o interfață de utilizator, cum ar fi interfața pentru o activitate sau o aplicație widget. Puteți declara un layout în două moduri:

• Declararea de elemente UI în XML. Android oferă un vocabular XML simplu care corespunde claselor View și subclaselor, cum ar fi cele pentru widget-uri și layout-uri

• Elemente de layout instantiate în timpul rulării. Aplicația poate crea obiecte View și ViewGroup (și manipula proprietățile lor) în mod programatic.

Tipuri de layout-uri:

LinearLayout – Este unul dintre layout-urile fundamentale în Android. După cum indică și numele, are un aspect linear și așează copiii săi întru-un grup care are o singură direcție,vertical sau orizontal.

RelativeLayout – Folosind acest layout copiii pot fi așezați cu referire la frați(la stânga,la dreapta,sub sau deasupra) sau la părinte(centrat orizontal,centrat vertical,ambele sau aliniat la oricare dintre margini).

GridLayout – Grid Layout este un aspect Android care plasează copiii săi într-o grilă dreptunghiulară. GridLayout folosește o rețea de linii de infinit-subțiri pentru a separa zona sa de desen in: rânduri, coloane și celule.

ListView – ListView este un grup de vedere care afișează o listă de elemente derulant. Elementele din listă sunt inserate automat în lista folosind un adaptor,încarcă conținutul de la o sursă, cum ar fi o interogare în baza de date sau valori hardcodate.

Scrierea în XML

Folosind vocabularul XML al Androidului a fost creat designul, layoutul UI și elementele de ecran pe care le conțin, în același mod în care se creează pagini web în HTML – cu o serie de elemente imbricate.
Fiecare fișier layout trebuie să conțină exact un element rădăcină, care trebuie să fie un obiect View sau ViewGroup. Odată ce elementul rădăcină este definit, obiecte layout adiționale sau widget-uri ca elemente copil pentru a construi treptat o ierarhie View care definește layoutul pot fi adăugate.
De exemplu, layoutul XML pentru fereastra principală care conține buton, TextView și EditText. Layout-ul XML este un tip RelativeLayout:

<?xmlversion="1.0"encoding="utf-8"?>

<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:background="@drawable/background"

android:gravity="center_horizontal"

android:orientation="vertical"

tools:context=".MainActivity">

<TextView

android:id="@+id/txtCNP"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignLeft="@+id/linearLayout1"

android:layout_below="@+id/linearLayout1"

android:layout_marginLeft="80dp"

android:layout_marginTop="30dp"

android:text="Enter CNP :"

android:textSize="20sp"

android:textStyle="bold"/>

<EditText

android:id="@+id/editCNP"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignLeft="@+id/linearLayout1"

android:layout_below="@+id/txtCNP"

android:layout_marginLeft="20dp"

android:layout_marginTop="5dp"

android:background="@drawable/edit_textfocused"

android:gravity="center_horizontal"/>

……..

<Button

android:id="@+id/btnSetari"

android:layout_width="120dp"

android:layout_height="50dp"

android:layout_alignParentBottom="true"

android:layout_marginBottom="10dp"

android:background="@drawable/setaripressed"/>

…….

</RelativeLayout>

Parametrii Layout

Atributele layout-ului XML numite layout_something definesc parametrii de layout pentru View care sunt adecvate pentru ViewGroup-ul în care se află.

Fiecare clasă ViewGroup implementează o clasă de imbricate care extinde ViewGroup.LayoutParams. Această clasă conține tipurile de proprietate care definesc dimensiunea și poziția pentru fiecare vizualizare copil, în funcție de grupa de vedere.

List View
ListView este un grup de vedere care afișează o listă de elemente derulante. Elementele din listă sunt inserate automat în listă folosind un adaptor care trage conținut de la o sursă, cum ar fi o interogare a bazei de date matrice sau convertește fiecare element rezultat într-o vizualizare care este plasată în listă.
Exemplu:

<ListView

android:id="@android:id/list"

android:layout_width="match_parent"

android:layout_height="wrap_content"/>

Exemplu de adaptor:

ArrayAdapter adapter = new ArrayAdapter(this,

android.R.layout.simple_list_item_2, android.R.id.text1, values);

setListAdapter(adapter);

Controale de intrare
Controalele intrărilor sunt componentele interactive în interfața cu utilizatorul a aplicației. Android oferă o mare varietate de controale care le puteți utiliza în UI, cum ar fi butoane, câmpuri text, bare de căutare, checkbox, butoane de zoom, butoane de comutare și multe altele.
Controale comune
Iată o listă a unor controale comune utilizate în aplicație.

Table 3 – Controale folosite

Event Listeners

Un event listener este o interfață în clasa View care conține o singură metodă de apel invers. Aceste metode vor fi chemate de cadrul Android, atunci când View-ul în care a fost înregistrat ascultătorul este declanșat de interacțiunea cu utilizatorul cu elementul din UI.
Incluse în interfețele event listener sunt următoarele metode de apel invers:
onClick ()
Din View.OnClickListener. Aceasta se numește atunci când utilizatorul atinge fie elementul (în modul tactil) sau se concentrează pe elementul cu cheile de navigație sau trackball și apasă cheia adecvată "Enter" sau apasă în jos pe trackball.

Exemplu:

Routes.setOnClickListener(new OnClickListener() {

@Override

publicvoid onClick(View v) {

Intent myIntent = new Intent(Main_Admin.this,

Route.class);

startActivity(myIntent);

}

});

Try & catch

Primul pas în construirea unei excepții handler este să anexați codul care ar putea arunca o excepție într-un bloc try.
În general, un bloc try arată astfel:

try {

code

}

Catch(Exception)

{

throw;

}

Segmentul în exemplul codului marcat conține una sau mai multe linii drepte de cod care ar putea arunca o excepție. Dacă o excepție are loc în blocul try, această excepție este manipulată de către o excepție handler asociată cu aceasta. Pentru a asocia o excepție handler cu un bloc try, trebuie să pui un bloc catch după el.

Fiecare bloc catch este o excepție handler care se ocupa de tipul de excepție indicată prin argumentul său. Tipul de argument, ExceptionType, declară tipul de excepție de care handler se poate ocupa și trebuie să fie numele unei clase care moștenește de la clasa Throwable. Handler se poate referi la excepție cu numele.

Blocul catch conține cod care se execută dacă și atunci când excepția handler este invocată.

În aplicația de eLearning toate operațiile sunt executate într-un bloc try și dacă există o eroare sau o excepție, un mesaj Toast este afișat pentru utilizator.

Toasts

Un toast oferă feedback simplu despre o operațiune într-un pop-up mic. Se umple doar cantitatea de spațiu necesar pentru mesaj și activitatea curentă rămâne vizibilă și interactivă. Toasts dispar automat după un timeout.
În primul rând, instanțiati un obiect Toast cu una dintre metodele makeText (). Această metodă are trei parametri: cadrul de aplicare, mesajul text, precum și durata Toastului. Returnează un obiect Toast inițializat corect. Puteți afișa notificarea Toast cu show(), așa cum se arată în exemplul următor:

Toast.makeText(ShowUsers.this,"Eroare ",Toast.LENGTH_LONG).show();

Threads

Când este lansată o aplicație, sistemul creează un fir de execuție pentru aplicație, numit "principal". Acest fir este foarte important pentru că este responsabil de expedierea evenimentelor la widget-uri adecvate de interfață cu utilizatorul, inclusiv drawing events. De asemenea, este firul in care aplicația dvs. interacționează cu componente din setul de instrumente Android UI (componente din pachetele android.widget și android.view). Ca atare, firul principal este, de asemenea, uneori numit firul UI.
Sistemul nu creează un fir separat pentru fiecare instanță a unei componente. Toate componentele care se execută în același proces sunt instanțiate în firul UI și sistemul apelează fiecare componentă care este expediată de la acel fir.
În plus, setul de instrumente Andoid UI nu este thread-safe. Deci, UI este manipulat de la un fir lucrător -toate manipulările interfeței de utilizator trebuie să se facă de la firul UI. Astfel, există pur și simplu două reguli pentru modelul Android cu un singur fir:
1. Nu blocați firul UI
2. Nu accesa setul de instrumente Android UI din afara firului UI

Worker threads

Datorită modelului cu un singur fir descris mai sus, este vital pentru reacția aplicației UI de a nu bloca operațiunile firului UI.Operațiile care nu sunt instantanee sunt efectuate în fire separate ("fond" sau fire "lucrător").

La început, acest lucru pare să funcționeze bine, deoarece creează un nou fir să se ocupe de funcționarea rețelei. Cu toate acestea, aceasta încalcă a doua regulă a modelului cu un singur fir: nu accesați setul de instrumente Android UI din afara firului UI.
Pentru a rezolva această problemă, Android oferă mai multe modalități de a accesa firul UI din alte fire. O metodă care este utilizată în aplicație este:

Librăria SQLite

SQLite este o bază de date open source. SQLite sprijină caracteristici standard, cum ar fi baze de date relaționale ca sintaxa SQL, tranzacțiile și declarațiile întocmite. Baza de date necesită memorie limitată în timpul rulării (aprox. 250 KByte), care-l face un candidat bun de a fi încorporat în alte durate de funcționare.
SQLite susține tipuri de date TEXT(similar cu String în Java), INTEGER (similar cu long în Java) și REAL (similar cu double în Java). Toate celelalte tipuri trebuie să fie transformate într-unul dintre aceste domenii înainte de a se salva în baza de date. SQLite în sine nu validează dacă tipurile scrise la coloane sunt de fapt de tipul celui definit, de ex. puteți scrie un număr întreg într-o coloană string și vice-versa.

Spre deosebire de multe alte sisteme de management de baze de date, SQLite nu este un motor de baze de date client-server ci este un motor de baze de date SQL încorporat. Baza de date creată cu ajutorul librariei SQLite poate conține tabele,view-uri, trigere sau indici și este scrisă direct într-un fișier disc. Formatul fișierului bazei de date este cross-platform, adică există posibilitatea copierii bazei de date între sisteme pe 32 și pe 64 biți și pot fi liber partajate între mașini cu ordine diferită de octeți.

SQLiteOpenHelper este o clasă care ajută la crearea și actualizarea informațiilor din baza de date. Pentru a avea acces la aceste operațiuni trebuie creată o subclasă a clasei SQLiteOpenHelper în care se vor implementa metodele onCreate() și onUpgrade() în interiorul cărora se execută query-ul de creare al bazei de date și al tabelelor prin sintaxa execSQL(query-ul de creare)respectiv de update.

SQLiteDatabase este clasa ce permite manipularea datelor din baza de date prin metode ca insert(), delete(), update() . O altă metodă este execSQL() care permite execuția directă a unei instrucțiuni SQL.

Content Values este un obiect în care poți defini și seta chei și valori. Cheia obiectului Content Values reprezintă un identificator al unei coloane din table, iar valoarea este informația stocată în baza de date în acea coloană. Acest obiect se folosește atât pentru update-uri, cât și pentru inserări în baza de date. Pentru selectarea informațiilor se folosește un cursor.
SQLite este încorporat în fiecare dispozitiv Android. Folosind o bază de date SQLite în Android nu are nevoie de o procedură de configurare sau administrare a bazei de date.
Pentru a crea și actualiza o bază de date în aplicație a fost creată o subclasă a clasei SQLiteOpenHelper.

publicclass SQLiteHelper extendsSQLiteOpenHelper {

}

In constructorul subclasei se numește metoda super () a SQLiteOpenHelper, specificând numele bazei de date si versiunea curenta a bazei de date.

public SQLiteHelper(Context context, String name,

CursorFactory factory, int version) {

super(context, name, factory, version);

}

În această clasă metoda următoare este anulată pentru a crea baza de date.

onCreate() – este apelat de cadru, dacă baza de date este accesată, dar nu este încă creată.

Clasa SQLiteOpenHelper oferă metodele getReadableDatabase () și getWriteableDatabase ()pentru a avea acces la un obiect SQLiteDatabase; fie în modul citit sau scris.
Aceste metode sunt numite in openToRead () și metodele openToWrite din clasa SQLiteAdapter:

public SQLiteAdapter openToRead() throws android.database.SQLException {

sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null,

MYDATABASE_VERSION);

sqLiteDatabase = sqLiteHelper.getReadableDatabase();

returnthis;

}

public SQLiteAdapter openToWrite() throws android.database.SQLException {

sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null,

MYDATABASE_VERSION);

sqLiteDatabase = sqLiteHelper.getWritableDatabase();

returnthis;

}

Interogările pot fi create prin metodele rawQuery () și query ()sau prin clasa SQLiteQueryBuilder.

rawQuery() acceptă direct o declarație SQL selectată ca intrare.

query( )oferă o interfață structurată pentru specificarea interogării SQL.

Cursor

O interogare returnează un obiect Cursor. Un cursor reprezintă rezultatul unei interogări și practic punctează de la un rând de rezultatul interogării. În acest fel Android poate tampona rezultatele interogării eficient; deoarece nu trebuie să încarce toate datele în memorie.
Pentru a obține numărul de elemente ale interogării rezultate folosiți metoda getCount ().
Pentru a vă deplasa între rânduri de date individuale, puteți utiliza metodele moveToFirst () și moveToNext ().Metoda isAfterLast () permite verificarea dacă la sfârșit rezultatul interogării a fost atins.

Pentru a insera în tabelul bazei de date este utilizată metoda insert ()care conține trei parametri: tabelul bazei de date, coloana hack și valorile care trebuie introduse:

Elementele limbajului SQL folosite pentru a crea baza de date a aplicației:

Termenii, care sunt componente ale instrucțiunilor și interogărilor:

WHERE este o clauză opțională, necesită numai înregistrările care îndeplinesc criteriile de selecție specificate.

Criteriile de selecție este o expresie care conține un operator cu tip de câmp corect. Clauza NOT NULL indică faptul că în camp nu pot fi salvate valori NULE.

Clauza FROM specifică numele tabelului sau tabelelor în care se aplică interogarea. Pentru mai multe tabele, numele lor sunt separate de ",".

Interogări: folosite la extragerea datelor specifice.

Interogări INSERT sunt folosite pentru adăugarea de înregistrări într-un tabel specificat
Interogări UPDATE sunt folosite pentru a introduce date noi în tabele sau de a actualiza datele existente.
Interogări CREATE sunt folosite pentru a crea noi tabele
Interogări DELETE sunt utilizate pentru a șterge parțial sau total înregistrări dintr-un tabel. Acestea nu sunt folosite pentru ștergerea valorilor câmpurilor individuale.

Tipuri de date utilizate:

TEXT – sir de caractere

INTEGER  – întreg

Constrângeri de integritate utilizate:

PRIMARY KEY nu permite valori NULL sau duplicate în coloana sau coloanele definite ca;
FOREIGN KEY cere ca fiecare valoare din coloană sau un set de coloane definite ca și cheie extrenă trebuie să aibă o valoare identică cu tabelul de conectare corespondent, coloana corespondentă din tabel este definită cu tipurile de constrângere UNIQUE sau PRIMARY KEY;

Google Maps

Google Maps este un serviciu Google care oferă o tehnologie de cartografiere puternică și ușor de utilizat precum și informații de referitoare la afaceri (incluzând locațiile afacerilor, informații de contact precum și orientare pentru șoferi) .

Google Maps permite realizarea de geo-mashup-uri și se încadrează în categoria sistemelor informaționale geografice(GIS-Geographic Information Systems). Aceste sisteme permit computerului să adauge datelor deținute diverse componente geografice indicând localizarea acestora.

Google Maps pune la dispoziție hărți ale globului prin intermediul imaginilor disponibile prin satelit, oferind date despre instituțiile și obiectivele de atracție turistică ale unei zone. În plus, oferă posibilitatea de a crea aplicații care combină informația geografică cu setul propriu de date, pentru crearea unor reprezentări personalizate ale informației de interes.

API-ul Google Maps este la origine un API JavaScript care permite integrarea de hărți interactive direct în aplicațiile Web. Astfel, nu este permisă doar vizualizarea unor hărți, ci și interacțiunea cu anumite zone, precum plasarea cursorului la o anumită locație pentru marcarea unui loc sau a unei adrese.

Datorita acestui API putem include o hartă personalizată în cadrul unei pagini Web. Google Maps pune la dispoziție un set de obiecte și metode JavaScript ce pot fi apelate și manipulate de orice persoană înregistrată în prealabil. Documentația API-ului Google Maps este accesibilă la adresa http://www.google.com/apis/maps și cuprinde informații despre clasele, modulele și proprietățile oferite.

Structura unui proiect android

Un proiect Android are la bază un sistem de directoare ierarhizate, la fel ca și un proiect Java. Cu toate acestea, particularitățile sunt unice pentru Android. Pentru a crea o aplicație trebuie să înțelegem modul în care este structurat acesta:

src – este directorul în care vom găsi codul Java aferent proiectului nostru;

gen – în acest director, Android va stoca codul generat pentru rularea proiectului;

assets – conține toate fișierele pe care dorim să le includem în proiect;

res – este un director care conține resursele aplicației precum: elemente grafice, designul aplicației sau descrierea unor elemente din aplicație. Acesta este împărțit la rândul său în mai multe directoare:

res/drawables/ – pentru imagini;

res/layout/  – pentru fișiere XML care descriu interfața utilizator;

res/menu/ – specificațiile XML pentru meniurile din aplicație;

res/values/ – pentru șiruri de caractere, matrici sau alte elemente asemănătoare;

În funcție de particularitățile proiectului, putem adăuga în acest director orice elemente de care avem nevoie în aplicație.

AndroidManifest.xml – acest fișier XML conține descrierea aplicației, ce activități, servicii include sau ce permisiuni necesită aplicația pentru a rula.

În momentul în care compilăm proiectul prin intermediul Eclipse sau orice alt IDE, fișierele rezultate în urma acestei acțiuni le vom găsi în directorul bin/ din rădăcina proiectului nostru, după cum urmează:

bin/namespace/ – clasele Java compilate, unde namespace reprezintă numele pachetului specificat la crearea proiectului;

bin/classes.dex – reprezintă un fișier executabil creat din clasele compilate;

bin/resources.ap_ – acest fișier este o arhivă a resurselor aplicației noastre;

bin/NumeAplicatie.apk – aceast fișier este aplicația noastră, care va fi instalată pe dispozitivul mobil.

Implementarea solutiei

Crearea proiectului

Primul pas al realizarii aplicatiei este crearea proiectului. S-au efectuat urmatorii pasi:

deschidere mediul de lucru Eclipse

se acceseaza din meniul File -> Meniu -> Project… opțiunea Android Project. In fereastra care se configureaza urmatoarele :

Figure 10 – Creare proiect nou

Se seteaza „project name”, „application name” si se selecteaza versiunea minima de SDK si cea pentru care este creata aplicatia

Se selecteaza icoana aplicatiei

Figure 11 – Setare icoana proiect

Se selecteaza tipul activitatii proiectului, in cazul nostru „Blank Activity”

Figure 12 – Setare tip activitate proiect

Se apasa „Finish”

Obtinere API key pentru accesarea hartilor Google

Inainte de a incepe implementarea codului in proiect trebuie sa urmam cativa pasi prestabiliti pentru ca mai apoi accesarea hartilor google sa fie posibilia. Acesti pasi consta in importarea librariilor necesare si configurarea hartilor.

Descarcarea Serviciilor Google play

Google a integrat noile harti ca parte din Google Play Service SDK. Deci inainte sa incepem dezvoltarea hartilor trebuie sa descarcam „Google Play Service” din meniul SDK manager. Putem deschide SDK manager fie din Eclipse fie din folderul android SDK.

Deschidem Eclipse ⇒ Windows⇒ Android SDK Manager și se verifica Google Play Services in sectiunea Extras . Dacă nu sunt deja descarcate se selecteaza „Google Play Service”si se instaleaza pachetul .

Figure 13 – Instalare Google Play Services SDK

Importarea Google Play Servicii in Eclipse

După descarcarea Google play service trebuie sa le importam in Eclipse , care le va folosii ca o bibliotecă pentru proiectul nostru.

In Eclipse mergem la File ⇒ Import ⇒ Android ⇒ Existing Android Code Into Workspace. Facem clic pe Browse și selectam Google Play Service project din dosarul Android SDK. Este important cat timp importa sa verificam optiunea Copy projects into workspace

Figure 14 – Importare Google Play services in proiect

Obtinerea Google Maps API key

Se deschide Google API Console

Se selecteaza „Services” din partea stanga

Figure 15 – Obtinere cheie harti Google – pasul 1

Apoi se selecteaza API acces din partea stanga, iar din partea dreapta se face click pe Create new Android key

Figure 16 – Obtinere cheie harti Google – pas 2: Creare cheie noua pentru Android

Importare librarie

Acum „Google Play Service” trebuie utilizat ca proiect librarie pe care o vom utiliza in proiectul nostru

Se face clic dreapta pe proiect si se selecteaza Properties. In fereastra de proprietati pe partea stanga se selecteaza Android . In dreapta se apasa butonul Add de sub sectiunea cu librarii. .

Figure 17 – Importare librarie "google services" in proiect

Se selecteaza „google_play_services_lib” si se apasa butonul „Ok”

Figure 18 – Importare librarie "google services" in proiect – pas 2

Adaugarea Map key in fisierul manifest

Pentru ca aplicatia noastra sa stie ce serviciu sa acceseze si ce cheie sa foloseasca pentru a obtine informatiile necesare trebuie sa i se specifice cheia google si sa i se dea acces la accesarea retelei si a gps-ului.

In fisierul xml se adauga un camp „meta-data” si se seteaza poprietatile „name” si „value” cu serviciul de google maps, respectiv cheia obtinuta mai devreme.

Pentru a putea accesa si folosi fara probleme hartile google, urmatoarele permisiuni trebuiesc definite pentru aplicatia noastra:

ACCESS_NETWORK_STATE – Pentru a verifica starea rețelei dacă datele pot fi descărcate sau nu

INTERNET – Pentru a verifica starea conexiunii la internet

WRITE_EXTERNAL_STORAGE – Pentru a scrie pentru stocare extern ca magazin Google Maps harta date în dispozitiv de memorie extern

ACCESS_COARSE_LOCATION – Pentru a determina locația utilizatorului , folosind datele WiFi și de celule mobile

ACCESS_FINE_LOCATION – Pentru a determina locația utilizatorului prin GPS

OpenGL ES V2 – Necesar pentru Google Maps

Structura aplicatiei

Aplicatia este compusa din 4 clase :

MainActivity

MapActivity

SQLiteAdapter

ViewRoutes

Clasa MainActivity

Punctul de început al aplicației este MainActivity unde instantiaza si se creeaza baza de date locala, se asignează event-urile și se setează interfata de început. Aici este definita și metoda de accesare a setarilor de GPS care porneste in cazul in care acest serviciul nu este activat. Fara ca aceste serviciu sa fie activat nu se pot obinte informatiile necesare hartilor google si deci nu se poate trece mai departe. In schimb se pot vizualiza rutele salvate.

Clasa MainActivity contine doua metode: onCreate si showGPSDisabledAlertToUser

setContentView(R.layout.main); – este linia care seteaza interfata pentru prima activitate. Aceasta interfata se acceseaza dupa id, si anume “main”;

mySQLiteAdapter = new SQLiteAdapter(this);
mySQLiteAdapter.openToRead();
mySQLiteAdapter.openToWrite();

Se seteaza accesul la baza de date din contextul activitatii MainActivity. Metoda opentoRead() ofera accesul la citirea bazei iar metoda openToWrite() ofera acces pentru scrierea in baza de date.

Pe eventul de apasare a butonului “Map” se executa urmatoarea bucata de cod:

Map.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {

LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){

Intent myIntent = new Intent(MainActivity.this,
RouteActivity.class);
startActivity(myIntent);

}else{
showGPSDisabledAlertToUser();
}
}
});

Se observa ca mai intai se instantiaza managerul de locatie pentru a verifica daca acest serviciu este activat. Daca este se creeaza un intent care porneste urmatoarea activitate. In caz contrar se afiseaza un mesaj utilizatorului si se deschid setarile telefonului pentru activarea GPS-ului. Aceasta actiune se realizeaza cu apelul catre metoda showGPSDisabledAlertToUser

private void showGPSDisabledAlertToUser(){
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
alertDialogBuilder.setMessage("GPS-ul este dezactivat. Doriti sa il activati?")
.setCancelable(false)
.setPositiveButton("Porneste GPS",
new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int id){
Intent callGPSSettingIntent = new Intent(
android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(callGPSSettingIntent);
}
});
alertDialogBuilder.setNegativeButton("Renunta",
new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int id){
dialog.cancel();
}
});
AlertDialog alert = alertDialogBuilder.create();
alert.show();
}

Linia de cod ”AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);„ creaza un obiect de tipul AlertDialog.

Cu acest obiect se efectueaza urmatoarele actiuni:

Se seteaza mesajul dialogului :

alertDialogBuilder.setMessage("GPS-ul este dezactivat. Doriti sa il activati?")

Se seteaza textul celor doua butoane:
alertDialogBuilder.setPositiveButton("Porneste GPS",
alertDialogBuilder.setNegativeButton("Renunta",

Se executa actiunile specifice celor doua butoane:

new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int id){
Intent callGPSSettingIntent = new Intent(
android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(callGPSSettingIntent);
}
});

dialog.cancel();

Se creeaza si se afiseaza dialogul:

alertDialogBuilder.create();
alert.show();

La apasarea butonului ”View routes” se creeaza un intent care porneste activitatea de vizualizare a rutelor salvate:

View.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
Intent myIntent = new Intent(MainActivity.this,
ViewRoutes.class);
startActivity(myIntent);
}
});

Clasa SQLiteAdapter

In clasa SQLiteAdapter se creeaza tabelele, ofera acces la baza de date si sunt implementate toate metodele in care au loc actiuni de citire si de scriere in baza de date.

La implementarea bazei de date mai intai se declara tabelele,numele bazei de date, coloanele fiecarui table.

Declarare structura baza de date:

public static final String MYDATABASE_NAME = "JurnalCalatorie";
private static final String TABLE_Ruta = "tblRuta";
private static final String TABLE_Popas = "tblPopas";
private static final String TABLE_Pictures = "tblPoze";
private static final String TABLE_Traseu = "tblTraseu";
public static final int MYDATABASE_VERSION = 1;

Declarare coloane tabele:

// table ruta
public static final String row_id_ruta = "id_ruta";
public static final String row_punct_plecare = "punct_plecare";
public static final String row_punct_incheiere = "punct_incheiere_ruta";
public static final String row_coordonate_plecare = "coordonate_punct_plecare";
public static final String row_coordonate_incheiere = "coordonate_incheiere_ruta";
public static final String row_data_incepere = "data_incepere_ruta";
public static final String row_data_incheiere = "data_incheiere_ruta";
public static final String row_isfinished = "isFinished";

// table Popas
public static final String row_id_popas = "id_popas";
public static final String row_coordonate_popas = "coordonate_gps_popas";
public static final String row_localitate_popas = "localitate_popas";
public static final String row_id_ruta_popas = "id_ruta";
public static final String row_data_popas = "data_popas";

// table poze
public static final String row_id_poza = "id_poza";
public static final String row_poza = "continut_poza";
public static final String row_id_ruta_poza = "id_ruta";
public static final String row_id_popas_poza = "id_popas";

// table traseu
public static final String row_id_traseu = "id_traseu";
public static final String row_puncte_cheie = "puncte_cheie_traseu";
public static final String row_id_ruta_traseu = "id_ruta";

Declarare comenzi creare baza de date, tipurile de date ale coloanelor si legaturile dintre tabele:

private static final String CREATE_tblRuta = "create table if not exists tblRuta(id_ruta integer primary key autoincrement ,"
+ "punct_plecare text not null,punct_incheiere_ruta text,coordonate_punct_plecare text not null,coordonate_incheiere_ruta text," +
" data_incepere_ruta text null,data_incheiere_ruta text null,isFinished text not null);";

private static final String CREATE_tblPopas = "create table if not exists tblPopas(id_popas integer primary key autoincrement,"
+ "coordonate_gps_popas text not null,localitate_popas text not null,data_popas text not null,id_ruta integer not null," +
" foreign key(id_ruta) references tblRuta(id_ruta));";

private static final String CREATE_tblPoze = "create table if not exists tblPoze(id_poza integer primary key autoincrement ,"
+ "continut_poza text not null,id_popas integer not null," +
" foreign key(id_popas) references tblPopas(id_popas));";

private static final String CREATE_tblTraseu = "create table if not exists tblTraseu(id_traseu integer primary key autoincrement ,"
+ "puncte_cheie_traseu text not null, id_ruta integer not null,"
+ " foreign key(id_ruta) references tblRuta(id_ruta));";

Se executa comenzile de creeare pe eventul de onCreate()

@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL(CREATE_tblRuta);
db.execSQL(CREATE_tblPopas);
db.execSQL(CREATE_tblPoze);
db.execSQL(CREATE_tblTraseu);
}

Se implementeaza metodele care dau acces la baza de date:

public SQLiteAdapter openToRead() throws android.database.SQLException {
sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null,
MYDATABASE_VERSION);
sqLiteDatabase = sqLiteHelper.getReadableDatabase();
return this;
}

public SQLiteAdapter openToWrite() throws android.database.SQLException {
sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null,
MYDATABASE_VERSION);
sqLiteDatabase = sqLiteHelper.getWritableDatabase();
return this;
}

Implementare metode necesare:

public String InsertStartRoute(String punct_plecare, String coordonate_plecare,String data_plecare,String isFinished) {
//se creeaza un array cu toate datele primite ca parametrii
String x[] = new String[] { punct_plecare,coordonate_plecare,data_plecare,isFinished };
String result = "";

try {
//comanda de inserare ruta, daca s-a executat cu succes se intoarce mesajul "Inserted", in caz contrar se intoarce mesajul "Insert failed!"
sqLiteDatabase.execSQL("insert into tblRuta(punct_plecare,coordonate_punct_plecare,data_incepere_ruta,isFinished) " +
"values('"+punct_plecare+"','"+coordonate_plecare+"','"+data_plecare+"','"+isFinished+"');");

result = "Inserted!";

} catch (SQLiteException e) {
e.printStackTrace();
result = "Insert failed!";
}
return result;
}

public String GetIdRuta (String punct_plecare)
{
//metoda care selecteaza ID-ul rutei in functie de punctul de plecare
// de asemenea se tine cont de conditia ca ruta sa nu fie finalizata
String isFinished = "No";
String x[] = new String[] { punct_plecare,isFinished };
String result = "";

try {
Cursor cursor = sqLiteDatabase.rawQuery(
"select id_ruta from tblRuta where punct_plecare = ? and isFinished = ?;",x);

if(cursor!=null)
{
cursor.moveToFirst();
result = cursor.getString(0);
}
} catch (SQLiteAbortException e) {
e.printStackTrace();
result = "Nu s-a putut face cautarea in baza de date!";
}
return result;
}

public String GetRoutes() {
// se seteaza tipul de rute = rute terminate
String isFinished = "Yes";
String x[] = new String[] { isFinished };
String result = "";
// se selecteaza punctul de plecare si punctul de incheiere
// acestea vor fi rutele care vor fi afisate in activitatea de vizualizarea a rutelor.
Cursor cursor = sqLiteDatabase.rawQuery(
"select punct_plecare,punct_incheiere from tblRuta where isFinished = ?;",x);
try
{
// se parcurg toate randurile si se adauga intr-un string
for (cursor.moveToFirst(); !(cursor.isAfterLast()); cursor.moveToNext()) {
for (int i = 0; i < cursor.getColumnCount(); i++) {
result = result + cursor.getString(i) + ",";
}
result += ";";
}
}
catch(SQLiteException e)
{
result = "Eroare la obtinerea datelor"
}
return result;
}

public long SalveazaPopas(String coordonate,String localitate,String data,int id_ruta)
{
long ret = 0;
// se creeaza obiectul de tip ContentValues
ContentValues contentValues = new ContentValues();

//pentru fiecare coloana din baza de date se seteaza valoarea care va fi salvata
contentValues.put(row_coordonate_popas, coordonate);
contentValues.put(row_localitate_popas, localitate);
contentValues.put(row_data_popas, data);
contentValues.put(row_id_ruta_popas, id_ruta);

// se insereaza datele
try {
ret = sqLiteDatabase.insert(TABLE_Popas, null,
contentValues);
} catch (SQLException e) {
e.printStackTrace();
ret = 0;
}
return ret;
}

Clasa MapActivity

Clasa MapActivity se extinde din clasa Activity si implementeaza LocationListener, SenorEventListener si OnClickListener.

In aceasta clasa sunt instantiate urmatoarele varibile:

GoogleMap googleMap; // harta google
Marker now; // markerul care o sa indice punctul de plecare

private boolean started = false;

private SensorManager sensorManager; //managerul de senzori
private Button btnStart; // butonul de start
private String provider;

private Sensor mAccelerometer; // obiectul care ofera acces la informatiile accelerometrului telefonului

setContentView(R.layout.map); // se seteaza interfata „map”.

Pe aceasta interfata se afla container-ul in care este incarcata harta google si doua butoane. Unul este cel de Start/Stop ruta si unul este butonul care porneste camera pentru salvarea pozei.

In metoda onCreate() a acestei clase acceseaza informatiile de la senzori, de la serviciul de gps is se seteaza harta google si locatia actuala, locatie obtinuta de la senzorul de gps.

@SuppressLint("NewApi")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.map);

try {

sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mAccelerometer = sensorManager
.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

int status = GooglePlayServicesUtil
.isGooglePlayServicesAvailable(getBaseContext());
if (status != ConnectionResult.SUCCESS)
{
// Google Play Services are not available
int requestCode = 10;
Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status,
this, requestCode);
dialog.show();

} else
{
// Google Play Services are available
// Getting GoogleMap object from the fragment
googleMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.mapFrag)).getMap();
googleMap.setMyLocationEnabled(true);
}
// Enabling MyLocation Layer of Google Map
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

Criteria criteria = new Criteria();
provider = locationManager.getBestProvider(criteria, true);
Location location = locationManager
.getLastKnownLocation(provider);

if (location != null) {
onLocationChanged(location);

locationManager
.requestLocationUpdates(provider, 8000, 0, this);
} catch (Exception e) {
e.printStackTrace();
}
}

Pentru a urmari datele in timp real pe eventul de schimbare a locatiei a fost implementat codul pentru a face un update la hartile google si astfel se poate vedea in timp real locul in care utilizatorul se afla pe harta. In cele doua variabile l_lat si l_long se salveaza latitudinea si longitudinea.

Cele doua variabile se folosesc ca parametri pentru metoda „getFromLocation” a clasei Geocoder pentru a obtine adresa stiind latitudinea si longitudinea. Astfel se poate obtine localitatea curenta dar si alte date.

@Override
public void onLocationChanged(Location location) {

if(now != null){
now.remove();
}

double l_long = location.getLongitude();
double l_lat = location.getLongitude();

String cityName = null;

Geocoder gcd = new Geocoder( getBaseContext() , Locale.getDefault());
List<android.location.Address> addresses;
try {
addresses = gcd.getFromLocation(location.getLatitude(),
location.getLongitude(), 1);
if (addresses.size() > 0)
System.out.println(addresses.get(0).getLocality());
cityName = addresses.get(0).getLocality();
}
catch (IOException e) {
e.printStackTrace();
}

// Creating a LatLng object for the current location
LatLng latLng = new LatLng(l_long, l_lat);
googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);

googleMap
.addMarker(new MarkerOptions()
.position(latLng)
.icon(BitmapDescriptorFactory
.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));

// Showing the current location in Google Map
googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));

// Zoom in the Google Map
googleMap.animateCamera(CameraUpdateFactory.zoomTo(10));

sensorManager.registerListener(this, mAccelerometer,
SensorManager.SENSOR_DELAY_FASTEST);
}

La apasarea butonului „Take Photo” se porneste un intent catre camera telefonului pentru a putea face o fotografie:

TakePhoto.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE)
startActivityForResult(intent, 0);
}
});

Dupa ce fotografia a fost facuta urmeaza sa se faca salvarea acesteia, metodele pentru salvare sunt implementate in eventul care se porneste dupa ce fotografia a fost facuta – onActivityResult()

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
        if (resultCode == RESULT_OK) {
            // Image captured and saved to fileUri specified in the Intent
                 Uri selectedImage = data.getData();
        }
 }

Pentru a salva imaginea in baza de date locala sunt necesare cateva actiuni. Deoarece coloana este un sir de caractere imaginea noastra trebuie convertita intr-un vector de biti iar acest vector de biti trebuie convertit intr-un sir de caractere

a) Prima operațiune este de a citi fișierul cu un clasa FileInputStream.
Un FileInputStream obtine biti de intrare dintr-un fișier intr-un sistem de fișiere.

b) Al doilea pas este de a scrie biti folosind ByteArrayOutputStream într-o matrice octet.
Această clasă implementeaza un flux de ieșire în care datele sunt scrise într-o matrice octet.

Tamponul crește automat pe măsură ce datele sunt scrise la acesta. Datele pot fi preluate cu ajutorul toByteArray () și toString ().

public byte[] convertFileToByteArray(String filepath)
{
File f = new File(filepath);
byte[] byteArray = null;
try
{
InputStream inputStream = new FileInputStream(f);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] b = new byte[1024*8];
int bytesRead =0;

while ((bytesRead = inputStream.read(b)) != -1)
{
bos.write(b, 0, bytesRead);
}

byteArray = bos.toByteArray();
}
catch (IOException e)
{
e.printStackTrace();
}
return byteArray;
}

Deoarece coloana noastră de bază de date în care sunt salvate datele este o varchar, matricea octet trebuie să fie convertită într-un șir.
Conversia se face cu „Base64 encoding” :

String byteArrayStr = newString(Base64.encodeToString(bytesFromFile,1));

byteArrayStr este valoarea finala care va fi memorata in baza de date.

Clasa ViewRoutes

Este clasa in care se poate vizualiza lista cu rutele care utilizatorul aplicatiei le-a salvat.Pentru implementarea acestei functionalitati s-au urmat urmatorii pasi:

Instantiere obiect SQLiteAdapter

Permisiune de citire

Obtinere informatii de la baza de date

Adaugarea lor in lista

Accesarea pozelor

In metoda onCreate() se implementeaza primii 2 pasi si se face un apel la metoda LoadListView(), metoda care incarca lista.

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.show_routes);

mySQLiteAdapter = new SQLiteAdapter(this);
mySQLiteAdapter.openToRead();

LoadListView();
}

In metoda LoadListView trebuie effectuate operatii suplimentare inainte de a seta lista. Deoarece lista cu rutele vine de la baza de date intr-un format specific si anume :

Ruta1 ; ruta2 ; ruta3; …etc. Se observa ca toate rutele sunt despartite de caracterul “;”. Exact este prima actiune care trebuie facuta – separarea rutelor dupa caracterul “;”. Odata separate se pot incarca datele in lista.

private void LoadListView() {
try
{
String x= mySQLiteAdapter.GetRoutes();
String[] listParts = null;

listParts = x.split(";");

dispArray = new ArrayList<String>();

for(int j = 0; j< listParts.length;j++)
{
dispArray.add(listParts[j]);
}

for (int i = 0; i < dispArray.size(); i++) {

LayoutInflater inflater = null;
inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

View mLinearView = inflater.inflate(R.layout.routes, null);

TextView id_route = (TextView) mLinearView.findViewById(R.id.textViewID);
TextView route = (TextView) mLinearView.findViewById(R.id.textViewName);

String disParts[] = null;
disParts = dispArray.get(i).toString().split(",");

final String l_IdRuta = disParts[0].toString();
final String l_NumeRuta = disParts[1].toString();
id_route.setText(l_IdRuta);
route.setText(l_NumeRuta);

mLinearListView.addView(mLinearView);

mLinearView.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {

id_selectedRoute = Integer.parseInt(l_IdRuta);
mySQLiteAdapter.GetPhotosByRoute(id_selectedRoute)
}
});

}
}
catch(Exception e)
{
e.printStackTrace();
}
}

Pentru deschiderea unei fotografii trebuie efectuata o operațiunie inversa operațiunii de salvare a fișierului în baza de date:

a) Șirul din baza de date este decodificat de la șir la matrice octet:
byteArray = (Base64.decode (bytesString, 1));
b) Matricea octet obținută este scrisă într-un fișier temporal cu "FileOutputStream"

Un flux de ieșire de fișiere este un flux de ieșire care scrie bitii într-un fișier. Dacă există fișierul de ieșire, acesta poate fi înlocuit sau anexat. În cazul în care nu există, va fi creat un nou fișier.
1) Se converteste stringul venit de la baza de date intr-un vector de biti:

public byte[] convertStringToByte(String bytesString)
{
byte[] byteArray = null;

byteArray = (Base64.decode(bytesString, 1));

return byteArray;
}

2) Vectorul de biti obtinuti este decodificat si scris ca fisier in memoria locala:

public String writeToFile(byte[] array,String extensie)
{
String x = "";
try
{
x = "/sdcard";
x+= "/temp.";
x+= extensie;

FileOutputStream stream = new FileOutputStream(x);
try
{
stream.write(array);
stream.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
catch (FileNotFoundException e1)
{
e1.printStackTrace();
x="";
}
return x;
}

Odata ce fisierul este scris in memoria locala se deschide un dialog din care utilizatorul poate selecta aplicatia cu care vrea sa vizualizeze poza.

Concluzii

Scopul acestui proiect a fost realizarea unei aplicații de gestionare rutelor, locurilor de oprire si a fotografiilor realizate intr-o excursie sau calatorie . Pe parcursul dezvoltării am reușit sa imi imbunatatesc cunostiintele legate de sistemul de operare Android si de programare. Desi am intalnit diverse probleme tehnice am reusit sa gasesc o solutie optima cu ajutorul domnului profesor coordonator. Rezultatul obținut a fost cel așteptat și m-a motivat ca pe viitor continui dezvoltarea aplicatiilor utilizand aceeasi tehnologie.

Bibliografie

Referinte web

[1]„Android Custom Views”, http://www.vogella.com/tutorials/AndroidCustomViews/article.html

[2] “Obtain Google Maps Access Key”,

http://www.vogella.com/tutorials/AndroidGoogleMaps/article.html

Anexe

Similar Posts

  • Mixul de Marketing In Cadrul Agentiei de Turism S.c. Alpha Travel S.r.l

    === 9381362db399d66edebc404b493bcc7356c9a318_423983_1 === CUPRINS INTRODUCERE CAPITOLUL I MIXUL DE MARKETING ÎN SERVICII Concepte legate de servicii Comportamentul consumatorului 1.3Conceptul mix de marketing 1.4 Componentele esențiale ale mixului de marketing 1.4.1 Produsul 1.4.2Promovarea 1.4.3 Plasarea (Distribuția) 1.4.4 Prețul CAPITOLUL II MIXUL DE MARKETING LA FIRMA ALPHA TRAVEL SRL 2.1.Prezentarea firmei 2.2 AnalizaSWOT CAPITOLUL III ELEMENTE CARACTERITICE…

  • Proiectul Ca Metoda Alternativa de Evaluare In Gradinita

    === 707757fde1d7200a1897dd88dbfd20951dd90d36_310929_1 === Facultatea de Psihologie și Științele Educației Specializare: Pedagogia Învățământului Primar și Preșcolar Proiectul ca metodă alternativă de evaluare în grădiniță CUPRINS INTRODUCERE…………………………………………………………………………………………….3 CAPITOLUL I Specificul evaluării în învățământul preșcolar………………………….7 Conceptul de evaluare – repere teoretice…………………………………………………….7 Evaluarea în învățământul preșcolar…………………………………………………………11 Tipuri sau forme de evaluare în învățământul preșcolar (evaluare inițială, formativă/continuă, sumativă/finală)………………………………………………………. 17 Strategiile…

  • Societatile de Investitii Financiaredocx

    === Societatile de investitii financiare === Informații generale privind societățile de investiții financire SIF Banat- Crișana Societatea de Investiții Financiare Banat-Crișana este persoană juridică română, constituită ca societate pe acțiuni cu capital integral privat și funcționează ca societate de investiții de tip închis cu o politică de investiții diversificată, în baza reglementărilor Autorității de Supraveghere Financiară (ASF). Societatea…

  • Ion Luca Caragiale

    Capitolul II Ion Luca Caragiale 2.1. Despre Ion Luca Caragiale De-a lungul timpului, Caragiale, supranumit „Moliere al nostru”, s-a bucurat de receptare critică diversă atât a operei cât și a biografiei sale. Personalitățile vremii și urmașii acestora au înțeles în cele mai felurite moduri, ceea ce Ion Luca Caragiale a reprezentat și a realizat prin…

  • Evolutia Diplomatiei

    Introducere În lucrarea de față mi-am propus să analizez modul în care a evoluat diplomația, care a fost rolul acesteia de la o perioadă istorică la alta, dar și rolul pe care diplomația îl are în epoca contemporană în dezolvarea culturii. Finalizând lucrarea cu un studiu de caz ce are ca rol evidențierea rolului diplomației…

  • Automatizarea Bratului Robotic

    UNIVERSITATEA “AUREL VLAICU” DIN ARAD FACULTATEA DE INGINERIE DOMENIUL: INGINERIA SISTEMELOR PROGRAMUL DE STUDIU: AUTOMATICĂ ȘI INFORMATICĂ APLICATĂ FORMA DE ÎNVĂȚĂMÂNT: cu frecvență PROIECT DE DIPLOMĂ ÎNDRUMĂTOR ȘTIINȚIFIC Conf. univ. dr. ing. Bălaș Valentina ABSOLVENT Isip D. Ioan Mihai ARAD 2016UNIVERSITATEA “AUREL VLAICU” DIN ARAD FACULTATEA DE INGINERIE DOMENIUL: INGINERIA SISTEMELOR PROGRAMUL DE STUDIU: AUTOMATICĂ…