This shows you the differences between two versions of the page.
eim:laboratoare:laborator07 [2016/04/15 07:14] tmp.andrei.cojocaru |
eim:laboratoare:laborator07 [2021/02/16 16:06] (current) dragos.niculescu |
||
---|---|---|---|
Line 339: | Line 339: | ||
==== Volley ==== | ==== Volley ==== | ||
+ | <spoiler> | ||
[[http://developer.android.com/training/volley/index.html|Volley]] este o bibliotecă open-source (disponibilă prin intermediul Android Open-Source Project) ce oferă facilități pentru interogarea de resurse disponibile prin intermediul protocolului HTTP. | [[http://developer.android.com/training/volley/index.html|Volley]] este o bibliotecă open-source (disponibilă prin intermediul Android Open-Source Project) ce oferă facilități pentru interogarea de resurse disponibile prin intermediul protocolului HTTP. | ||
Line 353: | Line 353: | ||
Pentru utilizarea bibliotecii Volley este necesar să se realizeze următoarele operații: | Pentru utilizarea bibliotecii Volley este necesar să se realizeze următoarele operații: | ||
- descărcarea codului sursă de la depozitul unde este întreținută <code> | - descărcarea codului sursă de la depozitul unde este întreținută <code> | ||
- | student@eim2016:~$ git clone https://android.googlesource.com/platform/frameworks/volley | + | student@eim-lab:~$ git clone https://www.github.com/google/volley |
</code> | </code> | ||
- referirea proiectului ca bibliotecă în Android Studio | - referirea proiectului ca bibliotecă în Android Studio | ||
Line 572: | Line 572: | ||
VolleyController.getInstance(getActivity().getApplicationContext()).addToRequestQueue(customRequest); | VolleyController.getInstance(getActivity().getApplicationContext()).addToRequestQueue(customRequest); | ||
</code> | </code> | ||
+ | |||
+ | </spoiler> | ||
===== Prelucrare DOM (Document Object Model) ===== | ===== Prelucrare DOM (Document Object Model) ===== | ||
Line 865: | Line 867: | ||
* ''username'' - denumirea utilizatorului care deține drepturi de acces asupra acestui serviciu web (în cazul de față, ''pdsd''). | * ''username'' - denumirea utilizatorului care deține drepturi de acces asupra acestui serviciu web (în cazul de față, ''pdsd''). | ||
- | **Exemplu**. O adresă Internet de la care pot fi accesate rezultate în format JSON este: [[http://api.geonames.org/earthquakesJSON?north=44.1&south=-9.9&east=-22.4&west=55.2&username=eim2016|]]. | + | **Exemplu**. O adresă Internet de la care pot fi accesate rezultate în format JSON este: [[http://api.geonames.org/earthquakesJSON?north=44.1&south=-9.9&east=-22.4&west=55.2&username=eim-lab|]]. |
Rezultatele sunt furnizate în următorul format: | Rezultatele sunt furnizate în următorul format: | ||
Line 929: | Line 931: | ||
**1.** În contul Github personal, să se creeze un depozit denumit 'Laborator07'. 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''). | **1.** În contul Github personal, să se creeze un depozit denumit 'Laborator07'. 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.** Să se cloneze în directorul de pe discul local conținutul depozitului la distanță de la [[https://www.github.com/eim2016/Laborator07|]]. | + | **2.** Să se cloneze în directorul de pe discul local conținutul depozitului la distanță de la [[https://www.github.com/eim-lab/Laborator07|]]. |
În urma acestei operații, directorul Laborator07 va trebui să se conțină directoarele ''labtasks'', ''samples'' și ''solutions''. | În urma acestei operații, directorul Laborator07 va trebui să se conțină directoarele ''labtasks'', ''samples'' și ''solutions''. | ||
<code> | <code> | ||
- | student@eim2016:~$ git clone https://www.github.com/eim2016/Laborator07 | + | student@eim-lab:~$ git clone https://www.github.com/eim-lab/Laborator07.git |
</code> | </code> | ||
**3.** Să se încarce conținutul descărcat în cadrul depozitului 'Laborator07' de pe contul Github personal. <code> | **3.** Să se încarce conținutul descărcat în cadrul depozitului 'Laborator07' de pe contul Github personal. <code> | ||
- | student@eim2016:~$ cd Laborator07 | + | student@eim-lab:~$ cd Laborator07 |
- | student@eim2016:~/Laborator07$ git remote add Laborator07_perfectstudent https://github.com/perfectstudent/Laborator07 | + | student@eim-lab:~/Laborator07$ git remote add Laborator07_perfectstudent https://github.com/perfectstudent/Laborator07 |
- | student@eim2016:~/Laborator07$ git push Laborator07_perfectstudent master | + | student@eim-lab:~/Laborator07$ git push Laborator07_perfectstudent master |
</code> | </code> | ||
- | **4.** Să se importe în mediul integrat de dezvoltare preferat (Android Studio / Eclipse) proiectul ''CalculatorWebService'' din directorul ''labtasks''. | + | **4.** Să se importe în mediul integrat de dezvoltare Android Studio proiectul ''CalculatorWebService'' din directorul ''labtasks''. |
- | Se cere să se implementeze un calculator, care suportă operațiile de adunare/scădere/înmulțire/împărțire a două numere reale, pe baza rezultatului furnizat de un serviciu web, accesibil prin HTTP, la adresele Internet specificate în interfața ''Constants'', pentru fiecare dintre metodele suportate pentru transmiterea informațiilor: | + | https://ocw.cs.pub.ro/courses/_media/eim/laboratoare/laborator07/calculatorwebservice.zip |
+ | |||
+ | **4a.** Să se verifice în browser funcționarea serverului [[http://wi-fi.cs.pub.ro/~dniculescu/didactic/eim/expr/|serverului]] pentru GET și POST | ||
+ | |||
+ | **4b.** Să se verifice la linia de comandă functionarea severului | ||
+ | * <code shell> curl -X POST --data 'operation=times&t1=9&t2=2' https://wi-fi.cs.pub.ro/~dniculescu/didactic/eim/expr/expr_post.php</code> | ||
+ | * <code shell> curl "https://wi-fi.cs.pub.ro/~dniculescu/didactic/eim/expr/expr_get.php?operation=times&t1=9&t2=2" </code> | ||
+ | |||
+ | **4c.** studiați implementarea serverului în php | ||
+ | |||
+ | **4d.** Se cere să se implementeze un calculator, care suportă operațiile de adunare/scădere/înmulțire/împărțire a două numere reale, pe baza rezultatului furnizat de un serviciu web, accesibil prin HTTP, la adresele Internet specificate în interfața ''Constants'', pentru fiecare dintre metodele suportate pentru transmiterea informațiilor: | ||
* ''GET'': ''Constants.GET_WEB_SERVICE_ADDDRESS'' | * ''GET'': ''Constants.GET_WEB_SERVICE_ADDDRESS'' | ||
* ''POST'': ''Constants.POST_WEB_SERVICE_ADDRESS'' | * ''POST'': ''Constants.POST_WEB_SERVICE_ADDRESS'' | ||
Line 958: | Line 970: | ||
<code> | <code> | ||
- | operation = addition|substraction|multiplication|division | + | operation = plus|minus|divide|times |
- | operator1 = număr real | + | t1 = număr real |
- | operator2 = număr real | + | t2 = număr real |
</code> | </code> | ||
Line 989: | Line 1001: | ||
În cadrul unui câmp text va putea fi vizualizat răspunsul HTTP furnizat de serviciul web. | În cadrul unui câmp text va putea fi vizualizat răspunsul HTTP furnizat de serviciul web. | ||
- | **5.** Să se importe în mediul integrat de dezvoltare preferat (Android Studio / Eclipse) proiectul ''XkcdCartoonDisplayer'' din directorul ''labtasks''. | + | **5.** Să se importe în mediul integrat de dezvoltare Android Studio proiectul ''XkcdCartoonDisplayer'' din directorul ''labtasks''. |
Se cere să se implementeze o aplicație Android care afișează, într-un control grafic de tip ''ImageView'', cea mai recentă caricatură de pe pagina Internet [[http://www.xkcd.com|xkcd]]. De asemenea, va putea fi vizualizat titlul acestei caricaturi, adresa Internet la care aceasta poate fi accesată precum și butoane de legătură către caricatura precedentă, respectiv caricatura următoare (în situația în care aceasta există). | Se cere să se implementeze o aplicație Android care afișează, într-un control grafic de tip ''ImageView'', cea mai recentă caricatură de pe pagina Internet [[http://www.xkcd.com|xkcd]]. De asemenea, va putea fi vizualizat titlul acestei caricaturi, adresa Internet la care aceasta poate fi accesată precum și butoane de legătură către caricatura precedentă, respectiv caricatura următoare (în situația în care aceasta există). | ||
Line 1008: | Line 1020: | ||
String cartoonInternetAddress = divTagIdComic.getElementsByTag(Constants.IMG_TAG).attr(Constants.SRC_ATTRIBUTE); | String cartoonInternetAddress = divTagIdComic.getElementsByTag(Constants.IMG_TAG).attr(Constants.SRC_ATTRIBUTE); | ||
</code> | </code> | ||
- | * obținerea caricaturii, pe baza adresei Internet la care este găzduită, se face prin fluxul de intrare corespunzător entității HTTP, care va fi decodificat prin intermediul metodei [[http://developer.android.com/reference/android/graphics/BitmapFactory.html#decodeStream(java.io.InputStream)|BitmapFactory.decodeStream()]], care întoarce un obiect de tip [[http://developer.android.com/reference/android/graphics/Bitmap.html|Bitmap]]; asocierea unui astfel de obiect ca sursă a unui control grafic ce tip ''ImageView'' se face prin intermediul metodei [[http://developer.android.com/reference/android/widget/ImageView.html#setImageBitmap(android.graphics.Bitmap)|setImageBitmap()]]; alternativ, se poate folosi biblioteca open-source Volley, care pune la dispoziție un obiect specializat pentru descărcarea de imagini și încărcarea acestora în controalele din cadrul interfeței grafice (''ImageRequest''): <code java> | + | * obținerea caricaturii, pe baza adresei Internet la care este găzduită, se face prin fluxul de intrare corespunzător entității HTTP, care va fi decodificat prin intermediul metodei [[http://developer.android.com/reference/android/graphics/BitmapFactory.html#decodeStream(java.io.InputStream)|BitmapFactory.decodeStream()]], care întoarce un obiect de tip [[http://developer.android.com/reference/android/graphics/Bitmap.html|Bitmap]]; asocierea unui astfel de obiect ca sursă a unui control grafic ce tip ''ImageView'' se face prin intermediul metodei [[http://developer.android.com/reference/android/widget/ImageView.html#setImageBitmap(android.graphics.Bitmap)|setImageBitmap()]]; |
+ | <spoiler> | ||
+ | <code java> | ||
+ | Element divTagIdCtitle = htmlTag.getElementsByAttributeValue(Constants.ID_ATTRIBUTE, Constants.CTITLE_VALUE).first(); | ||
+ | xkcdCartoonInformation.setCartoonTitle(divTagIdCtitle.ownText()); | ||
+ | |||
+ | |||
+ | Element divTagIdComic = htmlTag.getElementsByAttributeValue(Constants.ID_ATTRIBUTE, Constants.COMIC_VALUE).first(); | ||
+ | String cartoonInternetAddress = divTagIdComic.getElementsByTag(Constants.IMG_TAG).attr(Constants.SRC_ATTRIBUTE); | ||
+ | String cartoonUrl = Constants.HTTP_PROTOCOL + cartoonInternetAddress; | ||
+ | xkcdCartoonInformation.setCartoonUrl(cartoonUrl); | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | ===== Opțional (request cu Volley) ===== | ||
+ | <spoiler> | ||
+ | * alternativ, se poate folosi biblioteca open-source Volley, care pune la dispoziție un obiect specializat pentru descărcarea de imagini și încărcarea acestora în controalele din cadrul interfeței grafice (''ImageRequest''): <code java> | ||
ImageRequest cartoonRequest = new ImageRequest( | ImageRequest cartoonRequest = new ImageRequest( | ||
cartoonUrl, | cartoonUrl, | ||
Line 1033: | Line 1060: | ||
VolleyController.getInstance(xkcdCartoonImageView.getContext()).addToRequestQueue(cartoonRequest); | VolleyController.getInstance(xkcdCartoonImageView.getContext()).addToRequestQueue(cartoonRequest); | ||
</code> | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | |||
* obținerea adreselor Internet corespunzătoare caricaturilor anterioară, respectiv următoare, care vor fi asociate obiectului ascultător ce tratează evenimentul de tip apăsare al butonului aferent; se poate realiza o căutare după eticheta ''<a>'' care deține un atribut ''rel'' cu valoarea ''prev'', respectiv ''next'', folosind metoda ''getElementsByAttributeValue()''); URL-ul reprezintă valoarea atributului ''href'', furnizată de metoda ''attr'': <code java> | * obținerea adreselor Internet corespunzătoare caricaturilor anterioară, respectiv următoare, care vor fi asociate obiectului ascultător ce tratează evenimentul de tip apăsare al butonului aferent; se poate realiza o căutare după eticheta ''<a>'' care deține un atribut ''rel'' cu valoarea ''prev'', respectiv ''next'', folosind metoda ''getElementsByAttributeValue()''); URL-ul reprezintă valoarea atributului ''href'', furnizată de metoda ''attr'': <code java> | ||
Element aTagRelPrev = htmlTag.getElementsByAttributeValue(Constants.REL_ATTRIBUTE, Constants.PREVIOUS_VALUE).first(); | Element aTagRelPrev = htmlTag.getElementsByAttributeValue(Constants.REL_ATTRIBUTE, Constants.PREVIOUS_VALUE).first(); | ||
Line 1083: | Line 1113: | ||
Lansarea în execuție a unui obiect de tip ''AsyncTask'' se realizează printr-un apel al metodei ''execute()'': | Lansarea în execuție a unui obiect de tip ''AsyncTask'' se realizează printr-un apel al metodei ''execute()'': | ||
+ | |||
<code java> | <code java> | ||
Line 1088: | Line 1119: | ||
</code> | </code> | ||
- | **6.** Să se importe în mediul integrat de dezvoltare preferat (Android Studio / Eclipse) proiectul ''GoogleSearcher'' din directorul ''labtasks''. | + | <note important> |
+ | Atenție, site-ul xkcd a trecut la https, ceea ce pornește un [[https://stackoverflow.com/questions/29916962/javax-net-ssl-sslhandshakeexception-javax-net-ssl-sslprotocolexception-ssl-han|bug]] din Android < 5.0, deci pentru rulare trebuie să folosiți o imagine de Android cu versiune mai nouă decât Lollipop. | ||
+ | </note> | ||
+ | |||
+ | * Nu clickați aici decât dupa ce ați rezolvat exercițiul: [[https://xkcd.com/1174/|mandatory recursive reference]] m( | ||
+ | |||
+ | **6.** Să se importe în mediul integrat de dezvoltare Android Studio proiectul ''GoogleSearcher'' din directorul ''labtasks''. | ||
Se cere să se implementeze o aplicație Android care să realizeze o căutare folosind motorul [[http://www.google.com|Google]], rezultatul fiind expus printr-un control grafic de tip [[http://developer.android.com/reference/android/webkit/WebView.html|WebView]]. | Se cere să se implementeze o aplicație Android care să realizeze o căutare folosind motorul [[http://www.google.com|Google]], rezultatul fiind expus printr-un control grafic de tip [[http://developer.android.com/reference/android/webkit/WebView.html|WebView]]. | ||
Line 1115: | Line 1152: | ||
</code> | </code> | ||
- | **7.** (opțional) Să se importe în mediul integrat de dezvoltare preferat (Android Studio / Eclipse) proiectul ''LandmarkLister'' din directorul ''labtasks''. | + | **7.** (opțional) Să se importe în mediul integrat de dezvoltare Android Studio proiectul ''LandmarkLister'' din directorul ''labtasks''. |
- | Se cere să se implementeze o aplicație Android care să afișeze informații cu privire la obiectivele turistice dintr-un areal geografic (desemnat prin coordonatele nord, sud, est, vest) pe baza rezultatelor furnizate de serviciul web [[http://http://api.geonames.org/citiesJSON|Geonames Paces]]. | + | Se cere să se implementeze o aplicație Android care să afișeze informații cu privire la obiectivele turistice dintr-un areal geografic (desemnat prin coordonatele nord, sud, est, vest) pe baza rezultatelor furnizate de serviciul web [[http://api.geonames.org/citiesJSON|Geonames Paces]]. |
Detaliile care se doresc a fi vizualizate pentru fiecare obiectiv turistic în parte sunt: | Detaliile care se doresc a fi vizualizate pentru fiecare obiectiv turistic în parte sunt: | ||
Line 1208: | Line 1245: | ||
**8.** Să se încarce modificările realizate în cadrul depozitului 'Laborator07' de pe contul Github personal, folosind un mesaj sugestiv. <code> | **8.** Să se încarce modificările realizate în cadrul depozitului 'Laborator07' de pe contul Github personal, folosind un mesaj sugestiv. <code> | ||
- | student@eim2016:~/Laborator07$ git add * | + | student@eim-lab:~/Laborator07$ git add * |
- | student@eim2016:~/Laborator07$ git commit -m "implemented taks for laboratory 07" | + | student@eim-lab:~/Laborateclior07$ git commit -m "implemented taks for laboratory 07" |
- | student@eim2016:~/Laborator07$ git push Laborator07_perfectstudent master | + | student@eim-lab:~/Laborator07$ git push Laborator07_perfectstudent master |
</code> | </code> | ||
Line 1229: | Line 1266: | ||
[[http://en.wikipedia.org/wiki/JSON|Formatul JSON]]\\ | [[http://en.wikipedia.org/wiki/JSON|Formatul JSON]]\\ | ||
[[http://developer.android.com/reference/org/json/JSONObject.html|JSONObject]] | [[http://developer.android.com/reference/org/json/JSONObject.html|JSONObject]] | ||
+ | ====Android Developer Fundamentals==== | ||
+ | [[https://docs.google.com/presentation/d/176imWmYy31qcCpkkk0mhx66LKrlhrCZPHGfEn9tBZlE/edit#slide=id.g116d7d9d49_3_13|Internet Connection]] |