Differences

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

Link to this comparison view

eim:laboratoare:laborator10 [2016/05/13 09:13]
tmp.andrei.cojocaru created
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 20: Line 23:
  
 <note important>​ <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...//​ din meniul ​//Select a Project//.+Î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//.
  
-{{ :​eim:​laboratoare:​laborator10:​createproject01.png?nolink }}+{{ :​eim:​laboratoare:​laborator10:​createproject01new.png?nolink&700 }} 
 + 
 +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 //+//. 
 + 
 +{{ :​eim:​laboratoare:​laborator10:​createproject02new.png?​nolink&​600 ​}}
  
 Pentru fiecare proiect trebuie să se precizeze următorii parametri: Pentru fiecare proiect trebuie să se precizeze următorii parametri:
-  * denumirea ​(se generează în mod automat un identificator pentru proiect)+  * denumirea;​ 
-  * locația ​în care este găzduit motorul ​de aplicații;​ +  * identificatorul pentru proiect (este generat ​în mod automat, însă poate fi configurat suplimentar ​de către utilizator).
-  * acordul pentru transmiterea de mesaje electronice cu privire la actualizări despre funcționalități,​ sugestii de performanță,​ sondaje în vederea precizării de opinii despre serviciile oferite, oferte speciale; +
-  * acordul pentru folosirea serviciilor și a API-urilor asociate în acord cu termenii și condițiile specifice.+
  
-{{ :​eim:​laboratoare:​laborator10:​createproject02.png?nolink }}+{{ :​eim:​laboratoare:​laborator10:​createproject03new.png?nolink }}
  
-În cazul în care există un singur proiect, acesta ​este selectat în mod implicit.+În situația ​în care există un singur proiect, acesta ​va fi selectat în mod implicit ​ca proiect curent.
  
-{{ :​eim:​laboratoare:​laborator10:​createproject03.png?nolink }}+{{ :​eim:​laboratoare:​laborator10:​createproject04new.png?nolink&​700 ​}}
 </​note>​ </​note>​
  
-  * În secțiunea //API Manager// → //Overview//, în categoria //Google Maps APIs//, se accesează opțiunea //Google Maps Android API//, activându-se acest serviciu.+  * Î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:​configurare01.png?​nolink&​600 }}+{{ :​eim:​laboratoare:​laborator10:​configurare01new.png?​nolink&​700 }}
  
-{{ :​eim:​laboratoare:​laborator10:​configurare02.png?nolink }}+{{ :​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. 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.
- 
-{{ :​eim:​laboratoare:​laborator10:​configurare09.png?​nolink }} 
  
   * Credențialele pot fi obținute:   * Credențialele pot fi obținute:
-    *  prin accesarea butonului //Go to Credentials//, care implică următoarele etape:\\ **1.** indicarea tipului de API folosit (în cazul de față //Google Maps Android API//​) ​și a locației din care va fi accesat API-ul (în cazul de față //​Android//​),​ pentru a se identifica tipul de cheie care va fi generată\\ {{ :​eim:​laboratoare:​laborator10:​configurare04.png?nolink }}\\ **2.** ​specificarea unei denumiri asociate ​cheii pentru API;\\ {{ :​eim:​laboratoare:​laborator10:​configurare05.png?nolink }}\\ se va indica și comanda care va trebui rulată pentru generarea ​cheii respective; 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>​ +    *  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 respective, aceasta 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@eim2016:~$ export PATH=$PATH:/​usr/​local/​java/​jdk1.8.0_92/bin +student@eg-106:~$ export PATH=$PATH:/​usr/​local/​java/​jdk1.8.0_131/bin 
-student@eim2016:~$ keytool -list -v -keystore ~/​.android/​debug.keystore -alias androiddebugkey -storepass android -keypass android+student@eg-106:~$ keytool -list -v -keystore ~/​.android/​debug.keystore -alias androiddebugkey -storepass android -keypass android
 </​code>​\\ Windows <​code>​ </​code>​\\ Windows <​code>​
-C:​\Users\Student>​ set PATH=%PATH%;​C:​\Program Files\Java\jdk_1.8.0_92\bin+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>​\\ Vor fi furnizate mai multe tipuri de amprente digitale, pentru cheia publică de tip Android fiind necesară cea de tip SHA-1 <​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>​
Line 81: Line 84:
 ] ]
 ] ]
-</​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:​configurare06.png?​nolink }}\\ **3.** se vizualizează cheia pentru API generată care poate fi utilizată pentru accesarea serviciilor Google\\ {{ :​eim:​laboratoare:​laborator10:​configurare07.png?nolink }}\\ În secțiunea //​Credentials//​ pot fi vizualizate cheile pentru API generate anterior\\ {{ :​eim:​laboratoare:​laborator10:​configurare08.png?nolink }} +</​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 }} 
-    * î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:​configurare10.png?nolink }}\\ se indică tipul de cheie necesarîn funcție de locația pe care se găsește aplicația din care va fi accesat ​API-ul (în cazul de față //Android key//)\\ {{ :​eim:​laboratoare:​laborator10:​configurare11.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 automatexistând posibilitatea ca aceasta să fie restricționată, pentru a nu fi accesată ​din orice context\\ {{ :​eim:​laboratoare:​laborator10:​configurare10new.png?nolink }}
  
 **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 89: Line 92:
  
   * Linux <​code>​   * Linux <​code>​
-student@eim2016:~$ cd /​opt/​android-sdk-linux/​tools +student@eg-106:~$ cd /​opt/​android-sdk-linux/​tools 
-student@eim2016:/​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 97: 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 103: Line 106:
   * din secțiunea //Extras//, pachetul //Google Play Services//.   * din secțiunea //Extras//, pachetul //Google Play Services//.
  
 +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//.
 +
 +{{ :​eim:​laboratoare:​laborator10:​configurare12newandroidstudio.png?​nolink&​800 }}
 +
 +<​hidden>​
 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''​. 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''​.
  
 În mediul integrat de dezvoltare Eclipse, se realizează o referință către biblioteca //Google Play Services//, astfel descărcată. Î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:​configurare10.png?​nolink&​500 }} +  * 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:​configurare11.png?​nolink&​800 }}+  * 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 ​preferat (Android Studio ​sau Eclipse), se creează un proiect corespunzător unei aplicații Android, având următoarele proprietăți:​+**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ă;
  
-  * pentru **Android Studio**, trebuie ca î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>​+  * î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 { dependencies {
   ...   ...
-  compile '​com.google.android.gms:​play-services:​8.4.0'+  compile '​com.google.android.gms:​play-services:​10.2.4'
 } }
 </​file>​ </​file>​
  
-  ​* 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:​configurare12.png?​nolink&​800 }}+<​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 137: 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 153: Line 164:
 <​metadata <​metadata
   android:​name="​com.google.android.maps.v2.API_KEY"​   android:​name="​com.google.android.maps.v2.API_KEY"​
-  android:​value="​AIzaSyACwBefUuAjtvG3Xi8kOD97Nrrzb2b1FrM" />+  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>
Line 168: Line 179:
 </​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 184: 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 196: Line 208:
 </​code>​ </​code>​
 </​note>​ </​note>​
 +</​hidden>​
  
 ==== Dispozitiv Fizic ==== ==== Dispozitiv Fizic ====
Line 246: 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 //Android Debug Monitor// din Android Studio ​sau //DDMS// din Eclipse (//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.png?nolink&​600 ​}}+{{ :​eim:​laboratoare:​laborator10:​avd_emulator_control_new.png?nolink }}
  
 ===== Gestiunea unei Hărți Google ===== ===== Gestiunea unei Hărți Google =====
Line 282: 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 617: 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 765: Line 779:
 } }
 </​code>​ </​code>​
 +
 +</​spoiler>​
  
 ===== Implementarea Zonelor de Restricție Geografică (Geofencing) ===== ===== Implementarea Zonelor de Restricție Geografică (Geofencing) =====
Line 1039: Line 1055:
 <note important>​Pentru toate aplicațiile Android va trebui completată cheia publică în fișierul ''​AndroidManifest.xml''​.</​note>​ <note important>​Pentru toate aplicațiile Android va trebui completată cheia publică în fișierul ''​AndroidManifest.xml''​.</​note>​
  
-Mai multe detalii pot fi obținute în secțiunea [[:​laboratoare:​laborator10#​configurare|Configurare]].+Mai multe detalii pot fi obținute în secțiunea [[:eim:​laboratoare:​laborator10#​configurare|Configurare]].
  
 **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/​eim2016/​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@eim2016:~$ git clone https://www.github.com/eim2016/​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@eim2016:~$ cd Laborator10 +student@eg-106:~$ cd Laborator10 
-student@eim2016:​~/​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@eim2016:​~/​Laborator10$ git push Laborator10_perfectstudent master+student@eg-106:​~/​Laborator10$ git push Laborator10_perfectstudent master
 </​code>​ </​code>​
  
Line 1061: 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://​eim2016.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 ​preferat (Android Studio ​sau Eclipse) proiectele ​''​GoogleMapsPlaces'' ​și ''​google-play-service_lib''​ (doar pentru Eclipse) ​din directorul ''​labtasks''​.+
  
 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 1093: 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 ​preferat (Android Studio ​sau Eclipse) proiectele ​''​GoogleMapsLocationUpdate'' ​și ''​google-play-service_lib''​ (doar pentru Eclipse) ​din directorul ''​labtasks''​.+**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 1133: 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 ​preferat (Android Studio ​sau Eclipse) proiectele ​''​GoogleMapsGeocoding'' ​și  ''​google-play-service_lib''​ (doar pentru Eclipse) ​din directorul ''​labtasks''​.+**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 1152: 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 ​preferat (Android Studio ​sau Eclipse) proiectele ​''​GoogleMapsGeofencing'' ​și  ''​google-play-service_lib''​ (doar pentru Eclipse) ​din directorul ''​labtasks''​.+**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 1165: 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.png?​nolink&​400}} {{:​eim:​laboratoare:​laborator10:​google_maps_geofencing_03.png?​nolink&​400}} +  - 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.png?​nolink&​400}} {{:​eim:​laboratoare:​laborator10:​google_maps_geofencing_05.png?​nolink&​400}}+  - 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 1191: 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@eim2016:​~/​Laborator10$ git add * +student@eg-106:​~/​Laborator10$ git add * 
-student@eim2016:​~/​Laborator10$ git commit -m "​implemented taks for laboratory 10" +student@eg-106:​~/​Laborator10$ git commit -m "​implemented taks for laboratory 10" 
-student@eim2016:​~/​Laborator10$ git push Laborator10_perfectstudent master+student@eg-106:​~/​Laborator10$ git push Laborator10_perfectstudent master
 </​code>​ </​code>​
  
eim/laboratoare/laborator10.1463120026.txt.gz · Last modified: 2016/05/13 09:13 by tmp.andrei.cojocaru
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