+
Laboratorio di Elaborazione e Trasmissione Video
Marco Vernier – Niki Martinel
Dipartimento di Matematica e Informatica
Università degli studi di Udine
Outline
Lezione 1 - Il sistema operativo Android
Cos’è Android
Vantaggi e Svantaggi
Sviluppare per Android
Lezione 2 - OpenCV libraries
Cosa sono
Cosa si può fare con le OpenCV
OpenCV e Android O.S.
Perchè Android
«The best applications for
Android are not here yet. That’s
because they’re going to be
written by you and many other
developers just like you»
Sergey Brin – Google Inc.
Il sistema operativo Android
Sistema operativo per dispositivi mobili basato su Linux
E’ stato sviluppato inizialmente da Google e poi da Open
Handset Alliance (OHA) – gruppo di aziende es. Google,
Intel, Samsung, Motorola
sbroh.wordpress.com
Le versioni di Android
I° versione: 22 Ottobre 2008 sotto il nome
di T-Mobile
Ora siamo alla versione 4.4 Kit Kat
Wikipedia
Vantaggi di Android O.S
E’ un sistema operativo open-source
Chiunque può sviluppare per Android
Nessuna politica restrittiva
Ogni costruttore (Samsung, Motorola ecc.) può adattarle alle loro
esigenze
E’ facile sviluppare per Android
Il linguaggio di programmazione utilizzato è Java
Ambiente di sviluppo (SDK e Eclipse)
Numerose API (Application Programming Interface)
Possibilità di utilizzare uno o più emulatori contemporaneamente (AVD Android Virtual Devices)
Architettura basata sul riuso dei componenti
Le varie applicazioni possono sfruttare componenti che sono resi
disponibili da altre applicazioni
Altri vantaggi
Massima personalizzazione delle applicazioni
Per diversi dispositivi (smartphones – tablet)
Tutte le applicazioni hanno gli stessi diritti
Non c’è nessuna differenza tra le applicazioni cosiddette «core» (es.
voice recorder vs my application)
Il ciclo di vita delle applicazioni è gestito automaticamente
dal sistema operativo
Apertura, chiusura, pausa di una applicazione (vedremo più avanti)
Gestione automatizzata della memoria
Ottimizzato per risparmiare risorse
Android Developers
developer.android.com/index.html
L’architettura di Android
Il Kernel
Il livello più basso di questo S.O. è’ rappresentato dal kernel
di Linux nella versione 2.6
La necessità era quella di disporre di un vero e proprio sistema operativo
che fornisse gli strumenti di basso livello per la virtualizzazione
dell’hardware sottostante attraverso la definizione di diversi driver per la
gestione delle diverse periferiche.
Il livello Libraries
Questo livello contiene un insieme di librerie native realizzate
in C e C++ che rappresentano il core vero e proprio di
Android.
Tra queste
Surface Manager ha il compito di gestire le view ovvero ciò di cui
un’interfaccia grafica è composta.
Open GL ES librerie adatte per lo sviluppo di applicativi 3D.
Media Framework è un componente che permette di gestire i diversi
CODEC per i vari formati di acquisizione e riproduzione audio video.
SQLite è una particolare libreria che implementa un DBMS
relazionale caratterizzato dal fatto di essere molto compatto, diretto ecc.
SSL libreria per la gestione dei Secure Socket Layer
………
Application Framework
Si tratta di un insieme di componenti più di alto livello per
l’esecuzione di funzionalità ben precise.
Activity Manager per la gestione delle varie schermate (Activity)
Package Manager gestisce il ciclo di vita delle applicazioni
Telephony Manager libreria che permette maggiore interazione con le
funzionalità offerte dal dispositivo cellulare (iniziare una chiamata ecc.)
Notification Manager mette a disposizione degli strumenti che
l’applicazione può utilizzare per inviare una particolare notifica al
dispositivo.
View System come si vedrà più avanti, l’interfaccia grafica di
un’applicazione per Android è composta da specializzazioni della classe
«View». Perciò questa componente contiene tutti gli strumenti per
gestire gli eventi dell’interfaccia grafica.
…………….
Livello Applicativo
I componenti di Android
Ogni applicazione è formata da diversi componenti
ACTIVITIES: possono essere definite come la schermata che l’utente
visualizza (un contenitore di componenti grafici es. bottoni, etichette
ecc.)
SERVICES: sono delle componenti che non vengono visualizzate
dall’utente in quanto lavorano e rimangono in background
BROADCAST RECEIVERS: sono componenti che permettono di gestire
eventi generati a livello globale (es. evento batteria scarica intercettato
da una applicazione)
CONTENT PROVIDER: sono dei repository di informazioni a cui è
possibile accedere da diversi componenti attraverso una modalità
standard. Più applicazioni condividono e si scambiano gli stessi dati.
Le Intent
INTENT: è un meccanismo che descrive un’azione precisa e
che permette alle varie Activity di comunicare tra di loro (sono
dei veri e propri messaggi es. «fai una chiamata, apri il
navigatore ecc.»)
Activities, services e broadcast receivers vengono attivati
tramite i messaggi di Intent
Si può distinguere tra Intent espliciti e impliciti:
Intent espliciti: il nome del componente che risponderà è già noto in fase di creazione
dell’Intent stesso
○
○
Intent intent = new Intent(Context, activityToCall.class);
startActivity(intent); //avvio la seconda Activity
// instanzio l’Intent
Intent impliciti: non definiscono il nome del target e vengono utilizzati tipicamente per
attivare componenti in altre applicazioni (per es. aprire un browser)
○
Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.google.it"));
Intent Filter
Sono un meccanismo che permette ad un’Activity di
dichiarare l’insieme degli intent che è in grado di gestire
ovvero esporre al resto del sistema cosa è in grado di fare
l’applicazione (es. gestire una chiamata, gli sms ecc.)
Meglio ancora: quando lo sviluppatore crea una nuova
applicazione, egli definisce cosa essa sia in grado di fare
quest’ultima
Vanno dichiarati nel file Androidmanifest.xml
L’AndroidManifest.xml è file xml che si trova nella root del progetto.
Esso permette di dare al dispositivo che esegue l’applicazione
informazioni utili sull’applicativo stesso
Action
Gli intent filter vengono descritti da della costanti «action» definite
dalla classe Intent
Esecuzione di un programma
Lo sviluppo di applicazioni Android avviene utilizzando il
linguaggio di programmazione Java
Supporto di molti packages (es. java.io, java.lang, java.math etc.)
Normalmente in Java i programmi compilati (file .class)
vengono processati dalla Java Virtual Machine (JVM)
Compile Once, Run Everywhere
Android utilizza invece la Dalvik Virtual Machine
La compilazione del programma genera un archivio .apk (può essere
considerato come un file con estensione .exe)
L’archivio .apk contiene diversi file (Androidmanifest.xml, build.xml ecc.)
tra cui un file .dex che non è altro che il risultato della compilazione da
parte della DVM
Vantaggi nell’utilizzo della DVM
○
Riduzione del 50% della dimensione del programma
○ Ottimizzazione delle risorse a favore dei dispositivi mobili con memoria limitata
○ Efficace esecuzione di più processi contemporaneamente
Processing delle applicazioni
Obiettivo di Android: realizzare applicazioni in grado di
rispondere immediatamente alle azioni dell’utente.
Ogni applicazione va in esecuzione su processi separati,
ognuna all’interno di un proprio processo Linux e all’interno
di una differente macchina virtuale.
Si parla di «task affinity»: tutte le attività di una applicazione
hanno la stessa affinità quindi vengono eseguite nello
stesso task
Con dei specifici FLAG è possibile avviare una attività dell’applicazione
su uno stack diverso da quello di appartenenza
A volte si dice che l’esecuzione di una attività di un diverso applicativo
appartiene allo stesso task
○
Es. scelta di un contatto da inviare tramite Bluetooth
Ciclo di vita delle applicazioni
ACTIVITY: rappresenta una possibile interazione dell’utente
con l’applicazione e può essere associata al concetto di
schermata.
Schermata che contiene componenti grafici (bottoni, testi ecc.)
Ogni activity può assumere diversi stati:
ACTIVE: l’Activity è in cima allo stack, è visibile e ha il focus. E’ quella
che riceve gli eventi da parte dell’utente
PAUSED: fa riferimento ad Activity non attive (non sensibile alle
interazioni degli utenti) ma ancora visibili per la trasparenza di quelle
superiori o perché queste non occupano tutto lo spazio a disposizione.
STOPPED: si riferisce ad Activity non attive ne visibili. E’ tra le prime
candidate ad essere eliminata.
INACTIVE: si trova in questo stato quando viene eliminata oppure prima
di essere creata.
I metodi di «Callback»
I passaggi di stato (Active-Stopped) tra un’activity ed un’altra
sono descritti da dei metodi cosiddetti di callback
•
•
•
•
•
•
•
•
onCreate(): primo metodo ad essere
chiamato. Significa che l’applicazione
esiste.
onStart(): l’applicazione viene
visualizzata.
onResume(): l’applicazione è in cima
alla stack e prende il focus.
RUNNING: se onResume() termina
con successo l’applicazione entra nello
stato di RUNNING.
onPause(): viene invocato per
esempio quando viene premuto il tasto
back. L’activity non è più visibile
(insensibile agli input da parte
dell’utente).
onStop(): viene invocato prima del
metodo onDestroy() che elimina
completamente l’applicazione.
onRestart(): viene invocato per
ripristinare l’applicazione quando si
trova nello stato di STOP.
onDestroy(): viene invocato per
eliminare l’applicazione.
Developing for Android
L’SDK (Software Development Kit) di Android offre una
moltitudine di API e di strumenti utili per lo sviluppo di
qualsiasi tipo di applicativo sia per smartphone che per
tablet.
Dalla sezione «DevelopTraining» del sito
developer.android è possibile scaricare l’Android SDK
(390MB)
Android SDK + Eclipse
L’archivio che si andrà a scaricare contiene:
Eclipse + ADT plugin
Android SDK Tools
Android Platform Tools
The latest Android Platform
The latest Android system image for the emulator
E’ necessario installare anche la Java Platform JDK che si
trova sul sito di Oracle:
http://www.oracle.com/technetwork/java/javase/downloads/index.html
Fate attenzione alla versione del S.O. che usate
Vantaggi dell’ADT
E’ un utile plugin per la creazione e il debug di Applicazioni
Android
Permette di creare velocemente applicazioni attraverso un
wizard
Automatizza il processo di creazione delle applicazioni
○ Anziché utilizzare strumenti da linea di comando come per esempio «ant»
Fornisce sia un editor testuale che grafico
Per esempio modifico il layout, inserisco il bottone mediante interfaccia
grafica, senza scrivere codice
I file .apk vengono generati automaticamente
Eclipse Environment
Selezionare una directory di lavoro «workspace» dove inserire tutti i progetti
Utilizzo di Eclipse + ADT
In questa sessione di laboratorio proveremo a:
1.
2.
3.
4.
5.
6.
Importare un progetto esistente
Creare un nuovo progetto
Studiare la struttura di un progetto Android
Vedere le opportunità offerte da Android SDK Manager (installare
diversi SDK)
Realizzare un Android Virtual Device Manager AVD (new Emulator)
personalizzato
Eseguire una applicazione, con eventuali modifiche
Import di un progetto esistente
File Import Android Existing Android Code Into
Workspace
Scaricare: http://www.marcovernier.it/etvid/HelloAndroid.zip
Creare un nuovo progetto
File New Project Android Android Application
Project
Informazioni da inserire
Application Name (es. MyAndroid) – convenzione: la prima
lettera deve essere in maiuscolo (stessa convenzione di Java)
Project Name – viene utilizzato da Eclipse ed è lo stesso
dell’application name
Package Name – è buona norma che ciascun file (classe)
appartenga a un package che lo contestualizza all’interno di un
progetto o di una funzionalità
Minimum Required SDK – versione minima dell’SDK
Target SDK – specifica la versione di Android con cui
l’applicazione dovrà essere compatibile
Compile With
Theme – (Holo etc.)
Suggerimento – vedi le info sul simbolo «i»
Struttura di un progetto Android
su Eclipse
src/: contiene i sorgenti della nostra
applicazione
Android x.x/: (librerie e dipendenze)
bin/: contiene l’applicazione una volta
compilata (le classi compilate, il file .apk)
libs/: contiene i file di terze parti di cui
l’applicazione necessita (es. file .jar)
res/: contiene tutte le risorse
dell’applicazione (es. il layout
dell’interfaccia grafica)
Ancora sulla struttura
AndroidManifest.xml: è un file xml che
descrive come l’applicazione deve essere
costruita e quali componenti, servizi
permessi possono essere attivati. Contiene
informazioni utili ai dispositivi (smartphone,
tablet) per gestire l’applicazione e
l’interazione con gli altri componenti
eventualmente installati.
build.xml & default.properties: sono
degli script utilizzati dal tool «ant» per
compilare l’applicativo da linea di
comando.
Da precisare
Qualsiasi operazione che si può fare in Eclipse, può essere
eseguita anche da linea di comando (prompt di MSDOS,
Shell di Linux ecc.)
Con Apache Ant per esempio è semplice compilare
l’applicazione
Apache Ant is a Java library and command-line tool whose
mission is to drive processes described in build files as targets
and extension points dependent upon each other.
http://ant.apache.org/
In particolare nel manifest file
Vengono descritti i componenti dell’applicazione
Viene indicato il package Java utilizzato come identificatore
unico
Vengono dichiarati i permessi, accettati dall’utente, affinché
l’applicazione possa funzionare (es. Network permissions,
Camera permissions etc.)
Viene dichiarato il livello minimo delle API che l’applicazione
richiede
Gli intent filters visti in precedenza
…..
Dopo la compilazione
Dopo la prima compilazione del programma, nella root del
progetto, viene creata una cartella gen/
Essa conterrà i file generati automaticamente da Eclipse tra cui:
○ Il file R.java che contiene una serie di costanti collegate alle risorse
dell’applicazione
La cartella res (resources)
•
•
•
•
•
•
La cartella «res» contiene differenti risorse in riferimento ai
diversi tipi di layouts
/res/drawable immagini
/res/layout layout
/res/menu menu
/res/raw vari tipi di file
/res/value stringhe
/res/xml vari file xml
Designing for multiple screens
Quando si progetta per Android bisogna tenere a mente che
esistono diversi dispositivi con differenti risoluzioni.
E’ importante perciò realizzare applicazioni che si adattino il più
possibile ai dispositivi esistenti in commercio
Una volta: si creavano diversi .apk per i diversi dispositivi
Adesso: Android differenzia tra 4 principali categorie di layouts
a seconda della loro diversa densità:
Small Screens 426dp x 320dp
Normal Screens 470dp x 320dp
Large Screens 640dp x 480dp
Xlarge Screens 960dp x 720dp
○
○
Un dp è equivalente a un pixel fisico su uno schermo da 160 dpi (punti per pollice)
dp = Density Indipendent Pixel px = dp * (dpi / 160)
Come supportare schermi diversi
1.
Dichiarare nell’AndroidManifest file attraverso l’elemento
<support-screens> quali schermi sono supportati dalla nostra
applicazione
2.
Fornire diversi layouts per schermi differenti
Creare diverse cartelle nella forma layout-small, layout-large ecc. dove
all’interno ci sarà un file xml che descriverà il tipo di layout
Come fa Android a capire quale layout è il migliore? Lo fa automaticamente a
runtime in fase di esecuzione
○
3.
4.
Maggiori info http://developer.android.com/guide/topics/resources/providingresources.html#BestMatch
Fornire diversi «bitmap drawables» per schermi con diverse
densità di pixel (android supporta .png, .jpg, .gif) nel caso di
immagini
Usare tutte le convenzioni che si utilizzano anche nel web per
creare un layout «liquido» (es. usare dp anziché px)
Resources http://developer.android.com/guide/practices/screens_support.html
Esistono diversi tipi di layouts
Resources: http://developer.android.com/guide/topics/ui/declaring-layout.html#CommonLayouts
Android SDK Manager
Premendo il pulsante in figura è
possibile avviare l’SDK
Manager
Mediante questo tool è possibile
installare, aggiornare, rimuovere
qualsiasi piattaforma android
E’ possibile installare anche
librerie di terze parti o librerie di
Google per scopi precisi (es.
Google Maps, Google + etc.)
Android Virtual Device Manager
L’ADT di Android mette a
disposizione un Android Virtual
Device (emulatore) per eseguire in
locale (sul PC) le applicazioni senza
doverle trasferire nel dispositivo
mobile
Premendo il pulsante è possibile
avviare il tool che permette la
creazione di un emulatore
Vediamo come creare un AVD
Le informazioni che andremo ad
inserire saranno:
Nome dell’AVD
Tipo di Device con la risoluzione preferita
L’SDK
Il tipo di CPU
Altri parametri per la gestione della
memoria
Sources:
http://developer.android.com/tools/devices/index.ht
ml
Eseguiamo l’applicazione
Esercizi
Modifichiamo il testo della stringa (inserire un altro testo)
Modifichiamo il colore della stringa
Cambiamo la dimensione della stringa
Inseriamo una immagine
Inseriamo un bottone
Creiamo prima il bottone all’interno del layout
Si noti che il bottone verrà identificato univocamente da un id descritto a sua
volta da una costante all’interno del file R.java
L’operazione di cast è necessaria in quanto tale metodo ritorna il componente
ottenuto attraverso un riferimento di tipo «View» che ne rappresenta una
generalizzazione
Un bottone deve essere collegato alla vista a cui appartiene
Ora aggiungiamo un ascoltatore al bottone per gestire il tipo di evento
desiderato
○
Registreremo una implementazione anonima dell’interfaccia View.OnClickListener()
come ascoltatore dell’evento definendo poi l’evento onClick(),
Esercizi 1/2
A questo punto associamo al bottone la funzione di modificare il
testo nella MainActivity con una stringa a nostro piacere
Ora vediamo come inserire una nuova Activity
Creiamo un file SecondActivity.java e lo inseriamo all’interno del nostro
package di riferimento (New class nome classe)
Estendiamo la classe alla sovraclasse Activity in modo tale da ereditare i
metodi di callback
Importiamo i vari package necessari
Creiamo un nuovo file di layout (es. secondlayout.xml) e al suo interno
inseriamo una label con una scritta a piacere (il nome del file xml tutto in
piccolo !!!)
Ora tornando sulla classe secondScreen settiamo il riferimento al file di
layout appena creato
A questo punto dalla classe MainActivity creiamo l’Intent che ci permette di
avviare la seconda schermata
○
○
Intent intent = new Intent(this, secondScreen.class);
startActivity(intent); da associare all’evento onClick() del pulsante
Proviamo ad eseguire il programma
Cosa ci siamo dimenticati?
Di modificare il file AndroidManifest.xml
Infatti dobbiamo dichiarare la nuova Activity appena creata
Esercizi 2/2
Ora proviamo ad abilitare la videocamera del nostro
dispositivo attraverso un bottone che inseriremo nella
seconda schermata
Suggerimento: utilizziamo le «action»
Si parla di nuovo di Intent esplicite quando si intende far comunicare
attività della stessa applicazione, già note in fase di sviluppo
L’avvio della camera avviene tramite la chiamata alla action
«android.media.action.IMAGE_CAPTURE»
Fine
La
prossima lezione:
Introduzione alle OpenCV
OpenCV per Android
Alcuni esempi (video)
Resources
http://developer.android.com/index.html
http://www.eclipse.org/
http://www.androidiani.com/
http://teyvoniathomas.com/index.php/projects/56-opencv-onandroid.html