Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
laboratoare:laborator10 [2015/05/11 17:30] Andrei Roșu-Cojocaru [Activitate de Laborator] |
laboratoare:laborator10 [2015/05/12 01:44] (current) Andrei Roșu-Cojocaru |
||
|---|---|---|---|
| Line 24: | Line 24: | ||
| * În secțiunea //APIs & auth// → //Credentials//, se generează o cheie publică care va fi utilizată la procesul de autentificare, în vederea accesării funcționalității puse la dispoziție de serviciul de localizare. | * În secțiunea //APIs & auth// → //Credentials//, se generează o cheie publică care va fi utilizată la procesul de autentificare, în vederea accesării funcționalității puse la dispoziție de serviciul de localizare. | ||
| - | * Folosind utilitarul Java ''keytool'', se generează amprenta digitală a mașinii de pe care se va dezvolta aplicația Android. Pentru a putea utiliza acest utilitar, calea căte Java trebuie să se găsească în variabila de mediu ''$PATH'', respectiv ''%PATH''. | + | * Folosind utilitarul Java ''keytool'', se generează semnătura digitală a mașinii de pe care se va dezvolta aplicația Android. Pentru a putea utiliza acest utilitar, calea căte Java trebuie să se găsească în variabila de mediu ''$PATH'', respectiv ''%PATH''. |
| * Linux <code> | * Linux <code> | ||
| student@pdsd2015:~$ export PATH=$PATH:/usr/local/java/jdk1.8.0_31/bin | student@pdsd2015:~$ export PATH=$PATH:/usr/local/java/jdk1.8.0_31/bin | ||
| Line 64: | Line 64: | ||
| * Se specifică proprietățile cheii publice ce se dorește a fi generată: | * Se specifică proprietățile cheii publice ce se dorește a fi generată: | ||
| * tipul cheii publice - //Android Key//\\ \\ {{ :laboratoare:laborator10:configurare06.png?nolink }} | * tipul cheii publice - //Android Key//\\ \\ {{ :laboratoare:laborator10:configurare06.png?nolink }} | ||
| - | * parametrii de conectare - amprenta digitală și pachetul corespunzător aplicației Android (separate prin caracterul '';''), astfel încât să fie acceptate solicitări numai pe baza acestor valori, în caz contrar permițându-se accesul indiferent de certificatul deținut sau de aplicația Android de pe care provine\\ \\ {{ :laboratoare:laborator10:configurare07.png?nolink&600 }} | + | * parametrii de conectare - semnătura digitală și pachetul corespunzător aplicației Android (separate prin caracterul '';''), astfel încât să fie acceptate solicitări numai pe baza acestor valori, în caz contrar permițându-se accesul indiferent de certificatul deținut sau de aplicația Android de pe care provine\\ \\ {{ :laboratoare:laborator10:configurare07.png?nolink&600 }} |
| * Se identifică valoarea cheii publice care va putea fi utilizată.\\ \\ {{ :laboratoare:laborator10:configurare08.png?nolink&800 }} | * Se identifică valoarea cheii publice care va putea fi utilizată.\\ \\ {{ :laboratoare:laborator10:configurare08.png?nolink&800 }} | ||
| Line 174: | Line 174: | ||
| ==== Dispozitiv Fizic ==== | ==== Dispozitiv Fizic ==== | ||
| - | Pentru accesarea funcționalităților legate de locație pe dispozitivul fizic este necesar să se realizeze următoarele configurări: | + | Pentru accesarea funcționalităților legate de locație pe dispozitivul fizic este necesar să se activeze opțiunea //Location// (care trebuie să aibă valoarea //On//) din secțiunea de configurări (//Settings// → //Personal//). |
| - | + | ||
| - | * //Settings// → //Personal// → //Location// (valoarea //On//) | + | |
| {{ :laboratoare:laborator10:physical_device_01.png?nolink&400 }} | {{ :laboratoare:laborator10:physical_device_01.png?nolink&400 }} | ||
| - | * //Settings// → //Personal// → //Location// → //Mode// → //Location Mode// (valoarea //High Accuracy//) | + | Se poate controla acuratețea informațiilor furnizate, raportat la consumul de energie, prin intermediul opțiunilor disponibile în secțiunea //Location Mode// din secțiunea de configurări (//Settings// → //Personal// → //Location// → //Mode//). |
| + | * //High accuracy// - locația este determinată folosind toate resursele disponibile (sistemul global de poziționare GPS, rețelele mobile și fără fir); | ||
| + | * //Battery saving// - locația este determinată folosind doar informațiile furnizate de rețelele mobile și fără fir; | ||
| + | * //Device only// - locația este determinată folosind doar informațiile furnizate de sistemul global de poziționare GPS. | ||
| {{ :laboratoare:laborator10:physical_device_02.png?nolink&400 }} | {{ :laboratoare:laborator10:physical_device_02.png?nolink&400 }} | ||
| + | |||
| + | <note tip>Se recomandă ca determinarea locației să se realizeze folosind toate resursele disponibile la un moment dat de timp pentru o precizie cât mai mare (cu un consum de energie corespunzător).</note> | ||
| ==== Dispozitiv Virtual ==== | ==== Dispozitiv Virtual ==== | ||
| === Genymotion === | === Genymotion === | ||
| - | Pentru accesarea funcționalităților legate de locație pe dispozitivul virtual Genymotion este necesar să se realizeze următoarele configurări: | + | Pentru accesarea funcționalităților legate de locație pe dispozitivul virtual Genymotion este necesar să se activeze serviciul GPS, accesibil din meniul lateral sau folosind combinația de taste Ctrl + 2 (se selectează valoarea //On//). |
| - | * Ctrl + 2 sau se apasă butonul //GPS// din meniul vertical | + | {{ :laboratoare:laborator10:genymotion_gps_01.png?nolink&400 }} |
| - | * activat (valoarea //On//) | + | |
| - | * se completează parametrii | + | |
| - | * latitudine | + | |
| - | * longitudine | + | |
| - | * altitudine | + | |
| - | * se indică acuratețea (nivelul de precizie) | + | |
| - | * se specifică direcția | + | |
| - | {{ :laboratoare:laborator10:genymotion_gps.png?nolink&400 }} | + | Alte informații care pot fi configurate sunt: |
| + | * latitudinea - exprimată în grade; | ||
| + | * longitudinea - exprimată în grade; | ||
| + | * altitudinea - exprimată în metri; | ||
| + | * acuratețea (nivelul de precizie) - exprimat în număr de metri cu care să se aproximeze locația exactă; | ||
| + | * direcția - exprimată în grade. | ||
| - | * //Settings// → //Location Services//, se bifează opțiunile | + | {{ :laboratoare:laborator10:genymotion_gps_02.png?nolink&400 }} |
| - | * Google's location service | + | |
| - | * GPS satellites | + | De asemenea, este implementată și funcționalitatea prin intermediul căreia poate fi vizualizată poziția precizată în cadrul unei hărți Google. |
| - | * Location & Google Search | + | |
| + | {{ :laboratoare:laborator10:genymotion_mapping_service.png?nolink&600 }} | ||
| + | |||
| + | Alte configurații legate de serviciul de localizate sunt disponibile în secțiunea //Settings// → //Location Services//, unde este recomandat să se selecteze toate opțiunile existente: | ||
| + | * //Google's location service// - permite transmisia de informații anonime către Google și utilizarea rețelelor mobile și fără fir pentru determinarea locației aproximative, atunci când nu sunt disponibile alte resurse; | ||
| + | * //GPS satellites// - oferă accesul la sistemul de poziționare globală GPS pentru determinarea locației; | ||
| + | * //Location & Google Search// - determină utilizarea de către Google a locației curente pe baza căreia să își contextualizeze serviciile. | ||
| {{ :laboratoare:laborator10:genymotion_location_services.png?nolink&400 }} | {{ :laboratoare:laborator10:genymotion_location_services.png?nolink&400 }} | ||
| - | Se poate vizualiza pe hartă locația curentă: | + | <note>În cazul în care nu sunt selectate toate aceste opțiuni, este posibil ca serviciul Geocoder să nu fie disponibil. Dacă o astfel de situație persistă chiar și în condițiile în care configurațiile sunt corespunzătoare, dispozitivul virtual trebuie repornit, întrucât eroarea este determinată de o problemă cu serviciul Google Play Services, a cărui stare nu a fost actualizată.</note> |
| - | {{ :laboratoare:laborator10:genymotion_mapping_service.png?nolink&600 }} | ||
| === AVD === | === AVD === | ||
| - | Pentru accesarea funcționalităților legate de locație pe dispozitivul virtual AVD este necesar să se acceseze perspectiva //DDMS// din Eclipse Luna SR1a (4.4.1) - //Window// → //Open Perspective// → //DDMS// - și în secțiunea //Emulator Control// → //Location Control//, se stabilesc valorile pentru latitudine și longitudine, după care se apasă butonul //Send//. | + | Pentru accesarea funcționalităților legate de locație pe dispozitivul virtual AVD este necesar ca în secțiunea de configurări corespunzătoare (//Settings// → //Location access//) să se specifice următorii parametri: |
| + | * //Access to my location//: //On// - permite aplicațiilor Android să acceseze locația curentă, pe baza informațiilor furnizate din sursele disponibile; | ||
| + | * //GPS Sattelites//: activat - se utilizează sistemul de poziționare globală GPS pentru determinarea locației curente; | ||
| + | * //Wi-Fi & mobile network location//: activat - se utilizează o estimare pentru locația curentă pe baza serviciilor oferite de Google; totodată, vor fi transmise informații anonime în acest sens. | ||
| + | |||
| + | {{ :laboratoare:laborator10:avd_configuration.png?nolink&600 }} | ||
| + | |||
| + | Controlul poziției curente poate fi realizat prin intermediul perspectivei //DDMS// din Eclipse Luna SR1a (4.4.1) (//Window// → //Open Perspective// → //DDMS//), unde, în secțiunea //Emulator Control// → //Location Control// se stabilesc valorile pentru latitudine și longitudine (în panoul //Manual//, în format decimal sau sexagesimal), după care se apasă butonul //Send//. Informații cu privire la locațiile disponibile pot fi precizate și sub forma unor fișiere gpx sau kml, care pot fi încărcate. | ||
| {{ :laboratoare:laborator10:avd_emulator_control.png?nolink&600 }} | {{ :laboratoare:laborator10:avd_emulator_control.png?nolink&600 }} | ||
| Line 359: | Line 373: | ||
| API-ul Android pune la dispoziția utilizatorilor un [[http://developer.android.com/reference/com/google/android/gms/location/FusedLocationProviderApi.html|furnizor integrat de servicii de localizare]], prin care aceștia pot specifica anumiți parametrii de configurare, cum ar fi nivelul de precizie și gradul de utilizare al bateriei. | API-ul Android pune la dispoziția utilizatorilor un [[http://developer.android.com/reference/com/google/android/gms/location/FusedLocationProviderApi.html|furnizor integrat de servicii de localizare]], prin care aceștia pot specifica anumiți parametrii de configurare, cum ar fi nivelul de precizie și gradul de utilizare al bateriei. | ||
| - | Funcționalitatea legată de gestiunea locației curente (ca de altfel toate funcționalitățile legate de biblioteca Google Play Services) este disponibilă prin intermediul unui obiect de tip [[http://developer.android.com/reference/com/google/android/gms/common/api/GoogleApiClient.html|GoogleApiClient]], a cărui instanță este obținută de regulă pe metoda ''onCreate()'' a aplicației Android, eliberarea resurselor corespunzătoare acesteia fiind făcută pe metoda ''onDestroy()'' | + | Funcționalitatea legată de gestiunea locației curente (ca de altfel toate funcționalitățile legate de biblioteca Google Play Services) este disponibilă prin intermediul unui obiect de tip [[http://developer.android.com/reference/com/google/android/gms/common/api/GoogleApiClient.html|GoogleApiClient]], a cărui instanță este obținută de regulă pe metoda ''onCreate()'' a aplicației Android, eliberarea resurselor corespunzătoare acesteia fiind făcută pe metoda ''onDestroy()''. |
| + | |||
| + | {{ :laboratoare:laborator10:clientul_google_api.png?nolink&600 }} | ||
| <code java> | <code java> | ||
| Line 1031: | Line 1047: | ||
| {{ :laboratoare:laborator10:google_maps_places.png?nolink&400 }} | {{ :laboratoare:laborator10:google_maps_places.png?nolink&400 }} | ||
| + | |||
| + | Reperele vor fi stocate în cadrul unei liste (obiect de tip ''Spinner''), astfel încât la selecția unui element din cadrul acesteia, se va vizualiza obiectivul geografic marcat anterior. | ||
| Se cere să se implementeze funcționalitățile pentru adăugarea unui reper și ștergerea tuturor reperelor de pe hartă: | Se cere să se implementeze funcționalitățile pentru adăugarea unui reper și ștergerea tuturor reperelor de pe hartă: | ||
| Line 1057: | Line 1075: | ||
| Se dorește să se implementeze o aplicație pentru care să se implementeze posibilitatea de actualizare periodică a poziției curente pe hartă, în funcție de starea unui buton, prin care se controlează pornirea / oprirea acestui serviciu. | Se dorește să se implementeze o aplicație pentru care să se implementeze posibilitatea de actualizare periodică a poziției curente pe hartă, în funcție de starea unui buton, prin care se controlează pornirea / oprirea acestui serviciu. | ||
| - | - când serviciul este activat, se vizualizează pe hartă doar locația curentă; | + | - când serviciul este activat, se vizualizează pe hartă doar locația curentă, completându-se în mod automat informații precum latitudinea și longitudinea, actualizându-se corespunzător poziția; |
| - când serviciul este dezactivat, utilizatorul are posibilitatea de a controla poziția care se vizualizează pe hartă. | - când serviciul este dezactivat, utilizatorul are posibilitatea de a controla poziția care se vizualizează pe hartă. | ||
| Line 1068: | Line 1086: | ||
| Se cere să se implementeze metodele pentru pornirea și oprirea serviciului de actualizare periodică a locației de pe hartă: | Se cere să se implementeze metodele pentru pornirea și oprirea serviciului de actualizare periodică a locației de pe hartă: | ||
| - | **a)** metoda ''startLocationUpdates()'' din clasa ''GoogleMapsActivity'' | + | **a)** metoda ''startLocationUpdates()'' din clasa ''GoogleMapsActivity'': |
| - se apelează metoda ''requestLocationUpdates()'' din clasa ''FusedLocationProviderApi'' <code java> | - se apelează metoda ''requestLocationUpdates()'' din clasa ''FusedLocationProviderApi'' <code java> | ||
| LocationServices.FusedLocationApi.requestLocationUpdates( | LocationServices.FusedLocationApi.requestLocationUpdates( | ||
| Line 1095: | Line 1113: | ||
| **8.** Să se importe în mediul integrat de dezvoltare Eclipse Luna SR1a (4.4.1) proiectele ''google-play-service_lib'' și ''03-GoogleMapsGeocoding'' din directorul ''labtasks'' (în această ordine). | **8.** Să se importe în mediul integrat de dezvoltare Eclipse Luna SR1a (4.4.1) proiectele ''google-play-service_lib'' și ''03-GoogleMapsGeocoding'' din directorul ''labtasks'' (în această ordine). | ||
| + | |||
| + | Se dorește să se implementeze o aplicație care să realizeze procesul de codificare geografică inversă: dându-se un set de coordonate GPS, se dorește să se determine adresa poștală corespunzătoare. | ||
| + | |||
| + | {{ :laboratoare:laborator10:google_maps_geocoding.png?nolink&400 }} | ||
| + | |||
| + | Se cere să se implementeze procesul de conversie propriu-zis, în cadrul serviciului ''GetLocationAddressIntentService'', pe metoda ''onHandleIntent()''. | ||
| + | - se instanțiază un obiect de tip ''Geocoder'' <code java> | ||
| + | Geocoder geocoder = new Geocoder(this, Locale.getDefault()); | ||
| + | </code> | ||
| + | - se obține lista de adrese prin invocarea metodei ''getFromLocation()'' care primește ca parametri: | ||
| + | - latitudinea; | ||
| + | - longitudinea; | ||
| + | - numărul de adrese întoarse (''Constants.NUMBER_OF_ADDRESSES''); | ||
| + | - se tratează corespunzător tipurile de execepții ce pot fi generate (''IOException'', ''IllegalArgumentException'') precum și situația în care nu este furnizat nici un rezultat; | ||
| + | - se parcurge lista de adrese: pentru fiecare adresă în parte se concatenează rândurile distincte, concatenându-se toate rezultatele obținute; | ||
| + | - numărul de linii dintr-o adresă este furnizat de metoda ''getMaxAddressLineIndex()''; | ||
| + | - un rând de la o anumită poziție se obține prin intermediul metodei ''getAddressLine()''; | ||
| + | - se transmite rezultatul către activitatea principală (se apelează metoda ''handleResult()'' cu codul numeric de rezultat (''Constants.RESULT_SUCCESS'', ''Constants.RESULT_FAILURE'') și rezultatul obținut, respectiv mesajul de eroare, după caz. | ||
| **9.** Să se importe în mediul integrat de dezvoltare Eclipse Luna SR1a (4.4.1) proiectele ''google-play-service_lib'' și ''04-GoogleMapsGeofencing'' din directorul ''labtasks'' (în această ordine). | **9.** Să se importe în mediul integrat de dezvoltare Eclipse Luna SR1a (4.4.1) proiectele ''google-play-service_lib'' și ''04-GoogleMapsGeofencing'' din directorul ''labtasks'' (în această ordine). | ||
| + | |||
| + | Se dorește să se implementeze o aplicație care să monitorizeze activitatea unui dispozitiv mobil raportat la o zonă de restricție geografică. | ||
| + | |||
| + | Serviciul referitor la monitorizarea unei anumite locații poate fi activat sau dezactivat, specificându-se de fiecare dată coordonatele zonei față de care sunt realizate comparațiile. | ||
| + | |||
| + | Aplicația va afișa pe hartă în permanență locația curentă prin actualizările periodice care sunt transmise. | ||
| + | |||
| + | {{ :laboratoare:laborator10:google_maps_geofencing_01.png?nolink&400 }} | ||
| + | |||
| + | Notificările vor fi generate: | ||
| + | |||
| + | - când utilizatorul intră în zona de restricție geografică\\ \\ {{ :laboratoare:laborator10:google_maps_geofencing_02_03.png?nolink&600 }} | ||
| + | - când utilizatorul iese din zona de restricție geografică\\ \\ {{ :laboratoare:laborator10:google_maps_geofencing_04_05.png?nolink&600 }} | ||
| + | |||
| + | Detaliile cu privire la evenimentul produs vor putea fi vizualizate în cadrul unei activități dedicate. | ||
| + | |||
| + | Se cere să se analizeze evenimentul legat de zona de restricție geografică în cadrul serviciului ''GeofenceTrackerIntentService'', pe metoda ''onHandleIntent()''. | ||
| + | - se obține evenimentul legat de zona de restricție geografică, din cadrul intenției cu care a fost lansat în execuție serviciul <code java> | ||
| + | GeofencingEvent geofencingEvent = GeofencingEvent.fromIntent(intent); | ||
| + | </code> | ||
| + | - se verifică dacă evenimentul legat de zona de restricție geografică conține vreo eroare (prin apelul metodei ''hasError()''), aceasta fiind tratată corespunzător (se jurnalizează eroarea și metoda se termină): | ||
| + | - ''GeofenceStatusCodes.GEOFENCE_NOT_AVAILABLE'' | ||
| + | - ''GeofenceStatusCodes.GEOFENCE_TOO_MANY_GEOFENCES'' | ||
| + | - ''GeofenceStatusCodes.GEOFENCE_TOO_MANY_PENDING_INTENTS''. | ||
| + | - se obține tipul de tranziție geografică <code java> | ||
| + | int geofenceTransition = geofencingEvent.getGeofenceTransition(); | ||
| + | </code> | ||
| + | - se construiește un mesaj explicativ conținând | ||
| + | - tipul tranziției: ''Geofence.GEOFENCE_TRANSITION_ENTER'' / ''Geofence.GEOFENCE_TRANSITION_EXIT''; | ||
| + | - identificatorii restricțiilor legate de poziționarea geografică: | ||
| + | - se obține lista tuturor restricțiilor legate de poziționarea geografică <code java> | ||
| + | List<Geofence> triggeringGeofences = geofencingEvent.getTriggeringGeofences(); | ||
| + | </code> | ||
| + | - se parcurge lista și pentru fiecare obiect se obține identificatorul unic (''getRequestId()''); | ||
| + | - se transmite mesajul explicativ prin intermediul unei notificări (ca parametru al metodei ''sendNotification()''). | ||
| **10.** Să se încarce modificările realizate în cadrul depozitului 'Laborator10' de pe contul Github personal, folosind un mesaj sugestiv. <code> | **10.** Să se încarce modificările realizate în cadrul depozitului 'Laborator10' de pe contul Github personal, folosind un mesaj sugestiv. <code> | ||
