bytes.cat

La wiki d'FP d'informàtica

Eines de l'usuari

Eines del lloc


Barra lateral

ASIX Administració de Sistemes Informàtics i Xarxes
Tots els mòduls del cicle
MP01 Implantació de sistemes operatius
Totes les UFs del modul
MP02 Gestió de bases de dades
Totes les UFs del modul
MP03 Programació bàsica
Totes les UFs del modul
MP04 Llenguatges de marques i sistemes de gestió d'informació
Totes les UFs del modul
MP05 Fonaments de maquinari
Totes les UFs del modul
MP06 Administració de sistemes operatius
Totes les UFs del modul
MP07 Planificació i administració de xarxes
Totes les UFs del modul
MP08 Serveis de xarxa i Internet
Totes les UFs del modul
MP09 Implantació d'aplicacions web
Totes les UFs del modul
MP10 Administració de sistemes gestors de bases de dades
Totes les UFs del modul
MP11 Seguretat i alta disponibilitat
Totes les UFs del modul
MP12 Formació i orientació laboral
Totes les UFs del modul
MP13 Empresa i iniciativa emprenedora
Totes les UFs del modul
MP14 Projecte
Totes les UFs del modul
DAM Desenvolupament d’aplicacions multiplataforma
Tots els mòduls del cicle
MP01 Sistemes informàtics
Totes les UFs del modul
MP02 Bases de dades
Totes les UFs del modul
MP03 Programació bàsica
Totes les UFs del modul
MP04 Llenguatges de marques i sistemes de gestió d'informació
Totes les UFs del modul
MP05 Entorns de desenvolupament
Totes les UFs del modul
MP06 Accés a dades
Totes les UFs del modul
MP07 Desenvolupament d’interfícies
Totes les UFs del modul
MP08 Programació multimèdia i dispositius mòbils
Totes les UFs del modul
MP09 Programació de serveis i processos
Totes les UFs del modul
MP10 Sistemes de gestió empresarial
Totes les UFs del modul
MP11 Formació i orientació laboral
Totes les UFs del modul
MP12 Empresa i iniciativa emprenedora
Totes les UFs del modul
MP13 Projecte de síntesi
Totes les UFs del modul
MPDual Mòdul Dual / Projecte
DAW Desenvolupament d’aplicacions web
Tots els mòduls del cicle
MP01 Sistemes informàtics
Totes les UFs del modul
MP02 Bases de dades
Totes les UFs del modul
MP03 Programació
Totes les UFs del modul
MP04 Llenguatge de marques i sistemes de gestió d’informació
Totes les UFs del modul
MP05 Entorns de desenvolupament
Totes les UFs del modul
MP06 Desenvolupament web en entorn client
Totes les UFs del modul
MP07 Desenvolupament web en entorn servidor
Totes les UFs del modul
MP08 Desplegament d'aplicacions web
Totes les UFs del modul
MP09 Disseny d'interfícies web
Totes les UFs del modul
MP10 Formació i Orientació Laboral
Totes les UFs del modul
MP11 Empresa i iniciativa emprenedora
Totes les UFs del modul
MP12 Projecte de síntesi
Totes les UFs del modul
SMX Sistemes Microinformàtics i Xarxes
Tots els mòduls del cicle
MP01 Muntatge i manteniment d’equips
Totes les UFs del modul
MP02 Sistemes Operatius Monolloc
Totes les UFs del modul
MP03 Aplicacions ofimàtiques
Totes les UFs del modul
MP04 Sistemes operatius en xarxa
Totes les UFs del modul
MP05 Xarxes locals
Totes les UFs del modul
MP06 Seguretat informàtica
Totes les UFs del modul
MP07 Serveis de xarxa
Totes les UFs del modul
MP08 Aplicacions Web
Totes les UFs del modul
MP09 Formació i Orientació Laboral
Totes les UFs del modul
MP10 Empresa i iniciativa emprenedora
Totes les UFs del modul
MP11 Anglès
Totes les UFs del modul
MP12 Síntesi
Totes les UFs del modul
CETI Ciberseguretat en Entorns de les Tecnologies de la Informació
Tots els mòduls del cicle
android_imatges

Tractament d'imatges en Android

En aquest article veurem com capturar imatges amb Android utilitzant la càmera del mòbil, i com emmagatzemar les dades en el sistema d'arxius.

android-camera.jpg

Referències:

Us de la càmera

Aquest article de la pàgina oficial d'Android ens explica com capturar imatges amb la pròpia aplicació de la càmera del mòbil.

ULL! Mira el tutorial "photobasics" d'Android en anglès. La versió en castellà conté errors.

Hauràs de canviar manualment l'idioma a dalt a la dreta.

El tutorial utilitza la app Camera del sistema operatiu. Així, no farem la foto dins la pròpia aplicació, sinó que la farà la Càmera (amb un Intent + setActivityForResult) i després haurem de gestionar el resultat (amb una callback).

android-camera-intent.jpg

Tenim, dins el mateix tutorial, 2 aproximacions:

  1. Miniatura:
    • Si cridem la càmera amb un Intent sense cap extra ens retornarà un Bitmap amb el thumbnail (miniatura) de la foto.
    • Té poca resolució, però és força senzill d'implementar i per moltes aplicacions ens resulta suficient.
    • Addicionalment al què hi ha al tutorial, podeu afegir l'enregistrament de la foto en un arxiu de l'espai de la nostra pròpia app mitjançant el mètode Bitmap.compress
  2. Full-size:
    • Caldrà donar-li una indicació a la app Camera d'on guardar l'arxiu.
    • Necessitem un FileProvider dins la nostra app (arxiu AndroidManifest.iml).
    • Un cop cridem la app Camera ella mateixa guardarà l'arxiu on li haguem dit (sigui a l'espai de la nostra app, o al carret de fotos (DCIM) compartit del sistema operatiu).
    • ULL! Quan iniciem la càmera i li demanem que ens guardi la foto en full-size no rebrem el thumbnail en la callback de tornada (amb el què el codi previ probablement petarà).


Exercici: captura bàsica d'imatge amb miniatura

Pràctica elemental de captura d'imatge. En aquest exercici no guardarem la imatge en disc, però la podem mostrar en un ImageView.

  • Crea un aplicació simple amb un Button (captura foto) i un Image View.
  • Segueix les indicacions de l'article de captura d'imatges (en anglès!) que crea el Intent i mostra la miniatura.
  • Caldrà implementar 2 funcions a la teva Activity:
    • dispatchTakePictureIntent : crearà un Intent per cridar la càmera. Pots cridar aquesta funció des del OnClickListener del botó. Aquesta funció pot tenir qualsevol nom o fins-i-tot pots incrustar el codi dins el OnClickListener.
    • onActivityResult : aquesta funció de l'Activity rebrà les dades de la càmera. És obligat que es digui així la funció per poder ser cridada correctament. En aquesta funció és on hem de capturar el bitmap i mostrar-lo a la ImageView.

Persistència del thumbnail:

  • Amb el Bitmap que ens retorna l'aplicació, enregistra la foto al sistema d'arxius.
    • Crea un File sobre l'àrea interna d'emmagatzemament amb Context.getFilesDir() (llegeix mes avall).
    • Obre un FileOutputStream sobre el fitxer.
    • Utilitza Bitmap.compress per volcar el contingut del thumbnail sobre el fitxer.
  • Utilitza el Device File Explorer per visualitzar si el teu arxiu s'ha creat correctament (recorda prémer «actualitzar» abans de comprovar-ho).
  • Recupera la imatge sobre el ImageView quan iniciem l'aplicació de nou.
    • La forma més simple és amb la funció ImageView.setImageURI i assignar-li la Uri de l'arxiu.


Persistència

Segons Android Data Storage tenim diversos tipus d'emmagatzematge:

  1. Preferències compartides: tipus simples en forma clau-valor.
  2. Emmagatzematge Intern: es guarda arxiu en la memòria interna del dispositiu, no es pot compartir entre aplicacions per seguretat.
    • Els arxius es guarden a /data/data/com.myorg.myapp/files.
  3. Emmagatzematge «Extern» o Compartit: SD card o memòria interna compartida entre aplicacions com la carpeta DCIM on hi ha el carret de fotos.
    • Els arxius es guarden a /data/media/0/Android/data/com.myorg.myapp/files.
  4. BBDD SQLite
  5. Connexió de xarxa (guardar en un servidor d'internet)


Emmagatzematge intern

És el més segur ja que no es pot compartir entre aplicacions. La seguretat es manté sempre i quan no es faci root el dispositiu.

L'objecte Context (del qual deriva Application) ens proveeix algunes funcions per tractar els fitxers:

  • Context.fileOutputStream ens permet obrir un stream d'escriptura a l'espai privat de l'aplicació.
  • Context.getFilesDir() ens dona el path de la carpeta privada de l'aplicació on emmagatzemarem els fitxer interns. Amb aquest File com a path podem utilitzar les funcions habituals de Java per tractament d'arxius.

App de testeig per visualitzar els arxius i les carpetes d'emmagatzematge intern.

  • Crea una nova aplicació amb un botó.
  • Utilitza la funció Context.fileOutputStream() per enregistrar un arxiu amb el nom «dades.txt».
  • Escriu-hi una línia de text.
  • Controla que tingui el seu try…catch i mostra un missatge d'error per si falla alguna cosa.
  • Utilitza el Device File Explorer d'Android Studio per visualitzar l'arxiu que has generat. Pensa a ACTUALTIZAR el File Manager per trobar el teu arxiu.


Emmagatzematge compartit

Si utilitzem aquest espai, guardarem l'arxiu en una carpeta compartida on les diferents aplicacions poden intercanviar informació, com en el carret de fotos (DCIM) o la carpeta de descàrregues (Downloads).

Dins de l'emmagatzematge compartit hi ha 2 zones:

  • Zona de l'aplicació
    • Ubicat a /media/0/Android/data/com.myorg/myapp.
    • Dins d'aquesta hi ha també un seguit de carpetes específiques per a Pictures, Music, etc.
    • Podem accedir a l'arrel i crear les carpetes que creiem necessàries.
    • No requereix permisos d'accés.
  • Zona compartida de MediaStore
    • Ubicat a /media/0/.
    • Hi ha carpetes específiques (fixes) com DCIM, Documents, Downloads, etc.
    • S'hi accedeix mitjançant l'objecte MediaStore però la seva aproximació és molt diferent de la que estem treballant aquí ara.
    • Requereix permisos d'accés READ_EXTERNAL_STORAGE i/o WRITE_EXTERNAL_STORAGE.

En cas d'utilitzar emmagatzematge compartit caldrà declarar al manifest.xml els permisos pertinents:

<manifest ...>
    <uses-permission android:maxSdkVersion="18" android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:maxSdkVersion="18" android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    ...
</manifest>

Des de la API 18 en endavant (Android 4.4 KitKat) ja no cal demanar els permisos per escriure en l'àrea externa de la pròpia app, per això apareix aquest maxSdkVersion=18 en els permisos. Només cal tenir en compte que les altres aplicacions també podran accedir a aquestes dades si ho requereixen.

Si volem accedir a les imatges i arxius d'altres apps mitjançant MediaStore caldrà que traiem el maxSdkVersion i demanem els permisos READ_EXTERNAL_STORAGE i WRITE_EXTERNAL_STORAGE.

Als objectes Context i Environment trobem funcions adequades per a accedir als arxius externs de l'app:

A totes dues funcions cal especificar-les a quina de les diferents carpetes volem emmagatzemar-ho. Els valors s'indiquen a l'objecte Environment i alguns exemples son: Environment.DIRECTORY_DCIM, Environment.DIRECTORY_MUSIC, Environment.DIRECTORY_SCREENSHOTS, etc.

Exercici: fotos full-size a l'àrea externa

Seguirem el tutorial oficial de fotos d'Android a partir de la secció "Save full-size photo".

Modifica l'aplicació de l'exercici anterior per aconseguir guardar la foto a full-size:

  • Fes un commit amb tag (per després fer una release) al Git abans de continuar.
  • Per activar que la càmera faci l'enregistrament full-size caldrà que adjuntem la Uri del fitxer al Intent mitjançant un putExtra (fixa't en l'exemple).
  • Caldrà utilitzar FileProvider per autoritzar a l'app Camera a utilitzar els arxius de la nostra app (sigui a l'àrea externa o interna).
  • De moment no facis un nom d'arxiu dinàmic (amb data i hora, com es fa a l'exemple). Un nom fixe ens serveix per aquesta mini-app.
  • Per tal que el codi anterior no peti caldrà que comentis o eliminis el què tens a onActivityResult ja que ja no ens arribarà cap thumbnail o miniatura.
  • Visualitza el resultat de la foto. Quin problema tenim?

Ajusta el tamany de la foto a la ImageView per fer que càpiga dins l'àrea marcada al layout.

  • Pots seguir les indicacions a la secció "Decode a scaled image" del propi tutorial «photobasics».
  • Probablement el codi per ajustar i mostrar la foto et peti si està al onCreate. En primer lloc, perquè el primer cop no hi haurà imatge. El segon cop, petarà perquè durant el onCreate el valor de l'alçada i amplada del ImageView és zero. Per solventar-ho, aquest article proposa la solució d'actualitzar la imatge al mètode onWindowFocusChanged enlloc de fer-ho al onCreate (tampoc funciona al onStart ni al onResume).


Treballant amb XML i altres

És pràctic utilitzar arxius XML per separar els camps de forma llegible. Hi ha diverses llibreries per llegir XML amb Java:

  1. XmlSerializer és una opció.
  2. Aquest article en castellà explica força bé com utilitzar DOM parser.
  3. Potser et pot aclarir tb aquest post de DOM parser


Exercicis

Continuació de l'aplicacio «Andrevina» (endevinar el número del 1 al 100) iniciada a l'article Android.

Continuant amb l'aplicació «Andrevina» i la taula de rècords:

  1. Després d'entrar el nom per enregistrar un rècord, a més, engegarem la càmera.
  2. Capturem la imatge i la enregistrem a disc amb un nom aleatori o seqüencial.
  3. Assignem la imatge al nou item de rècord.
  4. Modifiquem el layout del ArrayAdapter per afegir-hi una ImageView al rècord (on havíem de tenir prèviament el nom i els intents).
  5. Modifiquem adequadament el adapter per aconseguir que ens agafi la imatge de disc i la assigni a la ListView


En el cas que no estiguis desenvolupant l'app «Andrevina» pots fer aquest altre exercici:

  • Implementa una ListView tal i com s'explica a l'article Android ListView.
  • Modifica el layout per tal de que cada list_item tingui també un espai per a la imatge.
  • Afegeix un botó per capturar imatges i enregistrar-les amb diferents noms. Cada cop que enregistris una d'elles, assigna-la al primer element de la llista que no en tingui (al Model de la llista, o sigui, el ArrayList).
  • Actualitza la view de manera que es visualitzin els canvis.
android_imatges.txt · Darrera modificació: 2021/10/20 11:17 per enrique_mieza_sanchez