+ 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