Differences

This shows you the differences between two versions of the page.

Link to this comparison view

eim:laboratoare:laborator10 [2016/05/09 10:49]
radu.stoenescu [Configurare]
eim:laboratoare:laborator10 [2020/03/19 09:19] (current)
madalina.barbu [Activitate de Laborator]
Line 3: Line 3:
 Datele cu privire la localizare îmbunătățesc experiența utilizatorului,​ întrucât unele informații furnizate de aplicații pot fi contextualizate în funcție de regiunea în care acesta se găsește în mod curent. O astfel de oportunitate poate fi exploatată cu atât mai mult în cadrul dispozitivelor mobile, care dispun de componente specializate pentru determinarea automată a poziției geografice curente (senzor pentru GPS, folosirea informațiilor furnizate de celula de telefonie mobilă). Datele cu privire la localizare îmbunătățesc experiența utilizatorului,​ întrucât unele informații furnizate de aplicații pot fi contextualizate în funcție de regiunea în care acesta se găsește în mod curent. O astfel de oportunitate poate fi exploatată cu atât mai mult în cadrul dispozitivelor mobile, care dispun de componente specializate pentru determinarea automată a poziției geografice curente (senzor pentru GPS, folosirea informațiilor furnizate de celula de telefonie mobilă).
  
-În cadrul SDK-ului Android, sunt implementate API-uri pentru proiectarea și dezvoltarea unor aplicații care pun la dispoziția utilizatorilor informații cu privire la **locația în care se află**, disponibile prin intermediul unor metode, fără a fi necesară interacțiunea propriu-zisă cu componentele responsabile cu determinarea acestor date. Totodată, există posibilitatea de a identifica **punctele de interes** care se găsesc în proximitatea utilizatorului,​ la un moment dat de timp.+În cadrul SDK-ului Android, sunt implementate API-uri pentru proiectarea și dezvoltarea unor aplicații care pun la dispoziția utilizatorilor informații cu privire la **locația în care se află**, disponibile prin intermediul unor metode, fără a fi necesară interacțiunea propriu-zisă cu componentele responsabile cu determinarea acestor date. Totodată, există posibilitatea de a identifica **punctele de interes** care se găsesc în proximitatea utilizatorului,​ la un moment dat
 + 
 +Există și alte [[https://​blog.rapidapi.com/​top-map-apis/​|API-uri]] pentru localizare, geoconding, hărți, indicații de navigație, fiecare cu avantajele și dezavantajele asociate. În acest laborator se vor folosi serviciile Google, care sunt cotate printre cele mai rapide, diverse, dar și scumpe pentru volum mare de apeluri 
  
 Astfel, funcționalitățile oferite pentru dezvoltatori sunt: Astfel, funcționalitățile oferite pentru dezvoltatori sunt:
Line 15: Line 18:
 ===== Configurare ===== ===== Configurare =====
  
-**1.** În cadrul [[https://code.google.com/​apis/​console/​|Consolei Google API]], se activează API-ul //Google Maps for Android//, generându-se totodată și o cheie Android prin care aplicația care rulează pe dispozitivul mobil va putea să acceseze o astfel de funcționalitate.+**1.** În cadrul [[https://console.developers.google.com|Consolei Google API]], se activează API-ul //Google Maps Android ​API//, generându-se totodată și o cheie Android prin care aplicația care rulează pe dispozitivul mobil va putea să acceseze o astfel de funcționalitate.
  
 <note important>​Trebuie să fiți autentificați folosind numele de utilizator și parola contului Google, altfel va trebui să vă creați un astfel de cont.</​note>​ <note important>​Trebuie să fiți autentificați folosind numele de utilizator și parola contului Google, altfel va trebui să vă creați un astfel de cont.</​note>​
  
-<note important>​În situația în care nu a fost creat un proiect Google API în prealabil, trebuie realizat acest lucru, prin selectarea opțiunii //Create Project...//.</​note>​+<note important>​ 
 +În situația în care nu a fost creat un proiect Google API în prealabil, trebuie realizat acest lucru, prin selectarea opțiunii //Select a project//.
  
-  * În secțiunea //APIs & auth// → //APIs//, în categoria //Google Maps APIs//, se accesează opțiunea //Google Maps Android APIs//, activându-se acest serviciu.\\ \\ {{ :​eim:​laboratoare:​laborator10:​configurare01.png?​nolink&​600 }}\\ {{ :​eim:​laboratoare:​laborator10:​configurare02.png?​nolink }}\\ Ulterior, vor putea fi vizualizate statistici cu privire la gradul de utilizare al acestui serviciu (numărul de solicitări pe o perioadă de 28 de zile, defalcate pe țări / teritorii, metode, utilizatori,​ indicându-se și numărul de erori înregistrate precum și referințele prin intermediul altor legături Internet).\\ \\ {{ :​eim:​laboratoare:​laborator10:​configurare03.png?​nolink }}\\ {{ :​eim:​laboratoare:​laborator10:​configurare04.png?​nolink&​600 }}+{{ :​eim:​laboratoare:​laborator10:​createproject01new.png?​nolink&​700 }}
  
-  ​* Î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. +Se va afișa o fereastră din care poate fi selectat proiectul dorit (împărțite în categoriile //Recent//, respectiv //All//). În situația în care nu există nici un proiect, acesta poate fi creat, prin accesarea pictogramei corespunzătoare semnului //+//. 
-    ​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>​ +{{ :​eim:​laboratoare:​laborator10:​createproject02new.png?​nolink&​600 }} 
-student@pdsd2015:~$ export PATH=$PATH:/​usr/​local/​java/​jdk1.8.0_31/bin + 
-student@pdsd2015:~$ keytool -list -v -keystore ~/​.android/​debug.keystore -alias androiddebugkey -storepass android -keypass android +Pentru fiecare proiect trebuie să se precizeze următorii parametri:​ 
-</​code>​ +  * denumirea;​ 
-      * Windows <​code>​ +  * identificatorul pentru proiect (este generat în mod automat, însă poate fi configurat suplimentar de către utilizator). 
-C:​\Users\Student>​ set PATH=%PATH%;​C:​\Program Files\Java\jdk_1.8.0_31\bin+ 
 +{{ :​eim:​laboratoare:​laborator10:​createproject03new.png?​nolink }} 
 + 
 +În situația în care există un singur proiect, acesta va fi selectat în mod implicit ca proiect curent. 
 + 
 +{{ :​eim:​laboratoare:​laborator10:​createproject04new.png?​nolink&​700 }} 
 +</​note>​ 
 + 
 +  ​* În secțiunea //Library// → //Google APIs//, în categoria //Google Maps APIs//, se accesează opțiunea //Google Maps Android API//, activându-se acest serviciu (prin accesarea butonului //​Enable//​). 
 + 
 +{{ :​eim:​laboratoare:​laborator10:​configurare01new.png?​nolink&​700 }} 
 + 
 +{{ :​eim:​laboratoare:​laborator10:​configurare02new.png?​nolink&​700 }} 
 + 
 +Acest API nu va putea fi însă utilizat în situația în care nu sunt create credențialele (o cheie pentru API), necesare pentru a putea accesa orice serviciu Google. 
 + 
 +  * Credențialele pot fi obținute:​ 
 +    *  prin accesarea butonului //Google Maps Android API// → //Create credentials//,​ care implică următoarele etape:\\ {{ :​eim:​laboratoare:​laborator10:​configurare03new.png?​nolink&​800 }}\\ **1.** indicarea tipului de API folosit (în cazul de față //Google Maps Android API//)\\ {{ :​eim:​laboratoare:​laborator10:​configurare04new.png?​nolink }}\\ **2.** generarea (automată) propriu-zisă a cheii, urmată de apăsarea butonului \\Done\\;\\ {{ :​eim:​laboratoare:​laborator10:​configurare05new.png?​nolink }}\\ În secțiunea //​Credentials//​ va putea fi vizualizată cheia creată, împreună cu denumirea sa. Pentru cheile ​care nu sunt restricționate, ​va fi vizibil semnul :!: care indică faptul că aceasta poate fi utilizată ​din orice context, ceea ce poate implica o breșă ​de securitate\\ {{ :​eim:​laboratoare:​laborator10:​configurare06new.png?​nolink }}\\ Prin accesarea cheii respectiveaceasta poate fi restricționată ​în sensul în care se precizează **contextul în care este folosită cheia** (în cazul de față, aplicații Android - //Android apps//), **denumirea pachetului corespunzător aplicației Android din care cheia respectivă poate fi folosită** precum și **certificatul digital SHA-1 corespunzător mașinii ​de pe care este instalată aplicația Android pe dispozitivul mobil**.\\ Se va indica și comanda care va trebui rulată pentru generarea certificatului digital respectiv; 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>​ 
 +student@eg-106:~$ export PATH=$PATH:/​usr/​local/​java/​jdk1.8.0_131/bin 
 +student@eg-106:~$ keytool -list -v -keystore ~/​.android/​debug.keystore -alias androiddebugkey -storepass android -keypass android 
 +</​code>​\\ Windows <​code>​ 
 +C:​\Users\Student>​ set PATH=%PATH%;​C:​\Program Files\Java\jdk_1.8.0_131\bin
 C:​\Users\Student>​ keytool -list -v -keystore "​%USERPROFILE%\.android\debug.keystore"​ -alias androiddebugkey -storepass android -keypass android C:​\Users\Student>​ keytool -list -v -keystore "​%USERPROFILE%\.android\debug.keystore"​ -alias androiddebugkey -storepass android -keypass android
-</​code>​ +</​code>​\\ Vor fi furnizate mai multe tipuri de amprente digitale, pentru cheia publică de tip Android fiind necesară cea de tip SHA-1 <​code>​
-    * Vor fi furnizate mai multe tipuri de amprente digitale, pentru cheia publică de tip Android fiind necesară cea de tip SHA-1 <​code>​+
 Alias name: androiddebugkey Alias name: androiddebugkey
-Creation date: 25.02.2012+Creation date: Mar 5, 2015
 Entry type: PrivateKeyEntry Entry type: PrivateKeyEntry
 Certificate chain length: 1 Certificate chain length: 1
Line 41: Line 65:
 Owner: CN=Android Debug, O=Android, C=US Owner: CN=Android Debug, O=Android, C=US
 Issuer: CN=Android Debug, O=Android, C=US Issuer: CN=Android Debug, O=Android, C=US
-Serial number: ​3995d730 +Serial number: ​4a38a96a 
-Valid from: Sat Feb 25 00:31:37 EET 2012 until: ​Mon Feb 17 00:31:37 EET 2042+Valid from: Thu Mar 05 13:17:44 EET 2015 until: ​Sat Feb 25 13:17:44 EET 2045
 Certificate fingerprints:​ Certificate fingerprints:​
-         ​MD5:  ​88:5B:9A:C8:7A:1A:C9:BD:3D:90:2E:CF:93:CF:C3:51 +         ​MD5:  ​FC:1F:95:45:78:ED:50:C6:EE:8E:02:0A:3D:A5:80:D3 
-         ​SHA1: ​ED:A8:BA:A9:70:5E:0A:B2:8E:3C:73:AF:4C:69:35:E8:AA:C9:79:5E +         ​SHA1: ​C7:02:98:BB:AD:1C:6E:D1:3A:35:50:8B:88:78:B6:D3:B7:9F:66:C0 
-         ​SHA256: ​5E:CF:7A:86:FC:D9:39:93:EE:92:D6:06:EA:32:E7:06:7A:9C:48:38:D7+         ​SHA256: ​B3:D9:98:33:92:71:2D:CE:65:19:89:73:2A:64:3C:97:B9:37:A1:93:8C
-85:D6:56:EF:C2:F6:9F:3A:84:CF:4D+50:4F:E1:13:C4:21:C7:08:94:AC:A5
          ​Signature algorithm name: SHA256withRSA          ​Signature algorithm name: SHA256withRSA
          ​Version:​ 3          ​Version:​ 3
Line 56: Line 80:
 SubjectKeyIdentifier [ SubjectKeyIdentifier [
 KeyIdentifier [ KeyIdentifier [
-0000: 71 51 CC 58 87 D2 D3 91   ​D0 D2 89 67 F2 C7 E1 B7  qQ.X.......g...+0000: 99 78 63 24 A0 64 DF A8   67 45 8E 82 C6 8E 53 D1  .xc$.d..gE....S
-0010: 2A AF DB DF                                        *...+0010: B8 C1 89 75                                        ...u
 ] ]
 ] ]
-</​code>​ +</​code>​\\ se accesează butonul //Add package name and fingerprint// pentru a se specifica denumirea pachetului corespunzător aplicației Android care va accesa ​API-ul respectiv și certificatul SHA-1\\ {{ :​eim:​laboratoare:​laborator10:​configurare07new.png?nolink }}\\ În secțiunea //Credentials// pot fi vizualizate cheile pentru API generate anterior\\ {{ :​eim:​laboratoare:​laborator10:​configurare08new.png?nolink }} 
-    * Se selectează butonul //Create New Key// din secțiunea //​Public ​API access//​.\\ ​\\ {{ :​eim:​laboratoare:​laborator10:​configurare05.png?nolink }} +    în secțiunea //​Credentials//​prin accesarea opțiunii //Create credentials//​ din care este selectat tipul de cheie necesar (în cazul de față //API key//); dacă nu se cunoaște tipul de cheie necesar, se poate selecta valoarea //Help me choose//\\ {{ :​eim:​laboratoare:​laborator10:​configurare09new.png?nolink }}\\ cheia respectivă va fi generată în mod automat, existând posibilitatea ca aceasta să fie restricționată,​ pentru a nu fi accesată din orice context\\ {{ :​eim:​laboratoare:​laborator10:​configurare10new.png?nolink }}
-    * Se specifică proprietățile cheii publice ce se dorește a fi generată:​ +
-      * tipul cheii publice - //Android Key//\\ \\ {{ :​eim:​laboratoare:​laborator10:​configurare06.png?nolink }} +
-      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\\ ​\\ {{ :​eim:​laboratoare:​laborator10:​configurare07.png?nolink&​600 ​}} +
-    * Se identifică valoarea cheii publice care va putea fi utilizată.\\ \\ {{ :​eim:​laboratoare:​laborator10:​configurare08.png?nolink&​800 ​}}+
  
 **2.** Pe dispozitivul mobil (fizic sau virtual) pe care se va rula aplicația care accesează serviciul de localizare, trebuie să se găsească cea mai recentă versiune de //Google Play Services//, asociindu-se totodată contul de utilizator Google pentru care s-a generat cheia publică. **2.** Pe dispozitivul mobil (fizic sau virtual) pe care se va rula aplicația care accesează serviciul de localizare, trebuie să se găsească cea mai recentă versiune de //Google Play Services//, asociindu-se totodată contul de utilizator Google pentru care s-a generat cheia publică.
Line 72: Line 92:
  
   * Linux <​code>​   * Linux <​code>​
-student@pdsd2015:~$ cd /​opt/​android-sdk-linux/​tools +student@eg-106:~$ cd /​opt/​android-sdk-linux/​tools 
-student@pdsd2015:/​opt/​android-sdk-linux/​tools$ sudo ./android+student@eg-106:/​opt/​android-sdk-linux/​tools$ sudo ./android
 </​code>​ </​code>​
   * Windows - se deschide un terminal cu drepturi de administrator <​code>​   * Windows - se deschide un terminal cu drepturi de administrator <​code>​
Line 80: Line 100:
 </​code>​ </​code>​
  
-{{ :​eim:​laboratoare:​laborator10:​configurare09.png?​nolink&​600 }}+{{ :​eim:​laboratoare:​laborator10:​configurare11new.png?​nolink&​600 }}
  
 Astfel, se instalează următoarele pachete: Astfel, se instalează următoarele pachete:
Line 86: Line 106:
   * din secțiunea //Extras//, pachetul //Google Play Services//.   * din secțiunea //Extras//, pachetul //Google Play Services//.
  
-Biblioteca pentru accesarea funcționalității oferite ​de serviciul de localizare se găsește la ''<​android-sdk>​/extras/google/google_play_services/libproject/google-play-services_lib''​.+Posibilitatea ​de instalare a acestor pachete există și din mediul integrat de dezvoltare Android Studio, prin accesarea opțiunii ​//Tools// → //Android// → //SDK Manager//, secțiunea //SDK Tools//.
  
-Configurarea în cazul folosirii Android Studio se face conform [[https://​developers.google.com/​android/​guides/​setup#​add_google_play_services_to_your_project|ghicului]].+{{ :eim:​laboratoare:​laborator10:​configurare12newandroidstudio.png?​nolink&​800 }}
  
-În mediul integrat de dezvoltare Eclipse Luna SR1a (4.4.1), se realizează o referință către biblioteca //Google Play Services//, astfel descărcată. +<​hidden>​ 
-  * se accesează //File// → //Import// → //Android// → //Existing Android Code Into Workspace//​\\ \\ {{ :​eim:​laboratoare:​laborator10:​configurare10.png?​nolink&​500 }} +Biblioteca pentru accesarea funcționalității oferite de serviciul de localizare ​se găsește ​la ''<​android-sdk>​/extras/google/google_play_services/libproject/​google-play-services_lib''​.
-  * se indică locația unde se găsește ​instalată biblioteca ​//Google Play Services//, creându-se o copie a acestuia în spațiul de lucru (se bifează opțiunea //Copy projects into workspace//​)\\ \\ {{ :​eim:​laboratoare:​laborator10:​configurare11.png?​nolink&​800 }}+
  
-**4.** În mediul integrat de dezvoltare ​Eclipse Luna SR1a (4.4.1), se creează un proiect corespunzător unei aplicații Android, având următoarele proprietăți:​+În mediul integrat de dezvoltare Eclipse, se realizează o referință către biblioteca //Google Play Services//, astfel descărcată. 
 +  * se accesează //File// → //Import// → //Android// → //Existing Android Code Into Workspace//​\\ \\ {{ :​eim:​laboratoare:​laborator10:​configurare13.png?​nolink&​500 }} 
 +  * se indică locația unde se găsește instalată biblioteca //Google Play Services//, creându-se o copie a acestuia în spațiul de lucru (se bifează opțiunea //Copy projects into workspace//​)\\ \\ {{ :​eim:​laboratoare:​laborator10:​configurare14.png?​nolink&​800 }} 
 +</​hidden>​ 
 + 
 +**4.** În mediul integrat de dezvoltare ​Android Studio, se creează un proiect corespunzător unei aplicații Android, având următoarele proprietăți:​
  
   * denumirea pachetului care identifică aplicația Android în mod unic trebuie să fie aceeași cu cea precizată în momentul în care a fost generată cheia publică;   * denumirea pachetului care identifică aplicația Android în mod unic trebuie să fie aceeași cu cea precizată în momentul în care a fost generată cheia publică;
  
-  * trebuie să existe o referință către biblioteca //Google Play Services// (click dreapta pe denumirea proiectului în //Package Explorer// → //​Properties//​),​ se accesează opțiunea //Android// și se specifică referința către aceasta respectivă în secțiunea //Library// (accesând butonul //Add//)\\ \\ {{ :​eim:​laboratoare:​laborator10:​configurare12.png?​nolink&​800 }}+  * în fișierul ''​build.gradle''​ să se specifice dependința către biblioteca Google Play Services (''​com.google.android.gms:​play-services''​),​ în secțiunea ''​dependencies'':​ <file build.gradle>​ 
 +... 
 +dependencies { 
 +  ... 
 +  compile '​com.google.android.gms:​play-services:​10.2.4'​ 
 +
 +</​file>​ 
 + 
 +<​hidden>​ 
 +  * pentru **Eclipse**, ​trebuie să existe o referință către biblioteca //Google Play Services// (click dreapta pe denumirea proiectului în //Package Explorer// → //​Properties//​),​ se accesează opțiunea //Android// și se specifică referința către aceasta respectivă în secțiunea //Library// (accesând butonul //Add//)\\ \\ {{ :​eim:​laboratoare:​laborator10:​configurare15.png?​nolink&​800 }} 
 +</​hidden>​
  
   * în fișierul ''​AndroidManifest.xml''​   * în fișierul ''​AndroidManifest.xml''​
-    * se indică permisiunile necesare: <code xml>+    * se indică permisiunile necesare: <file xml AndroidManifest.xml>
 <​uses-permission <​uses-permission
   android:​name="​android.permission.ACCESS_COARSE_LOCATION"​ />   android:​name="​android.permission.ACCESS_COARSE_LOCATION"​ />
Line 114: Line 148:
 <​uses-permission <​uses-permission
   android:​name="​android.permission.WRITE_EXTERNAL_STORAGE"​ />   android:​name="​android.permission.WRITE_EXTERNAL_STORAGE"​ />
-</code>+</file>
       * ''​android.permission.ACCESS_COARSE_LOCATION''​ - obține locația utilizatorului folosind informațiile preluate prin rețele fără fir și datele corespunzătoare celulei în care se găsește dispozitivul mobil;       * ''​android.permission.ACCESS_COARSE_LOCATION''​ - obține locația utilizatorului folosind informațiile preluate prin rețele fără fir și datele corespunzătoare celulei în care se găsește dispozitivul mobil;
       * ''​android.permission.ACCESS_FINE_LOCATION''​ - procură locația utilizatorului prin intermediul coordonatelor obținute de la sistemul de poziționare (GPS - //eng.// Global Positioning System);       * ''​android.permission.ACCESS_FINE_LOCATION''​ - procură locația utilizatorului prin intermediul coordonatelor obținute de la sistemul de poziționare (GPS - //eng.// Global Positioning System);
Line 128: Line 162:
     * în secțiunea ''<​application>​ ... </​application>''​ se indică:     * în secțiunea ''<​application>​ ... </​application>''​ se indică:
       * cheia publică utilizată pentru accesarea funcționalității legată de serviciile de localizare <code xml>       * cheia publică utilizată pentru accesarea funcționalității legată de serviciile de localizare <code xml>
-<meta-data+<metadata
   android:​name="​com.google.android.maps.v2.API_KEY"​   android:​name="​com.google.android.maps.v2.API_KEY"​
-  android:​value="​AIzaSyA650lJNGrJFLQ1Ns5L0FHY90XnHhO-P5s" />+  android:​value="​AIzaSyARiJhQ-Lj6HnzQwq7MqAvjWQtNkjVcprs" />
 </​code>​ </​code>​
       * versiunea folosită pentru biblioteca Google Play Services (preluată din cadrul proiectului referit) <code xml>       * versiunea folosită pentru biblioteca Google Play Services (preluată din cadrul proiectului referit) <code xml>
-<meta-data+<metadata
   android:​name="​com.google.android.gms.version"​   android:​name="​com.google.android.gms.version"​
   android:​value="​@integer/​google_play_services_version"​ />   android:​value="​@integer/​google_play_services_version"​ />
Line 139: Line 173:
     * pentru a se asigura faptul că funcționalitatea nu va putea fi accesată decât prin intermediul aplicației Android, se va defini o permisiune, definindu-se o protecție la nivel de semnătură:<​code xml>     * pentru a se asigura faptul că funcționalitatea nu va putea fi accesată decât prin intermediul aplicației Android, se va defini o permisiune, definindu-se o protecție la nivel de semnătură:<​code xml>
 <​permission <​permission
-  android:​name="​ro.pub.cs.systems.pdsd.lab10.googlemaps.permission.MAPS_RECEIVE"​+  android:​name="​ro.pub.cs.systems.eim.lab10.googlemaps.permission.MAPS_RECEIVE"​
   android:​protectionLevel="​signature"​ />   android:​protectionLevel="​signature"​ />
 <​uses-permission <​uses-permission
-  android:​name="​ro.pub.cs.systems.pdsd.lab10.googlemaps.permission.MAPS_RECEIVE"​ />+  android:​name="​ro.pub.cs.systems.eim.lab10.googlemaps.permission.MAPS_RECEIVE"​ />
 </​code>​ </​code>​
  
-  * se precizează regulile pentru obfuscatorul Proguard (în fișierul ''​proguard-project.txt''​ din rădăcina proiectului), astfel încât acesta să nu elimine clasele necesare:\\ <code java>+  * se precizează regulile pentru obfuscatorul Proguard (în fișierul ''​proguard-rules.pro''​ din directorul //app//), astfel încât acesta să nu elimine clasele necesare:\\ <code java>
 -keep class * extends java.util.ListResourceBundle { -keep class * extends java.util.ListResourceBundle {
   protected Object[][] getContents();​   protected Object[][] getContents();​
Line 161: Line 195:
 </​code>​ </​code>​
  
 +<​hidden>​
 <note warning>​Pentru rularea proiectului Eclipse (construirea pachetului ''​.apk''​) este necesară mai multă memorie ce trebuie alocată mașinii virtuale Java (datorate referinței către biblioteca Google Play Services), aceasta realizându-se prin intermediul valorilor furnizate în cadrul fișierului de configurare ''​eclipse.ini'':​\\ <​code>​ <note warning>​Pentru rularea proiectului Eclipse (construirea pachetului ''​.apk''​) este necesară mai multă memorie ce trebuie alocată mașinii virtuale Java (datorate referinței către biblioteca Google Play Services), aceasta realizându-se prin intermediul valorilor furnizate în cadrul fișierului de configurare ''​eclipse.ini'':​\\ <​code>​
 --launcher.XXMaxPermSize --launcher.XXMaxPermSize
Line 173: Line 208:
 </​code>​ </​code>​
 </​note>​ </​note>​
 +</​hidden>​
 +
 ==== Dispozitiv Fizic ==== ==== Dispozitiv Fizic ====
  
-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//​).+Pentru accesarea funcționalităților legate de locație pe dispozitivul fizic este necesar să se activeze opțiunea //​Location//​ din secțiunea de configurări (//​Settings//​ → //​Personal//​).
  
 {{ :​eim:​laboratoare:​laborator10:​physical_device_01.png?​nolink&​400 }} {{ :​eim:​laboratoare:​laborator10:​physical_device_01.png?​nolink&​400 }}
 +
 +Valoarea configurației //​Location//​ trebuie să aibă valoarea //On//, pentru ca serviciile de localizare să poată fi utilizate. De asemenea, sunt indicate aplicațiile Android care au folosit serviciile de localizare.
 +
 +{{ :​eim:​laboratoare:​laborator10:​physical_device_02.png?​nolink&​400 }}
  
 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//). 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//).
Line 184: Line 225:
   * //Device only// - locația este determinată folosind doar informațiile furnizate de sistemul global de poziționare GPS.   * //Device only// - locația este determinată folosind doar informațiile furnizate de sistemul global de poziționare GPS.
    
-{{ :​eim:​laboratoare:​laborator10:​physical_device_02.png?​nolink&​400 }}+{{ :​eim:​laboratoare:​laborator10:​physical_device_03.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>​ <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 ====
  
Line 206: Line 248:
 De asemenea, este implementată și funcționalitatea prin intermediul căreia poate fi vizualizată poziția precizată în cadrul unei hărți Google. De asemenea, este implementată și funcționalitatea prin intermediul căreia poate fi vizualizată poziția precizată în cadrul unei hărți Google.
  
-{{ :​eim:​laboratoare:​laborator10:​genymotion_mapping_service.png?​nolink&​600 }} +{{ :​eim:​laboratoare:​laborator10:​genymotion_gps_03.png?​nolink&​800 }}
- +
-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. +
-  +
-{{ :​eim:​laboratoare:​laborator10:​genymotion_location_services.png?​nolink&​400 }} +
- +
-<​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>​ +
  
 === AVD === === AVD ===
Line 227: Line 259:
 {{ :​eim:​laboratoare:​laborator10:​avd_configuration.png?​nolink&​600 }} {{ :​eim:​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.+Controlul poziției curente poate fi realizat prin intermediul perspectivei //Android Debug Monitor// din Android Studio, 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. 
 + 
 +{{ :​eim:​laboratoare:​laborator10:​avd_emulator_control_new.png?​nolink }}
  
-{{ :​eim:​laboratoare:​laborator10:​avd_emulator_control.png?​nolink&​600 }} 
 ===== Gestiunea unei Hărți Google ===== ===== Gestiunea unei Hărți Google =====
  
Line 262: Line 295:
  
 if (googleMap == null) { if (googleMap == null) {
-  ​if (googleMap == null) { +  ((MapFragment)getFragmentManager().findFragmentById(R.id.google_map)).getMapAsync(new OnMapReadyCallback() { 
-    ​((MapFragment)getFragmentManager().findFragmentById(R.id.google_map)).getMapAsync(new OnMapReadyCallback() { +    @Override 
-      @Override +    public void onMapReady(GoogleMap readyGoogleMap) { 
-      public void onMapReady(GoogleMap readyGoogleMap) { +      googleMap = readyGoogleMap;​ 
-        googleMap = readyGoogleMap;​ +    
-      +  });
-    }); +
-  }+
 } }
 </​code>​ </​code>​
Line 597: Line 628:
 Informațiile de interes sunt starea referitoare la transmiterea actualizărilor periodice, respectiv la cea mai recentă locație. Informațiile de interes sunt starea referitoare la transmiterea actualizărilor periodice, respectiv la cea mai recentă locație.
  
-===== Codificare Geografică Inversă (Geocoding) ===== 
  
 +===== Codificare Geografică Inversă (Geocoding),​ opțional =====
 +
 +Acest exercițiu este opțional, cere activarea facturării (Billing) în contul google pentru care activati Geocoding API.  ​
 +<​spoiler>​
 În Android, clasa [[http://​developer.android.com/​reference/​android/​location/​Geocoder.html|Geocoder]] permite realizarea de conversii dintre coordonate GPS (latitudine / longitudine) și adresa poștală, operație denumită codificare geografică inversă. În Android, clasa [[http://​developer.android.com/​reference/​android/​location/​Geocoder.html|Geocoder]] permite realizarea de conversii dintre coordonate GPS (latitudine / longitudine) și adresa poștală, operație denumită codificare geografică inversă.
  
Line 745: Line 779:
 } }
 </​code>​ </​code>​
 +
 +</​spoiler>​
  
 ===== Implementarea Zonelor de Restricție Geografică (Geofencing) ===== ===== Implementarea Zonelor de Restricție Geografică (Geofencing) =====
Line 850: Line 886:
       android:​name="​.graphicuserinterface.GoogleMapsGeofenceEventActivity"​       android:​name="​.graphicuserinterface.GoogleMapsGeofenceEventActivity"​
       android:​parentActivityName="​.graphicuserinterface.GoogleMapsActivity">​       android:​parentActivityName="​.graphicuserinterface.GoogleMapsActivity">​
-      <meta-data+      <metadata
         android:​name="​android.support.PARENT_ACTIVITY"​         android:​name="​android.support.PARENT_ACTIVITY"​
         android:​value="​.graphicuserinterface.GoogleMapsActivity"/>​         android:​value="​.graphicuserinterface.GoogleMapsActivity"/>​
Line 1011: Line 1047:
 ===== Activitate de Laborator ===== ===== Activitate de Laborator =====
  
-**1.** Să se acceseze [[https://code.google.com/​apis/​console/​|Google Developer'​s Console]], după ce a fost realizată autentificarea cu datele contului Google (nume de utilizator, parolă):+**1.** Să se acceseze [[https://console.developers.google.com|Google Developer'​s Console]], după ce a fost realizată autentificarea cu datele contului Google (nume de utilizator, parolă):
   * se obține un număr de proiect (dacă această operație nu a fost realizată anterior);   * se obține un număr de proiect (dacă această operație nu a fost realizată anterior);
   * se activează serviciul //Google Maps Android API//;   * se activează serviciul //Google Maps Android API//;
Line 1023: Line 1059:
 **2.** În contul Github personal, să se creeze un depozit denumit '​Laborator10'​. Inițial, acesta trebuie să fie gol (nu trebuie să bifați nici adăugarea unui fișier ''​README.md'',​ nici a fișierului ''​.gitignore''​ sau a a fișierului ''​LICENSE''​). **2.** În contul Github personal, să se creeze un depozit denumit '​Laborator10'​. Inițial, acesta trebuie să fie gol (nu trebuie să bifați nici adăugarea unui fișier ''​README.md'',​ nici a fișierului ''​.gitignore''​ sau a a fișierului ''​LICENSE''​).
  
-**3.** Să se cloneze în directorul de pe discul local conținutul depozitului la distanță de la [[https://​www.github.com/​pdsd2015/​Laborator10|]]. ​+**3.** Să se cloneze în directorul de pe discul local conținutul depozitului la distanță de la [[https://​www.github.com/​eim-lab/​Laborator10|]]. ​
  
 În urma acestei operații, directorul Laborator10 va trebui să se conțină directoarele ''​labtasks''​ și ''​solutions''​. ​ În urma acestei operații, directorul Laborator10 va trebui să se conțină directoarele ''​labtasks''​ și ''​solutions''​. ​
  
 <​code>​ <​code>​
-student@pdsd2015:~$ git clone https://www.github.com/pdsd2015/​Laborator10+student@eg-106:~$ git clone https://​github.com/​eim-lab/​Laborator10.git
 </​code>​ </​code>​
  
 **4.** Să se încarce conținutul descărcat în cadrul depozitului '​Laborator10'​ de pe contul Github personal. <​code>​ **4.** Să se încarce conținutul descărcat în cadrul depozitului '​Laborator10'​ de pe contul Github personal. <​code>​
-student@pdsd2015:~$ cd Laborator10 +student@eg-106:~$ cd Laborator10 
-student@pdsd2015:​~/​Laborator10$ git remote add Laborator10_perfectstudent https://​github.com/​perfectstudent/​Laborator10 +student@eg-106:​~/​Laborator10$ git remote add Laborator10_perfectstudent https://​github.com/​perfectstudent/​Laborator10 
-student@pdsd2015:​~/​Laborator10$ git push Laborator10_perfectstudent master+student@eg-106:​~/​Laborator10$ git push Laborator10_perfectstudent master
 </​code>​ </​code>​
  
Line 1041: Line 1077:
   * în cazul în care se utilizează un dispozitiv fizic, acesta trebuie să ruleze un sistem de operare Android cu o versiune ulterioară 2.2, având asociat un cont Google.   * în cazul în care se utilizează un dispozitiv fizic, acesta trebuie să ruleze un sistem de operare Android cu o versiune ulterioară 2.2, având asociat un cont Google.
  
-<​note>​În situația în care nu se reușește configurarea unui dispozitiv virtual, se poate folosi [[http://​pdsd2015.andreirosucojocaru.ro/​resources/​Genymobile.tar.gz|o imagine Nexus S (API 16)]] care trebuie plasată în directorul ''​$HOME''​.</​note>​ +**6.** Să se importe în mediul integrat de dezvoltare ​Android Studio proiectul ​''​GoogleMapsPlaces''​ din directorul ''​labtasks''​.
- +
-**6.** Să se importe în mediul integrat de dezvoltare ​Eclipse Luna SR1a (4.4.1) proiectele ​''​google-play-service_lib''​ și ''​01-GoogleMapsPlaces''​ din directorul ''​labtasks'' ​(în această ordine).+
  
 Se dorește să se implementeze o aplicație care să navigheze către o locație specificată prin intermediul coordonatelor GPS (latitudine / longitudine) și pentru care se dorește plasarea unui reper pe hartă, însoțit de o denumire. Se dorește să se implementeze o aplicație care să navigheze către o locație specificată prin intermediul coordonatelor GPS (latitudine / longitudine) și pentru care se dorește plasarea unui reper pe hartă, însoțit de o denumire.
Line 1073: Line 1107:
   - se șterg toate reperele din lista de locații (''​places''​),​ notificându-se și adaptorul corespunzător obiectului de tip ''​Spinner''​ (''​placesAdapter''​) de această modificare, astfel încât acesta să fie actualizat corespunzător.   - se șterg toate reperele din lista de locații (''​places''​),​ notificându-se și adaptorul corespunzător obiectului de tip ''​Spinner''​ (''​placesAdapter''​) de această modificare, astfel încât acesta să fie actualizat corespunzător.
  
-**7.** Să se importe în mediul integrat de dezvoltare ​Eclipse Luna SR1a (4.4.1) proiectele ​''​google-play-service_lib''​ și ''​02-GoogleMapsLocationUpdate''​ din directorul ''​labtasks'' ​(în această ordine).+**7.** Să se importe în mediul integrat de dezvoltare ​Android Studio proiectul ​''​GoogleMapsLocationUpdate''​ din directorul ''​labtasks''​.
  
 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.
Line 1113: Line 1147:
   - se activează controalele grafice ''​latitudeEditText'',​ ''​longitudeEditText'',​ ''​navigateToLocationButton'',​ acestea având un conținut vid.   - se activează controalele grafice ''​latitudeEditText'',​ ''​longitudeEditText'',​ ''​navigateToLocationButton'',​ acestea având un conținut vid.
  
-**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.** ​(opțional - necesită Billing pentru Geocoding API)  
 +<​spoiler>​ 
 +Să se importe în mediul integrat de dezvoltare ​Android Studio proiectul ​''​GoogleMapsGeocoding''​ din directorul ''​labtasks''​.
  
 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. 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.
Line 1132: Line 1168:
     - un rând de la o anumită poziție se obține prin intermediul metodei ''​getAddressLine()'';​     - 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.   - 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.
 +</​spoiler>​
  
-**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 ​Android Studio proiectul ​''​GoogleMapsGeofencing''​ din directorul ''​labtasks''​.
  
 Se dorește să se implementeze o aplicație care să monitorizeze activitatea unui dispozitiv mobil raportat la o zonă de restricție geografică. ​ Se dorește să se implementeze o aplicație care să monitorizeze activitatea unui dispozitiv mobil raportat la o zonă de restricție geografică. ​
Line 1145: Line 1182:
 Notificările vor fi generate: Notificările vor fi generate:
  
-  - când utilizatorul intră în zona de restricție geografică\\ \\ {{ :​eim:​laboratoare:​laborator10:​google_maps_geofencing_02_03.png?​nolink&​600 }} +  - când utilizatorul intră în zona de restricție geografică\\ \\ {{:​eim:​laboratoare:​laborator10:​google_maps_geofencing_02.png?​nolink&​300}} {{:​eim:​laboratoare:​laborator10:​google_maps_geofencing_03.png?​nolink&​300}} 
-  - când utilizatorul iese din zona de restricție geografică\\ \\ {{ :​eim:​laboratoare:​laborator10:​google_maps_geofencing_04_05.png?​nolink&​600 }}+  - când utilizatorul iese din zona de restricție geografică\\ \\ {{:​eim:​laboratoare:​laborator10:​google_maps_geofencing_04.png?​nolink&​300}} {{:​eim:​laboratoare:​laborator10:​google_maps_geofencing_05.png?​nolink&​300}}
  
 Detaliile cu privire la evenimentul produs vor putea fi vizualizate în cadrul unei activități dedicate. Detaliile cu privire la evenimentul produs vor putea fi vizualizate în cadrul unei activități dedicate.
Line 1171: Line 1208:
  
 **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>​
-student@pdsd2015:​~/​Laborator10$ git add * +student@eg-106:​~/​Laborator10$ git add * 
-student@pdsd2015:​~/​Laborator10$ git commit -m "​implemented taks for laboratory 10" +student@eg-106:​~/​Laborator10$ git commit -m "​implemented taks for laboratory 10" 
-student@pdsd2015:​~/​Laborator10$ git push Laborator10_perfectstudent master+student@eg-106:​~/​Laborator10$ git push Laborator10_perfectstudent master
 </​code>​ </​code>​
  
Line 1188: Line 1225:
 [[http://​developer.android.com/​reference/​com/​google/​android/​gms/​location/​package-summary.html|Package com.google.android.gms.location]]\\ ​ [[http://​developer.android.com/​reference/​com/​google/​android/​gms/​location/​package-summary.html|Package com.google.android.gms.location]]\\ ​
 [[http://​www.androidhive.info/​2013/​08/​android-working-with-google-maps-v2/​|Android Working with Google Maps v2]]\\ ​ [[http://​www.androidhive.info/​2013/​08/​android-working-with-google-maps-v2/​|Android Working with Google Maps v2]]\\ ​
-[[http://​javapapers.com/​android/​android-get-address-with-street-name-city-for-location-with-geocoding/​|Android Get Address with Street Name, City for Location with Geocoding]]+[[http://​javapapers.com/​android/​android-get-address-with-street-name-city-for-location-with-geocoding/​|Android Get Address with Street Name, City for Location with Geocoding]]\\  
 +[[https://​developers.google.com/​android/​guides/​setup#​add_google_play_services_to_your_project|Setting up Google Play Services in Android Studio]]
eim/laboratoare/laborator10.1462780165.txt.gz · Last modified: 2016/05/09 10:49 by radu.stoenescu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0