Emmagatzemem diferents tipus de dades


L’objectiu d’aquest apartat és ampliar les funcionalitats de l'app iniciada en el bloc anterior per emmagatzemar informació en format de text i àudio associada a la imatge.


Més concretament es pretén donar resposta a les preguntes següents:


  • Com puc emmagatzemar informació textual en una ubicació determinada?
  • Com puc emmagatzemar arxius d'àudio en una ubicació determinada?

Desem informació en format text

Seguint amb l’app que hem començat en el bloc anterior, la segona cosa que farem serà guardar informació addicional que ens sembli rellevant sobre la imatge. Aquesta informació serà en format text que introduirem mitjançant un quadre de text, o alternativament ho podríem fer permetent que el dispositiu reconegui el que li dictéssim mitjançant l’objecte SpeechToText.

En general, quan una App desa fitxers en el mòbil ha de demanar el permís corresponent:

Així, el bloc que s'executa a l'inici quedaria en la forma

Per emmagatzemar informació textual en el dispositiu utilitzem un objecte de tipus File. Aquest objecte ens ofereix les següents funcions:


Les respostes a les crides són asíncrones (les rebem un temps indeterminat després d'haver efectuat la crida) i per tant haurem de programar els esdeveniments per reaccionar-hi adequadament. Disposem dels següents esdeveniments en funció de la crida que haguem fet:


L’objecte File ens permet gestionar tan sols arxius de text.

Aquest objecte ens permet emmagatzemar tot el que introduïm en el quadre de text en un arxiu, Seguirem desant tota la informació a la subcarpeta fotos que ja utilitzàvem en l'app desenvolupada en el bloc anterior.

En la pantalla de disseny afegim tres objectes: una etiqueta de text, un quadre de text i un objecte file tal com mostra la següent imatge per permetre a l’usuari escriure informació sobre la imatge que s’emmagatzemarà en format text mitjançant l’objecte file.


Activem l’opció Multiline del TextBox per facilitar la introducció d'informació.

Alhora que desem la imatge, emmagatzemem també la informació en format text ampliant el codi associat a l'esdeveniment BDesa.Click tal com segueix:



Com es veu en la imatge, la informació textual la gravem en un arxiu de text que porta per nom el mateix nom que hem assignat a l'arxiu amb la imatge.

I un cop feta la crida per emmagatzemar la imatge, podem esperar la confirmació de l’emmagatzematge per mostrar la ruta d’on s’ha guardat la informació textual, que serà la mateixa on s'ha guardat la imatge.



Per recuperar la informació associada a una fotografia modifiquem el codi associat a la resposta de l’Activity Starter quan cercàvem una fotografia per extreure també la informació de text associada a la fotografia. Per fer-ho, cridem a la funció File.ReadFrom, que ens permetrà extreure la informació textual d'un arxiu on haurem emmagatzemat el text associat a la fotografia. Aquesta informació la rebrem de forma asíncrona.



En la imatge anterior hi ha una crida a la funció nom_arxiu que escapça la resposta a la crida de l’ActivityStarter i ens permet esbrinar el nom de l’arxiu on tenim emmagatzemada la informació textual. Aquesta funció és tal com segueix:


En algunes versions d'Android el caracter separador "/" pot estar codificat. Per eliminar aquesta codificació, en cas que hi sigui, hem afegit el bloc Web1.UriDecode. Per usar aquest bloc és necessari incloure prèviament un component Web en el dissenyador.

Comentaris sobre la funció:

  • Per crear una funció, en la pantalla de programació hem d’escollir l’opció Procedures (color lila) de la biblioteca de la banda esquerra. Hi veiem dues opcions com mostra la següent imatge:



  • Anomenem procediment a l’objecte que veiem a la part superior del desplegable (no retorna un resultat en acabar la seva execució) i funció al de la part inferior (retorna un resultat en acabar la seva execució).
  • El codi de la funció esborra la ruta de l'arxiu prèvia a la carpeta fotos ja que l'objecte file va a buscar els arxius per defecte a aquesta carpeta. A més, substitueix l'extensió .png per l'extensió .txt.

I mitjançant l’esdeveniment File.GotText mostrem el contingut de l’arxiu consultat:



Desem informació en format àudio

Si volem associar informació d'àudio a la imatge que generem des de l’aplicació, ens caldran uns quants objectes més: el SoundRecorder per gravar una pista d’àudio i el Sound per reproduir el que haguem gravat. A més, a la interfície hi afegirem també un parell de botons per iniciar la gravació i reproduir-la.

Amb aquests nous objectes la interfície queda com segueix:



A diferència de l'objecte file, l'objecte soundrecorder necessita que li facilitem la ruta completa a l'hora d'emmagatzemar l'arxiu d'àudio. L'objecte sound també necessita la ruta completa per poder accedir a l'arxiu. Farem servir una variable anomenada ruta_arxiu (com hem vist en el mòdul anterior, pot ser /storage/emulated/0, /storage/sdcard/0 …)

La crida per gravar la fem com mostra la següent imatge:



Aclariments sobre el codi anterior:

  • Quan cridem la instrucció Soundrecorder.Start, comença a gravar fins que no li diem que s'aturi cridant Soundrecorder.Stop. Per aquesta raó utilitzem una variable anomenada gravant que ens permet saber si estem gravant o no. Si hem començat la gravació canviarà el text que apareix al botó de Gravar pel d'Aturar. Així per aturar la gravació tornarem a clicar sobre el mateix botó que aturarà la gravació en curs.
  • Aquest objecte emmagatzema l’àudio immediatament després de gravar. Per assegurar-nos que això es faci a la ubicació que ens interessa i amb el nom d’arxiu que l’usuari decideixi, l'aplicació exigeix que s’hagi introduït un nom d’arxiu abans de començar a gravar.

Per reproduir l'àudio gravat ens cal l’objecte Sound. Per poder-ho dur a terme li facilitarem la ruta d'accés a aquest àudio que ens torna emmagatzemada a la variable local sound l'esdeveniment SoundRecorder1.AfterSoundRecorded. Com a comprovació reproduïm l’àudio generat un cop completada la gravació, esdeveniment que detectem amb el següent codi:



Per completar l’aplicació, ens falta tan sols, afegir a la resposta de l’ActivityStarter les instruccions adequades per tal que quan escollim una imatge ens obri també l’arxiu d’àudio corresponent, que portarà el mateix nom que l'arxiu amb la imatge i l'arxiu de text i estarà gravat a la mateixa subcarpeta però amb extensió 3gp.



Un cop carregada la imatge i la informació associada, podem reproduir l'àudio tants cops com vulguem.