UNIVERSITÀ POLITECNICA DELLE MARCHE
FACOLTA’ DI INGEGNERIA
Corso di Laurea in Ingegneria Informatica e dell’Automazione
Porting JVoiceXML su Android
Tesi di Laurea di:
Matteo Brunetti
Relatore:
Prof. Aldo Franco Dragoni
Anno Accademico 2011/2012
1
alla mia famiglia….
2
Indice Generale
Ringraziamenti…………………………………………………………………………………..4
Introduzione……………………………………………………………………………………...5
1. Android…………………………………………………………………………
1.1 Panoramica………………………………………………………………………………6
1.2 Architettura Android……………………………………………………………………..8
1.3 Software necessari……………………………………………………………………….9
1.4 Principi di programmazione……………………………………………………………13
2. JVoiceXML…………………………………………………………………….
2.1 Panoramica……………………………………………………………………………..24
2.2 Architettura JVoiceXML……………………………………………………………….25
2.3 Architettura VoiceXML…………………………………………………………………26
2.4 Software utilizzati per JVoiceXML……………………………………………………..29
3. Realizzazione del progetto…………………………………………………….
3.1 Applicazione finale……………………………………………………………………...31
3.2 Codice del progetto……………………………………………………………………..37
3.3 Config progetto…………………………………………………………………………39
4. Conclusioni………………………………………………………………………………44
5. Bibliografia………………………………………………………………………………47
3
Ringraziamenti
Finalmente ho raggiunto il primo traguardo per la strada verso l’essere Ingegnere, un sogno
coltivato fin da bambino.
Desidero ringraziare il prof. Aldo Franco Dragoni per la sua disponibilità e Luca Palazzo, Gianluca
Dolcini per le risposte ai miei dubbi, e gli aiuti, senza i quali la tesi non avrebbe prodotto alcun
risultato.
Le persone che vorrei ringraziare di più sono i miei genitori, che mi hanno sostenuto moralmente,
sia soffrendo insieme per un esame andato male e sia gioendo per un esame superato, e poi
economicamente. Li vorrei ringraziare anche perché mi hanno permesso di studiare,anche in tempi
di crisi, e raggiungere questo traguardo, per affrontare al meglio il mio futuro. “Vi voglio un mondo
di bene mamma e papà”.
Ringrazio mia sorella Claudia, alla quale voglio un bene dell’anima, per i consigli e i messaggi di
consolazione nei momenti di sconforto.
Inoltre vorrei ringraziare i miei fantastici nonni, nonna Anita, nonno Nadino, nonna Maria, e nonno
Guido che mi guarda dal cielo e so che è felice per me. Poi ringrazio i miei zii, zia Francesca, o
meglio zia “Checca”, e zio Giggi per le loro parole di conforto e incoraggiamento.
Grazie ai miei cugini Guido e Marco, con i quali ho condiviso tutti i momenti della mia vita e poi
Fabio e tutti i cugini.
Un ringraziamento va anche ai miei amici Marco Scaramucci, oltre che grande amico anche
compagno di università con il quale ho affrontato molti esami, Eleonora, Alessia P., Mattia, Davide,
insomma tutti quelli che mi sono stati vicino. Grazie a tutti.
Vorrei concludere con una frase che ripetono i miei genitori:
“se insisti, raggiungi e conquisti”
Matteo Brunetti
4
Introduzione
Negli ultimi anni abbiamo assistito a una vera e propria rivoluzione tecnologica incentrata
principalmente sulla mobilità che ha portato alla nascita e allo sviluppo di nuovi settori di mercato
in fortissima crescita. Il settore alla testa di questa rivoluzione è sicuramente quello dei telefoni
cellulari, e in particolare quello dei dispositivi conosciuti come smartphone.
È un periodo incredibile e interessante per chi si occupa di sviluppo mobile. I telefoni cellulari non
sono più semplici dispositivi per parlare, ma anzi sono dotati delle tecnologie più avanzate, come ad
esempio accelerometro, schermi touch, GPS. Tecnologie che, combinate insieme, creano a dei
prodotti così potenti da far pensare di essere destinati a diventare i prossimi PC.
Grazie all’hardware di cui sono attualmente dotati si possono creare delle applicazioni mobile
innovative e con finalità che rientrano praticamente in qualsiasi ambito della vita quotidiana: lavoro,
divertimento, tempo libero, e molto altro ancora.
I primi due capitoli di questa tesi si concentrano quindi sull’esplorare e spiegare i due grandi temi
che la caratterizzano, da una parte il sistema Android, e dall’altra l’interprete JVoiceXml.
Il tirocinio, svoltosi presso il Dipartimento di Ingegneria dell’Informazione dell’Università
Politecnica delle Marche, ha avuto come obiettivo finale la realizzazione di un sistema di
interazione vocale su robot, dotato di smartphone, attraverso lo standard VoiceXml. Nel tirocinio ha
lavorato con me un altro studente del corso di Ingegneria Informatica e dell’Automazione, Marco
Brunetti.
Pur affrontando insieme tutti i problemi, ognuno di noi si è dedicato maggiormente ad aree diverse
del progetto, inoltre, durante lo sviluppo per gestire la logica dei dialoghi, abbiamo deciso di
utilizzare un particolare linguaggio di markup che si propone come standard per le applicazioni
vocali: VoiceXML. Per utilizzare il linguaggio VoiceXml si rende necessario disporre di un
interprete, JVoiceXML, nel quale abbiamo trovato delle difficoltà ad utilizzarlo nello smartphone.
Nel terzo capitolo si descrivono le varie fasi dello sviluppo del progetto, con spiegazione di alcuni
dei meccanismi di funzionamento e descrizione dei file di configurazione.
5
1.Android
1.1 Panoramica
Creata da Google in collaborazione con l’Open Handset Alliance, il gruppo di 79 aziende che
lavorano insieme per accelerare lo sviluppo e le innovazioni nel settore mobile, Android è la prima
piattaforma completa per lo sviluppo di applicazioni mobile.
Android fu sviluppato inizialmente nel 2003 da una startup californiana di nome Android, Inc.,
fondata da Andy Rubin, Rich Miner, Nick Sears e Chris White. Siamo agli inizi del nuovo
millennio, ogni telefonino ha il proprio sistema operativo chiuso e gli smartphone più evoluti sono
quelli prodotti da Palm e quelli con a bordo Windows Mobile.
In questo scenario, la visione di Andy Rubin era di creare un sistema operativo aperto, basato su
Linux, conforme agli standard, con un'interfaccia semplice e funzionale che mettesse a disposizione
degli sviluppatori strumenti efficaci per la creazione di applicazioni. E soprattutto, a differenza di
tutti gli altri sistemi operativi sul mercato, la sua adozione doveva essere gratuita.
La svolta arriva nel luglio del 2005 quando Google acquista Android, Inc. trasformandola nella
Google Mobile Division con a capo sempre Andy Rubin. L'acquisizione fornì a Rubin i fondi e gli
strumenti per portare avanti il suo progetto. Il passo successivo fu la fondazione nel novembre dello
stesso anno della Open Handset Alliance (OHA).
Il 5 novembre 2007 L'Open Handset Alliance viene istituita ufficialmente e presenta il sistema
operativo Android. Qualche giorno dopo verrà rilasciato anche il primo Software Development Kit
(SDK) per gli sviluppatori che include: gli strumenti di sviluppo, le librerie, un emulatore del
6
dispositivo,
la
documentazione,
alcuni
progetti
di
esempio,
tutorial
e
altro.
Nel giugno del 2007 è arrivato sul mercato il primo iPhone di Apple che ha rivoluzionato il modo
concepire gli smartphone. In molti si aspettavano che Google rispondesse con un proprio
smartphone per cui la sorpresa fu grande quando presentò un intero ecosistema, un sistema
operativo capace di funzionare su molti dispositivi diversi tra loro.
Al momento del lancio Android presentava un numero molto ridotto di applicazioni: un browser
basato su webkit, una rubrica e un calendario sincronizzati con gmail e poco altro. Per invogliare i
programmatori a cimentarsi con questa nuova piattaforma, Google istituì nel gennaio del 2008 un
concorso con un montepremi di 10 milioni di dollari per le migliori 50 applicazioni. Questa strategia
si rivela però vincente in quanto al momento del lancio commerciale di Android 1.0 nel Settembre del
2008 con il primo dispositivo Android, l’HTC Dream, si è già formata un’ampia e attiva comunità di
sviluppatori pronti ad offrire le loro applicazioni sull’Android Market.
Da questo momento si susseguono una serie di versioni a distanza di pochi mesi l’una dall’altra,
Android 1.1(Febbraio 2009), Android 1.5Cupcake (Aprile 2009), Android 1.6 Donut (Settembre
2009), Android 2.0 Éclair (Ottobre 2009),
Android 2.2 Froyo (Maggio 2010),
Android 2.3
Gingerbread (Dicembre 2010), tutte basate su linux kernel 2.6.
Vengono introdotte sempre nuove funzionalità e miglioramenti a quelle esistenti, di particolare
interesse per questo lavoro risultano le funzionalità di Voice Input e Text-to-Speech dalla versione
1.6 in avanti.
Nel Febbraio 2011 esce Android 3.0 Honeycomb, versione dedicata esclusivamente ai tablet.
Infine nell’Ottobre 2011 viene rilasciata pubblicamente l’ultima versione, Android 4.0 Ice Cream
Sandwich, basata su kernel Linux 3.0.
Per dare un’idea delle dimensioni raggiunte, nell’Ottobre del 2011 erano presenti più di 500,000
applicazioni disponibili per Android con un numero stimato di download totali superiore ai10
miliardi dall’Android Market.
Già dalla fine del 2010 Android è diventata la piattaforma più usata per gli smartphones, nel primo
quadrimestre del 2012 ha una quota di mercato del 59% con una base di 331 milioni di dispositivi.
Attualmente sono disponibili diverse piattaforme mobile, come ad esempio Windows Phone 7, iOS,
Symbian, Linux Mobile(LiMO). Le peculiarità che rendono speciale Android sono:
Completamente open source.
Altissima diffusione.
Costi ridotti di accesso e di sviluppo.
Gestione automatica del ciclo di vita dell’applicazione.
7
Estremamente portabile: può essere implementata per una grande varietà di hardware
differente (non solo smartphone, ma anche internet tablet, ebook reader, netbook).
Gestione della grafica e del suono di altissima qualità.
1.2 Architettura Android
Android, essendo un sistema operativo di moderna fattura, è abbastanza complesso. Anche se il suo
target sono i dispositivi mobili, l’architettura di Android ha poco da invidiare a quelle dei comuni
sistemi per desktop o laptop. Tale architettura è presentata schematicamente in Fig.1.
Fig. 1: L’architettura di Google Android
Come si evince dalla figura, Google ha attinto a piene mani dal mondo Open Source. Il cuore di
ogni sistema Android, tanto per cominciare, è un kernel Linux, versione 2.6. Direttamente nel
kernel sono inseriti i driver per il controllo dell’hardware del dispositivo: driver per la tastiera, lo
schermo, il touchpad, il Wi-Fi, il Bluetooth, il controllo dell’audio e così via. Sopra il kernel
poggiano le librerie fondamentali, anche queste tutte mutuate dal mondo Open Source. Da citare
8
sono senz’altro OpenGL, per la grafica, SQLite, per la gestione dei dati, e WebKit, per la
visualizzazione delle pagine Web.
L’architettura prevede poi una macchina virtuale e una libreria fondamentale che, insieme
costituiscono la piattaforma di sviluppo per le applicazioni Android. Questa macchina virtuale si
chiama Dalvik, e sostanzialmente è una Java Virtual Machine. Alcune delle caratteristiche di Dalvik
e della sua libreria non premettono di identificare immediatamente la piattaforma Java disponibile
in Android con una di quelle di riferimento (Java SE, Java ME).
Nel penultimo strato dell’architettura è possibile rintracciare i gestori e le applicazioni di base del
sistema. Ci sono gestori per le risorse, per le applicazioni installate, per le telefonate, il file system e
altro ancora. Infine, sullo strato più alto dell’architettura, poggiano gli applicativi destinati all’utente
finale. Molti, naturalmente, sono già inclusi con l’installazione di base: il browser ed il player
multimediale sono dei facili esempi.
1.3 Software Necessari
Android SDK
Per sviluppare applicazioni in grado di girare su sistemi Android, è necessario installare sul proprio
PC un apposito kit di sviluppo (SDK), che sia completo di emulatore, librerie e documentazione.
La prima buona notizia è che l’Android SDK è disponibile gratuitamente e senza discriminazioni
per sistemi Windows, Linux e MacOS X. Come inizio, non c’è male. È possibile scaricarlo
collegandosi all’indirizzo: http://developer.android.com/sdk/. In particolare, è richiesto che il
sistema disponga già di un Java SDK (JDK) versione 5 o successiva. È strettamente indispensabile
soddisfare questo requisito, poiché Android si programma in Java, e senza un JDK non è possibile
compilare il codice.
9
ADT per Eclipse
Benché Android SDK disponga di script che automatizzano l’installazione delle applicazioni, il
lancio dell’emulatore e il debug del codice, lavorare in un ambiente integrato, con ogni opzione a
portata di clic, è sicuramente più facile. Specie quando l’ambiente integrato si chiama Eclipse.
Nel sito di Android è disponibile anche un plug-in per la celebre piattaforma di sviluppo Open
Source. Questo add-on si chiama Android Development Tools for Eclipse, che abbreviato diventa
ADT.
Il modulo funziona con le più recenti versioni di Eclipse, che sono la 3.3, la 3.4 e anche la nuova
3.5. Può essere installato direttamente dall’interno della piattaforma di sviluppo. Avviate Eclipse ed
eseguite il wizard per l’installazione di nuovi componenti. In Eclipse 3.5 lo si fa con la voce di
menu “Help » Install New Software”. Nella 3.4 la voce di menu è “Help » Software Updates”, e poi
si deve selezionare la scheda “Available software”. In Eclipse 3.3, infine, la voce di menu da
richiamare è “Help » Software Updates » Find and install”, scegliendo poi “Search for new features
to install”. Giunti a destinazione, scegliete l’opzione per aggiungere un nuovo sito remoto alla lista
delle
fonti
presentate
dal
wizard
(pulsante
“Add”).
L’indirizzo
da
specificare
è:
https://dl-ssl.google.com/android/eclipse/r. A questo punto selezionate la voce corrispondente alla
nuova fonte e procedete attraverso i singoli passi del wizard. Il plug-in per lo sviluppo del software
Android sarà automaticamente scaricato e installato.
10
Dopo il riavvio di Eclipse, recatevi immediatamente nella schermata delle preferenze dell’ambiente
(voce di menu “Window » Preferences”). Qui troverete disponibile la nuova categoria “Android”,
nell’elenco sulla sinistra. Selezionatela e impostate il percorso del vostro Android SDK: è
necessario affinché Eclipse possa agganciare il kit di sviluppo.
11
AVD - Android Virtual Device
Il kit di sviluppo comprende un emulatore che ci consentirà di provare le nostre creazioni sul PC,
prima di installarle su un reale dispositivo equipaggiato con Android. Il primo concetto che si deve
assimilare è quello che ha nome Android Virtual Device (AVD), cioè dispositivo virtuale Android.
Nel nostro PC possiamo creare e configurare quanti dispositivi virtuali vogliamo. È come avere
tanti differenti smartphone da utilizzare per i propri test, solo che invece di dispositivi di plastica e
silicio si tratta di macchine virtuali, fatte cioè di puro software, da eseguire attraverso l’emulatore.
In questo modo è anche possibile avviare contemporaneamente sullo stesso PC due o più dispositivi
virtuali, ad esempio per testare un’applicazione che fa interagire più smartphone, come una chat o
un gioco multiplayer. Ogni AVD è configurato almeno con un nome, una versione di SDK
supportata, un valore che indica la quantità di memoria da riservare per la scheda SD e una
risoluzione per lo schermo.
12
Una volta impostata, è possibile avviare la macchina emulata, ottenendo una finestra simile a
quanto si vede nell’immagine sottostante. Questa ci permette di interagire con il device virtuale,
anche se ovviamente ci sono delle limitazioni, trattandosi di un emulatore.
1.4 Principi di Programmazione
Le applicazioni Android sono distribuite sotto forma di file APK (Android Package). Al loro interno
vengono raccolti gli eseguibili in formato DEX, le eventuali risorse associate e una serie di
descrittori che delineano il contenuto del pacchetto. In particolare, nel cosiddetto manifesto,
vengono dichiarate le attività, i servizi, i provider e i receiver compresi nel pacchetto, in modo che il
sistema possa agganciarli e azionarli correttamente.
Android fornisce una collezione di controlli studiati e progettati appositamente per i device mobili:
il
cuore
di
questi
controlli
è
rappresentato
da
due
classi,
android.view.View
e
android.view.ViewGroup. Una View è sostanzialmente un’area rettangolare nello schermo
responsabile del disegno degli elementi grafici e della cattura e gestione degli eventi generati
dall’utente. Un oggetto ViewGroup è anch’esso una View, ma contiene altre View. Nella
piattaforma Android si utilizza il concetto di “layout” per gestire l’impaginazione dei controlli
all’interno di un contenitore di oggetti View.
13
I componenti grafici sono per lo più quelli tradizionali che siamo abituati a vedere in quasi tutti i
programmi,cioè pulsanti, checkbox, caselle di testo editabili, etichette.
Le applicazioni Android si compongono di quattro mattoni fondamentali: le attività (activity), i
servizi (service), i broadcast receiver e i content provider. Ogni applicazione è formata da uno o più
di questi mattoni. Non è detto che li contenga tutti: ad esempio potrebbe essere costituita da due
attività e da un servizio, senza avere broadcast receiver né content provider. Nella stragrande
maggioranza dei casi, comunque, le applicazioni comprendono almeno un’attività. Un’attività è
“una singola e precisa cosa che l’utente può fare”. L’Activity è un concetto legato allo sviluppo
delle interfacce grafiche: normalmente una Activity rappresenta una singola schermata della nostra
applicazione. Le applicazioni possono definire una o più Activity per trattare diverse fasi del
software: ogni Activity è responsabile del salvataggio del proprio stato in modo da poterlo
ristabilire successivamente come parte del ciclo di vita dell’applicazione. È possibile mandare
in esecuzione più attività simultaneamente, ma soltanto un’attività alla volta può occupare il
display. L’attività che occupa il display è in esecuzione e interagisce direttamente con l’utente. Le
altre, invece, sono ibernate e tenute nascoste in sottofondo, in modo da ridurre al minimo il
consumo delle risorse di calcolo. L’utente, naturalmente, può ripristinare un’attività ibernata e
riprenderla da dove l’aveva interrotta, riportandola in primo piano. L’attività dalla quale si sta
allontanando, invece, sarà ibernata e mandata in sottofondo al posto di quella ripristinata. Per prima
cosa le attività possono morire spontaneamente, perché hanno terminato i loro compiti. I casi in cui
un’attività può terminare sono due:
• L’attività è ibernata e il sistema, arbitrariamente, decide che non è più utile e perciò la distrugge.
• Il sistema è a corto di memoria, e per recuperare spazio inizia a “uccidere” bruscamente le attività
in sottofondo. La Fig.1 illustra la sequenza di chiamate ai metodi di Activity eseguite durante i
passaggi di stato dell’attività.
14
Dopo che si è creata un’attività, la si deve registrare all’interno del descrittore dell’applicazione (il
file AndroidManifest.xml), questo affinché il sistema sappia della sua esistenza. Per farlo si usa un
tag <activity> all’interno del tag <application>:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.
android.com/apk/res/android"
package=" mypackage.mysubpackage " . . . >
<application . . . >
<activity android:name=".MyActivity" . . . >. . .
</activity>
...
</application>
</manifest>
Al lancio l’Activity transita per tre differenti stati, creazione, avvio e ripristino, prima di iniziare la
vera e propria esecuzione. Questi eventi possono essere intercettati con gli appositi metodi che
appaiono nella figura. Quando una nuova Activity passa in primo piano, quella corrente viene
messa in pausa, se, ad esempio,arriva una telefonata mentre stiamo usando il browser. In questo
15
caso è possibile riprendere rapidamente l’attività precedente. Se invece l’utente passa ad una nuova
attività che rende la precedente non più visibile, dopo essere messa in pausa viene anche sospesa.
Possiamo lanciare nuove attività da quella attualmente in esecuzione tramite il metodo
startActivity() che è fornito dalla classe Activity. L’oggetto principale per lanciare una nuova
attività è il tipo Intent. Esso è un meccanismo che descrive un’azione specifica.
Questo oggetto Intent può individuare una specifica Activity se lo creiamo riferendoci direttamente
alla classe (Intent esplicito), oppure possiamo soltanto indicare l’azione che vogliamo eseguire, ad
esempio Intent.ACTION_SEND per l’invio di una mail (Intent implicito). Un Intent può essere
utilizzato per: trasmettere l’informazione per cui un particolare evento si è verificato; supportare
l’interazione tra qualsiasi applicazione installata sul dispositivo Android.
Un’ altro aspetto importante della programmazione Android è il Content Provider, cioè un
contenitore di dati e rappresenta uno dei modi migliori per condividere informazioni “globali” tra
applicazioni. Dato che Android è un sistema Linux-based in cui ogni applicativo ha il suo userid
Linux, la sua directory “data” e il suo spazio di memoria dedicato e protetto, gli applicativiAndroid
necessitano dei Content Provider per comunicare tra loro. Alcuni Content Provider forniscono
l’accesso ai dati solo in lettura, mentre altri permettono alle applicazioni di creare, aggiornare,
modificare o cancellare record. Un database SQLite in un device Android è un esempio di sorgente
di dati che possiamo incapsulare all’interno di un Content Provider. Android è provvisto di un
insieme di Content Provider contenuti nel package “android.provider” dell’SDK. Per accedere alle
risorse fornite da un Content Provider utilizziamo un insieme di URL caratterizzati dallo schema
“content://”.
Un argomento importante della programmazione Android riguarda il Service, un processo che gira
in background senza la diretta interazione con l’utente. La classe Service viene utilizzata per creare
componenti software che possono svolgere attività in modo “invisibile”, senza interfaccia utente.
Un esempio di Service lo vediamo nel player di musica, che continua a riprodurre canzoni anche
quando non è in primo piano e stiamo utilizzando altri programmi. Utilizzando i Service possiamo
far girare applicazioni e farle reagire ad eventi anche quando non sono in primo piano.
Un Service avviato ha una priorità più alta rispetto ad Activity in stato di inattività, in questo modo
vi è minore probabilità per un Service di essere terminato dal gestore delle risorse di runtime.
L’AndroidManifest.xml è il file che definisce i contenuti e il comportamento della nostra
applicazione. All’interno di questo file sono elencate le Activity e i Service dell’applicazione, con i
permessi che necessita per funzionare correttamente.
Ogni progetto Android include un AndroidManifest.xml memorizzato nella directory principale del
progetto. In questo file XML si possono inserire nodi per ogni elemento (Activity, Service, Content
16
Provider e così via) che compone la nostra applicazione, impostando i permessi per determinare
come questi interagiscono l’un l’altro e con le altre applicazioni.
Tra i principali permessi che possiamo richiedere sono:
READ_CONTACTS: leggere i dati dei contatti dell’utente.
WRITE_CONTACTS: scrivere i dati dei contatti dell’utente.
RECEIVE_SMS: monitorare l’arrivo di SMS.
INTERNET: accedere ed utlizzare la connessione Internet.
ACCESS_FINE_LOCATION: utilizzare un accurato sistema di localizzazione come il GPS.
La radice di ogni AndroidManifest.xml è il tag <manifest>. Questo tag include i nodi che
definiscono i componenti dell’applicazione, l’ambiente di sicurezza.
Il layout grafico delle activity viene definito in un file XML all’interno della cartella res/layout.
Questo particolare è molto importante, in quanto la gestione dei file aggiuntivi delle nostro progetto
deve seguire una specifica organizzazione, ogni elemento trova il suo posto, ad esempio le
immagini devono essere inserite nelle cartelle res/drawable. Il compilatore delle risorse comprime e
impacchetta le risorse delle nostre applicazioni e successivamente genera una classe “R” che
contiene tutti gli identificatori che possiamo utilizzare per riferirci alle risorse del programma.
A questo punto tramite degli appositi metodi possiamo ottenere un riferimento all’oggetto passando
come argomento l’ID, per fare un esempio findViewById(R.id.salva)può essere utilizzato per trovare
un ipotetico pulsante per il salvataggio. Ecco la struttura di un’applicazione Android a pag.18
17
18
Ora che abbiamo imparato i fondamenti dello sviluppo di applicativi Android rimane un ultimo
passaggio per chiudere il cerchio: il rilascio e la pubblicazione dell'app. Preparare ed eseguire il
packaging di un'applicazione per la pubblicazione è un processo conosciuto come il nome di
release process. Il release process è il processo attraverso il quale passa la nostra app per diventare
la release build, ovvero la versione ufficiale pronta per essere pubblicata. Prima di diventare la
release build, e quindi di essere disponibile per l'utente finale, l'applicazione è la release candidate
build. Solo dopo attente e rigorose verifiche e test l'applicazione diventa la release build.
Il processo per la pubblicazione di una applicazione Android si divide in 5 passi:
1.
2.
3.
4.
5.
Preparare una release candidate build della nostra applicazione.
Testare attentamente e minuziosamente la release candidate.
Generare un package Android e ufficializzarlo con una firma digitale.
Testare attentamente e minuziosamente il package pronto per il rilascio.
Pubblicare l'applicazione.
Per avere una release candidate ufficiale dobbiamo anche effettuare qualche modifica al file di
configurazione AndroidManifest.xml . Alcune modifiche sono imposte dai marketplace come
l'Android Market mentre altre sono dettate dal buon senso e da linee guida comunemente accettate.
Vediamo dunque come dobbiamo preparare l'AndroidManifest.xml per un’ applicazione che
vogliamo ufficializzare a release candidate:
Innanzitutto verifichiamo che l'icona dell'applicazione sia impostata correttamente: questa
icona sarà visualizzata agli utenti e verrà utilizzata dai marketplace per presentare
l'applicazione, quindi è importante che sia d'impatto e perfettamente configurata;
Verificare che il nome dell'applicazione sia appropriato e correttamente impostato: questo
sarà il nome con cui l'applicazione si presenterà agli utenti finali;
Verificare la corretta impostazione del testo indicante la versione dell'applicazione;
Controllare che il codice della versione dell'applicazione sia impostato correttamente:
questo è un codice che la piattaforma Android utilizza per gestire gli aggiornamenti della
nostra applicazione;
Verificare l'impostazione dell’ uses-sdk dell'applicazione: possiamo impostare il massimo,
il minimo e il consigliato SDK Android supportato dall'applicazione. L'Android Market
filtra le applicazioni disponibili per uno specifico utente in base alle informazioni fornite da
ogni file di configurazione AndroidManifest.xml, comprese quelle relative all'Android
SDK;
Verificare di aver disabilitato l'opzione debuggable;
19
Verificare che tutti i permessi richiesti dall'applicazione siano appropriati per un corretto
funzionamento della app: richiediamo solo i permessi davvero necessari e assicuriamoci di aver
richiesto tutto il necessario indipendentemente da come si potrebbe comportare il device senza di
essi. A questo punto possiamo passare alla fase di testing. Se durante i test dovessimo riscontrare
dei bug o delle problematiche di qualche genere, si dovrà valutare la possibilità di interrompere il
processo di rilascio per iniziarlo nuovamente una volta sistemate le problematiche riscontrate.
Se la nostra applicazione ha superato la fase di testing, allora abbiamo ufficialmente la nostra
release canditate build. A questo punto dobbiamo generare il package Android, nella pratica un file
con estensione .apk, e ufficializzarlo con la firma digitale. Per completare facilmente questi
passaggi il plugin di Android per Eclipse mette a disposizione un wizard che semplifica
notevolmente il nostro lavoro. Per lanciare il wizard è sufficiente cliccare con il tasto destro del
mouse sul nostro progetto e selezionare la voce Export. Nella finestra che compare selezioniamo
l'opzione Android e poi Export Android Application come mostrato nella seguente figura:
20
Clicchiamo su Next e arriviamo alla schermata per la selezione della Keystore:
Scegliamo l'opzione Create new keystore e nel campo Location inseriamo il percorso del file in cui
vogliamo memorizzare la chiave. Inseriamo anche la password per la gestione della chiave, la
confermiamo, e clicchiamo su Next.
Accediamo dunque alla schermata Key Creation in cui dobbiamo inserire alcune informazioni
dettagliate sulla chiave, come mostrato dalla seguente figura:
21
Il team di Android suggerisce per il campo Validity di inserire un valore almeno uguale a 25:
l'Android Market infatti rifiuta qualsiasi applicazione che non sia dichiarata valida fino alla data del
22 ottobre 2033. Clicchiamo su Next per accedere alla schermata Destination and key/certificate
checks, selezioniamo la destinazione per il file .apk ed infine clicchiamo su Finish. Abbiamo così
creato un application package file pronto per la pubblicazione: prima però di renderlo disponibile
all'utente finale attraverso i market come l'Android Market è consigliabile eseguire ancora qualche
test sull'installazione del pacchetto .apk che abbiamo appena creato. Proviamo dunque ad installarlo
e disinstallarlo sia nell'emulatore sia su uno o più device reali, in modo da verificare che il processo
di installazione dell'.apk che vogliamo pubblicare sia completo e vada a buon fine. Conclusi anche
questi test sul file .apk possiamo iniziare il procedimento per pubblicare la nostra applicazione
nell'Android Market. Per pubblicare applicazioni nell'Android Market dobbiamo essere registrati
come sviluppatori. Per registrarci è necessario accedere al link
https://play.google.com/apps/publish/signup:
22
Una volta entrati la prima cosa che dobbiamo fare è completare il profilo dello sviluppatore con le
informazioni richieste (Developer name, Email Address, ecc.). Compilato il form con i dati dello
sviluppatore possiamo andare avanti cliccando sul link Continue: a questo punto ci viene richiesto
di pagare una piccola somma per la registrazione (25 dollari) e di fornire le informazioni per
l'account Google Checkout Merchant. L'ultimo passaggio per concludere la registrazione è dare
l'assenso per collegare la nostra carta di credito e il nostro account di registrazione all'Android
Market Developer Distribution Agreement. accediamo da loggati alla pagina principale dell'Android
Market, clicchiamo sul pulsante Upload Application e compiliamo il form che ci viene presentato
con le informazioni richieste. Dovremo ad esempio caricare il file .apk creato durante la procedura
di release, due screenshot dell'applicazione ed eventualmente un'immagine promozionale, e ancora
dovremo specificare il tipo e la categoria dell'applicazione, eventualmente il prezzo, e dare il
consenso ai termini delle correnti Android Content Guidelines. opo aver compilato correttamente il
form per la pubblicazione e aver cliccato sul pulsante Publish, l'applicazione comparirà
immediatamente nell'Android Market: da questo momento potremo vedere le statistiche relative alla
applicazione, come ad esempio quante volte è stata visitata, scaricata ed installata, ed anche i
punteggi ricevuti dagli utenti.
23
2.JVoiceXML
2.1 Panoramica
JvoiceXML è un’implementazione del VoiceXML scritta nel linguaggio di programmazione Java
con un architettura aperta ad estensioni personalizzate. Esso offre librerie e un interprete, per la
facile creazione e processamento di documenti VoiceXML e questo tipo di implementazione è uno
dei tanti che stà supportando gli standard Java API come :
JSAPI:Questa implementazione può essere utilizzata su piattaforme di riconoscimento
vocale e sintetizzatori. JVoiceXML offre due moduli di sintesi vocale per questa
piattaforma:
o Sphinx4: è un sistema di riconoscimento vocale scritto interamente in un linguaggio
Java. È stato creato per mezzo di una collaborazione tra il gruppo Sphinx presso la
Carnegie
Mellon
University,SunMicrosystemsLaboratories,MitsubishiElectricResearchLabs
(MERL),and HewlettPackard (HP), con il contributo dell’Università della California
a Santa Cruz e la Massachusetts Institute of Technology(MIT).
o FreeTTS: è un sistema di sintesi vocale scritto interamente in Java. Esso si basa su
un piccolo motore di sintesi vocale Flite sviluppato presso la Carnegie Mellon
University. Flite deriva dal sistema di sintesi vocale “Festival” presso l’Università di
Edimburgo e dal progetto FestVox presso la Carnegie Mellon University. FreeTTS è
stato costruito dal Speech Integration Group of Sun Microsystems Laboratories:



Willie Walker, Manager and Principal Investigator
Paul Lamere, Staff Engineer
Philip Kwok, Member of Technical Staff
JTAPI:Questa piattaforma può essere utilizzata in aggiunta a qualsiasi altra piattaforma di
implementazione per abilitare il supporto di telefonia. Attualmente ci sono alcuni test
effettuati sulla piattaforma JSAPI, ma questi test hanno ancora bisogno di tempo per essere
ottimizzati.
VoiceXML è solo uno, anche se il principale, dei linguaggi di programmazione usati per creare
interfacce vocali. Ogni qualvolta ci si appresti ad imparare un nuovo linguaggio ci si trova
immediatamente di fronte a due tipologie di problemi:
24
il primo è quello che riguarda la sintassi, ovvero come scrivere una determinata istruzione
per ottenere un certo effetto.
il secondo riguarda la natura del linguaggio: su cosa si basa, quando si usa, come si usa e
quali siano i suoi limiti.
Per quanto riguarda il primo problema, trattandosi di un "dialetto" o più precisamente di una
applicazione di XML, esso è composto da un numero di tag ridotti e la struttura dei documenti
risulta piuttosto semplice. Il secondo punto, al contrario, rappresenta la principale problematica che
possiamo avere nel comprendere quale sia lo scenario di riferimento e quali siano le difficoltà ed i
limiti di in una programmazione di questo tipo.
Prima di entrare nel dettaglio di come è stato strutturato il progetto,è bene fornire un illustrazione
delle varie architetture che sono state utilizzate per realizzarlo.
2.2 Architettura JVoiceXML
Figura 1: Architettura di base del JVoiceXML
Vi sono principalmente due modi, di come i client possono interagire con JVoiceXML, ovvero
utilizzando JNDI o utilizzando il CallMananger. La maggior parte dei client utilizzano il demo Java
Naming Directory Interface per accedere al JVoiceXML. Attraverso il CallManager si possono
effettuare chiamate per una applicazione con questa tecnologia. Attualmente c'è solo il supporto
telefonia di base,ma gli utenti possono anche chiamare applicazioni dai propri programmi in Java.
Concettualmente JNDI consente di connettersi a un JVoice-Server XML. JVoiceXML permette
25
anche di avere tutto ciò sul lato server, con l'aiuto di un CallManager. Questa architettura tipica di
un browser vocale è mostrato in figura 2.
Figura 2: Architettura JVoiceXML utilizzando un CallManager
Qui JVoiceXML attende le chiamate in arrivo e una volta che il CallManager rileva una chiamata
dal PBX(sistema telefonico), chiama l'applicazione configurata JVoiceXML che attraverso il
protocollo http accede al Container servlet per interpretare il documento VoiceXML in questione.
2.3 ArchitetturaVoiceXML
VoiceXML è uno standard basato su XML, sviluppato per creare dialoghi che prevedono sintesi vocale,
riconoscimento vocale e di input telefonici, registrazione di parlato e conversazioni ad iniziativa mista.
Al fine di comprendere il funzionamento di una applicazione vocale ci aiuteremo facendo dei
paragoni con le note pagine internet: possiamo dire che l'architettura tipica di una applicazione Web
comprende il server che ospita il sito e un application server che gestisca i database e il core della
nostra applicazione.
26
Figura 2: Architettura di una applicazione vocale
Questa architettura, rappresenta un grado di complessità
medio-alta e nel momento in cui
decidiamo di rendere attiva la nostra applicazione vocale, si creerà un nuovo layer di presentazione
dei dati chiamato:interfaccia vocale. Una delle principali peculiarità del linguaggio VoiceXML è
quella di essere costruito per sviluppare applicazioni voice-enabled orientate al Web: ciò significa
essere in grado di produrre pagine VoiceXML anche attraverso linguaggi server side (ASP,
ASP.NET, JSP, PHP, ecc.).Per capire come questo sia possibile,possiamo vedere la parte bassa
della figura 1 dove l'utente si connette tramite il telefono al Voice Gateway senza dover ricorrere ad
un particolare browser o plugin. Il Voice Gateway è , fondamentalmente, un server con i seguenti
requisiti:
Ha un interprete VoiceXML, in grado di testare documenti Voice XML.
Uno o più motori di riconoscimento vocale (ASR: Automatic Speech Recognition) che
servono per ascoltare gli input degli utenti. Tecnologia alla base del riconoscimento del
linguaggio orale umano da parte di un computer. Il software ASR utilizzato in questo
progetto prevede 3 modelli differenti che sono utilizzati nel processo di riconoscimento del
parlato:
o un modello acustico, che contiene le rappresentazioni dei suoni che
compongono una parola
27
o un dizionario fonetico, che contiene le parole disponibili in un certo
linguaggio e la pronuncia espressa nei fonemi definiti nel modello acustico
o un modello del linguaggio, utilizzato per restringere la ricerca delle parole,
definendo quale parola potrebbe seguire quella precedentemente riconosciuta
Uno o più motori di sintesi vocale (TTS: Text-to-speech) che vengono utilizzati per produrre
un output vocale da un testo sintetizzato. I sistemi TTS, anche detti sistemi di sintesi vocale,
o sintetizzatori vocali, sono quei sistemi che si occupano della riproduzione artificiale della
voce umana. Esistono diverse tecnologie di sintesi vocale, ma i sistemi di sintesi vocale
utilizzati in questo progetto utilizzano tutti la sintesi concatenativa che risulta superiore alle
altre tecnologie: meno pesante computazionalmente o offrono un parlato non naturale. La
sintesi concatenativa si basa sulla combinazione di frammenti di voce registrati di vario tipo:
ad esempio nella sintesi concatenativa per campioni unitari si possono utilizzare come
frammenti suoni isolati, sillabe, parole, frasi o addirittura periodi, mentre nella sintesi
concatenativa per difoni (utilizzata nella voce default nel sistema TTS utilizzato in questo
progetto) si utilizzano i difoni, ovvero le transizioni da suoni diversi.
Una scheda telefonica ,nel caso di sintetizzatore telefonico,per accettare flussi telefonici in
ingresso. Ovviamente al posto della scheda telefonica si può veicolare la telefonata
attraverso VOIP o SIP.
Quando un utente si connette ad una applicazione vocale in generale:
L'utente avvia l’ applicazione JvoiceXML collegata al nostro Voice Gateway.
Il Gateway interpreta le istruzioni contenute nel file VoiceXML, producendo un messaggio
vocale attraverso la sintesi (TTS), e ricevendo ed interpretando gli input dell'utente (ASR).
Inoltre, il Voice Gateway dialoga con il Web Server attraverso il protocollo HTTP e invia
dati all' "applicationlayer". Quindi possiamo affermare che il Voice Gateway si preoccupa
soltanto di leggere il contenuto dei file VoiceXML inviati dal server Web e di raccogliere gli
input dell'utente.
Il server Web riceve le richieste e rende disponibili i file VoiceXML che arrivano dal Voice
Gateway per la loro interpretazione.
Dopo tutto ciò,possiamo quindi mostrare la vera struttura del VoiceXML:
28
Il Document Server si occupa di fornire i dialoghi all’interprete che esegue il suo lavoro all’interno
di un “contesto”. L’interprete e il suo Context comunicano direttamente con la Implementation
Platform che ha il compito di gestire l’interazione con l’utente. Va ricordato che questo linguaggio
nasce inizialmente per sviluppare applicazioni vocali a cui si accede via telefono e,con la seguente
cura da parte del W3C,si apre a portali vocali con l’aiuto della tecnologia VoIP (Voice over Internet
Protocol). Le richieste e l’invio dei dati delle form, secondo la specifica del W3C, dovrebbero
avvenire attraverso metodi http.
Fondamentalmente il modello di interazione è di tipo client-server, in cui gli utilizzatori delle
applicazioni vocali si collegano al fornitore di servizi attraverso il telefono o programmi specifici di
tipo Voice Browser. In alcuni casi l’interprete si trova sul lato server, per ovvi motivi nel caso di
accesso da telefono, ma anche per ridurre lo sforzo computazionale a carico dei client nelle altre
situazioni. Vediamo infine i principali vantaggi dell’utilizzo di VoiceXML:
Facilità di scrittura e lettura dei dialoghi essendo un derivato del linguaggio XML.
Possibilità di creazione grafica con appositi tools.
Separazione della logica del dialogo dal codice dell’applicazione, questo permette una più
facile manutenzione e possibilità di cambiare i dialoghi senza riscrivere tutto il codice.
2.4 Software necessari per JVoiceXML
Nella realizzazione di questo progetto abbiamo utilizzato 2 tipi si software,ed in questo paragrafo
illustreremo in modo generale cosa sono e su cosa si basano.
29
Eclipse : è un linguaggio di programmazione orientato agli oggetti. I documenti scritti sotto
questa piattaforma utilizzano il linguaggio Java, che poi saranno lanciati su una Java Virtual
Machine e, a tempo di esecuzione, avranno accesso alle API della libreria standard. Ciò
fornisce un livello di astrazione che permette alle applicazioni di essere interamente
indipendenti dal sistema su cui esse saranno eseguite. Parti del codice di JVoiceXML
utilizzano funzioni del JAVA 7 API, necessari e almeno per compilare il codice.
Tomcat :Tomcat è un prodotto free e open source sviluppato in Java all’interno della
fondazione Apache. Tomcat realizza le funzioni di:
o Web server
o Container per le web application conforme alle specifiche Java 2 Enteprise Edition
(J2EE).Il che significa che Tomcat funziona da motore per Servlet e Java Server Pages
(JSP).
Il fatto che Tomcat funga da web server fa sì che una volta connessi ad Internet, il nostro computer
pubblica le informazioni (risponde alle richieste http) esattamente come un qualsiasi altro nodo
della rete e quindi il nostro sito potrebbe essere visitato da un browser su un computer remoto. Nel
nostro caso,i documenti VoiceXML risiederanno all’interno del Container di Tomcat nel quale
JvoiceXML avrà accesso attraverso il protocollo http per selezionare il documento ed eseguirlo.
30
3.Realizzazione del progetto
La prima fase di tirocinio è stata quella di acquisire le basi della programmazione Android e
studiare lo standard VoiceXml, sviluppando degli esempi per prendere praticità con gli strumenti.
In un primo momento avevamo deciso, insieme al prof. Dragoni, di implementare un dialogo su
Android con un robot. Ma a fronte di una moltitudine di problemi, incompatibilità dell’interprete
JVoiceXML e soprattutto della scarsa documentazione al caso, abbiamo deciso di sviluppare il
sistema su desktop.
3.1 Applicazione finale
Prima di tutto abbiamo sviluppato un client che interagisce in remoto con il JVoiceXML e
inizializza le chiamate. Il dialogo è stato realizzato in vxml (per maggiori dettagli leggere la tesi del
mio collaboratore Marco Brunetti).
Dopo aver creato la classe Prova con all’interno il metodo main abbiamo bisogno di connetterci al
browser vocale JVoiceXML.
Ecco l’aspetto del nostro interprete JVoiceXML:
31
JVoiceXML usa le JNDI su RMI (Remote Method Invocation) per tale scopo.
Apriamo una parentesi sul sistema RMI.
Le applicazioni RMI sono generalmente costituite da due parti:
la parte server crea gli oggetti remoti ed i riferimenti a questi e quindi attende l’invocazione
dei metodi da parte di un client
la parte client recupera i riferimenti a questi oggetti e ne invoca i metodi
Le applicazioni RMI necessitano di:
poter recuperare oggetti remoti
comunicare con oggetti remoti
caricare classi per oggetti che sono passati come parametri o restituiti come valore
L’invocazione di metodi remoti è totalmente trasparente al programmatore: i livelli Remote
Reference Layer e Transport Layer si occupano di fatto della gestione a basso livello della
comunicazione:
Il Remote Reference Layer (RRL) ha il compito di instaurare la connessione fra il client e il
server eseguendo operazioni di codifica e decodifica dei dati
Il Transport Layer esegue la connessione vera e propria tra le macchine utilizzando quindi i socket
con il protocollo TCP/IP.
Per ottenere un riferimento, in remoto, al JVoiceXML occorre inserire le seguenti librerie:
import javax.naming.Context;
import javax.naming.InitialContext;
import org.jvoicexml.JVoiceXml;
Poi abbiamo creato e inizializzato un oggetto Context, per accedere alle risorse JNDI attraverso il
seguente codice: Context context = null; context = new InitialContext();
32
Le impostazioni che regolano tutto questo sono contenute in un file denominato jndi.properties, il
quale deve essere inserito nel CLASSPATH del progetto. Il file jndi.properties contiene il seguente
codice:
java.naming.factory. initial =\
com.sun.jndi.rmi. registry .RegistryContextFactory
java.naming.provider.url=rmi://localhost:1099
java.naming.rmi.security.manager=true
La location del JVoiceXML è memorizzata nella proprietà java.naming.provider.url. Se si desidera
accedere a JVoiceXML su un altro computer, devi sostituire il localhost con un indirizzo IP oppure
con il nome del computer.
Le classi che sono necessarie per accedere al JVoiceXML, come org.jvoicexml.JVoiceXML, fanno
parte del jvxml-client.jar e jvxml-xml.jar, file che si trovano all’interno della cartella lib di
installazione del JVoiceXML. Questi file contengono tutte le classi che tu hai bisogno per scrivere
un’applicazione client. Se si utilizza un implementation platform diverso, potrebbe essere
necessario aggiungere altre jar alle librerie del client.
Non ci resta che chiamare il browser per elaborare la richiesta. Questo viene eseguito dall’oggetto
org.jvoicexml.Session (import org.jvoicexml.Session).
L’argomento del metodo createSession() è un oggetto ConnectionInformation. Questo object è
responsabile della selezione dell’implementation platform che abbiamo intenzione di utilizzare.
Un implementation platform dispone di tre tipi di risorse:
telephony,
system output
user input.
Le risorse sono identificate da stringhe. Noi abbiamo usato un dummy telephony implementation e
system output e user input del JSAPI 1.0 implementation platform. Questa combinazione fa uso di
microfono e altoparlante del PC. Utilizziamo la risorsa dummy in modo da non toccare la telefonia.
Con la chiamata jvxml.createSession(info), si crea una sessione che è legata ai tipi di risorse in
questione.
L’argomento del metodo session.call(URI) deve puntare all’URI della radice del documento
dell’applicazione.
Abbiamo visto che l’implementazione delle JNDI si basa su RMI e l’implementazione per l’uso
delle interfacce è ottenuto dal codice RMI dinamico. Questo significa che è necessario fornire la
posizione delle librerie con l’implementazione delle interfacce e un file di sicurezza chiamato
jvoicexml.policy. Questo file riguarda tutti i permessi dell’utente remoto. In generale contiene:
33
grant {
permission java. security .AllPermission;
3 };
Nel caso restrittivo ha il seguente contenuto:
grant {
2 permission java. util .PropertyPermission
”jvoicexml.vxml.version”, ”read”;
permission java. util .PropertyPermission
”jvoicexml.xml.encoding”, ”read”;
permission java.net.SocketPermission
7 ”127.0.0.1:1024−”, ”connect,resolve”;
permission java. io .FilePermission
”${JVOICEXML HOME}/lib/−”, ”read”;
};
La posizione del file è data dalla seguente proprietà:
−Djava.security.policy=jvoicexml.policy
Queste immagini descrivono la posizione del file:
Primo passo è andare sulla cartella del progetto, posizionarsi sul nome della classe Demo.class e poi
andare sul menu Run. Dal menu cliccare Run Configuration.
34
Dal menu Run configuration, cercare il nome della classe sotto Java Application e cliccare su
(x)=Arguments.
Ultimo passo, nella sezione VM arguments inserire −Djava.security.policy=jvoicexml.policy
35
36
3.2Codice del progetto
import java.net.URI;
import java.net.URISyntaxException
import javax.naming.Context;
import javax.naming.InitialContext;
import org.jvoicexml.ConnectionInformation;
import org.jvoicexml.JVoiceXml;
import org.jvoicexml.Session;
import org.jvoicexml.client.BasicConnectionInformation;
import org.jvoicexml.event.ErrorEvent;
public class Prova {
/**
* @param args
*/
public static void main(String[] args) {
//inizializza il servizio di naming definito nel file
jndi.properties
Context context = null;
try {
context = new InitialContext();
} catch (javax.naming.NamingException ne) {
ne.printStackTrace();
System.exit(0);
}
37
//comunica con l'interprete attraverso jndi
JVoiceXml jvxml = null;
try {
jvxml = (JVoiceXml)
context.lookup("JVoiceXml");
} catch (javax.naming.NamingException ne) {
ne.printStackTrace();
System.exit(0);
}
//l'interprete utilizza le jsapi 1.0
final ConnectionInformation info =
new BasicConnectionInformation(
"dummy", "jsapi10", "jsapi10");
//i file voicexml risiedono
su un document server
Tomcat
try {
final Session session =
jvxml.createSession(info);
final URI uri = new
URI("http://localhost:8080/demo1/hello.vxml");
session.call(uri);
session.waitSessionEnd();
session.hangup();
} catch (ErrorEvent | URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}}
38
3.3.Config progetto
-Ecco le jar utilizzate:
D:\Programmi\Java\jre7\lib\resources.jar
D:\Programmi\Java\jre7\lib\rt.jar
D:\Programmi\Java\jre7\lib\jsse.jar
D:\Programmi\Java\jre7\lib\jce.jar
D:\Programmi\Java\jre7\lib\charsets.jar
D:\Programmi\Java\jre7\lib\jfr.jar
D:\Programmi\Java\jre7\lib\ext\access-bridge.jar
D:\Programmi\Java\jre7\lib\ext\dnsns.jar
D:\Programmi\Java\jre7\lib\ext\jaccess.jar
D:\Programmi\Java\jre7\lib\ext\localedata.jar
D:\Programmi\Java\jre7\lib\ext\sunec.jar
D:\Programmi\Java\jre7\lib\ext\sunjce_provider.jar
D:\Programmi\Java\jre7\lib\ext\sunmscapi.jar
D:\Programmi\Java\jre7\lib\ext\sunpkcs11.jar
D:\Programmi\Java\jre7\lib\ext\zipfs.jar
-Referenced Libraries:
D:\Programmi\JVoiceXML\lib\chardet.jar
D:\Programmi\JVoiceXML\lib\commons-codec-1.4.jar
D:\Programmi\JVoiceXML\lib\commons-lang-2.3.jar
D:\Programmi\JVoiceXML\lib\commons-logging-1.1.1.jar
D:\Programmi\JVoiceXML\lib\commons-pool-1.5.5.jar
D:\Programmi\JVoiceXML\lib\httpclient-4.0.3.jar
D:\Programmi\JVoiceXML\lib\httpcore-4.1.jar
D:\Programmi\JVoiceXML\lib\httpcore-nio-4.1.jar
D:\Programmi\JVoiceXML\lib\httpmime-4.0.3.jar
D:\Programmi\JVoiceXML\lib\jlibrtp.jar
D:\Programmi\JVoiceXML\lib\jmf.jar
D:\Programmi\JVoiceXML\lib\js.jar
39
D:\Programmi\JVoiceXML\lib\jsapi.jar
D:\Programmi\JVoiceXML\lib\jsr113.jar
D:\Programmi\JVoiceXML\lib\jvxml-client.jar
D:\Programmi\JVoiceXML\lib\log4j-1.2.16.jar
D:\Programmi\JVoiceXML\lib\org.jvoicexml.jar
D:\Programmi\JVoiceXML\lib\org.jvoicexml.config.jar
D:\Programmi\JVoiceXML\lib\org.jvoicexml.implementation.jsapi10.jar
D:\Programmi\JVoiceXML\lib\org.jvoicexml.implementation.jsapi20.jar
D:\Programmi\JVoiceXML\lib\org.jvoicexml.jndi.jar
D:\Programmi\JVoiceXML\lib\org.jvoicexml.jsapi2.jar
D:\Programmi\JVoiceXML\lib\org.jvoicexml.jsapi2.jse.jar
D:\Programmi\JVoiceXML\lib\org.jvoicexml.processor.srgs.jar
D:\Programmi\JVoiceXML\lib\org.jvoicexml.xml.jar
D:\Programmi\JVoiceXML\lib\org.springframework.beans3.0.5.RELEASE.jar
D:\Programmi\JVoiceXML\lib\org.springframework.core3.0.5.RELEASE.jar
I passi per inserire le .jar riferite al JVoiceXML sono i seguenti:
1-Andare sul nome del progetto. Cliccare su file e poi properties.
40
2-Dal menu a sinistra cliccare su Java build Path e andare sulla voce Libraries.
41
3-Cliccare su Add External JARs.. e aggiungere tutte le jar che si trovano nella cartella lib contenuta
nella cartella di installazione JVoiceXML.
42
43
4.Conclusioni
Perché sviluppare applicazioni vocali?
I benefici ottenibili da applicazioni vocali sono individuabili in:
Accesso ai nostri dati in modo naturale:
la voce è il metodo più semplice e naturale per accedere ai nostri dati, fare domande e
ricevere risposte è una attività che non ha alcun bisogno di addestramento, a differenza
dell'uso di un personal computer. Alla luce dello stato dell'arte delle tecnologie di sintesi e di
riconoscimento, creare interfacce vocali in grado di permettere all'utente di esprimersi in
linguaggio naturale, oggi, è possibile.
Aumentare il bacino di utenti:
un altro dato che non bisogna sottovalutare è la diffusione della telefonia cellulare: il
rapporto tra utenti di telefonia mobile e di computer è di dieci a uno. Se ai primi
aggiungiamo coloro che hanno un telefono fisso, il divario aumenta ulteriormente. Rendere
la nostra applicazione fruibile attraverso il telefono significherebbe perciò conquistare nuove
fasce di utenti.
Accessibilità 24/24 ore:
la maggior parte dei servizi di help desk sono limitati nell'arco della giornata. Se fosse il
nostro server a rispondere alle domande degli utenti potremmo rendere disponibile il
servizio 24 ore al giorno per 7 giorni alla settimana e 365 giorni all' anno, senza nessun
costo aggiuntivo. La nostra applicazione sarà in grado di filtrare le chiamate, fornendo
risposte a quelle più frequenti in modo automatico lasciando libero l'operatore di gestire solo
i casi più difficoltosi o particolari. Questo si tradurrebbe in una maggiore fluidità delle
evasioni delle chiamate ed eviterebbe all'utente lunghe e snervanti attese.
44
Accesso indipendente dalla locazione e dal tempo:
possibilità di accedere ad informazioni importanti da qualsiasi posto ed a qualsiasi ora. Si
pensi al vantaggio di poter sfogliare i documenti su un server attraverso il telefono cellulare
ed ascoltare le informazioni desiderate. Prendiamo ad esempio il caso di un agente di
commercio che necessita di sapere un prezzo o la disponibilità di un particolare prodotto in
tempo reale: potrebbe farlo senza doversi preoccupare di dover raggiungere l'ufficio,
l'albergo o in luogo in cui sia disponibile una connessione Internet. E ovviamente possiamo
applicare lo stesso principio a informazioni come orari di musei, prenotazioni a teatro,
viabilità, previsioni metereologiche, orari dei treni, risultati sportivi, etc.
Portatori di handicap:
aumento delle possibilità d'impiego per portatori di handicap come ipovedenti o persone
con difficoltà di movimento. Rendere disponibili le nostre applicazioni ed i nostri siti
all'interazione vocale permetterà non solo un ampliamento del bacino di utenza, ma,
soprattutto, renderà fruibili le risorse in modo completo ed efficiente da parte di quelle
categorie di utenti disabili che normalmente hanno grosse difficoltà ad accedervi.
Maggiore accessibilità:
l'utilizzo da parte di utenti le cui mani sono impegnate o che comunque non possono
utilizzare una interfaccia grafica. Basti pensare ai navigatori satellitari e ai più moderni
computer di bordo installati sulle automobili, oppure ad un operatore di un particolare
strumento meccanico che ha le mani impegnate nel manovrarlo. In ognuno di questi casi il
nostro utente potrà accedere alle informazioni di suo interesse senza dover distogliere
l'attenzione e lo sguardo e soprattutto senza utilizzare le mani.
Tastiere piccole o assenti:
molti supporti hanno una tastiera limitata, piccola o assente. Per esempio i nuovi cellulari UMTS
che sono in grado di navigare perfettamente all'interno di una pagina XHTML presentano grosse
difficoltà quando si deve accedere ad alcuni menu a tendina o peggio ancora a moduli in cui in
inserire dati. Stesso discorso è valido per palmari o altri dispositivi simili.
45
La piattaforma Android permette di entrare nel mondo dello sviluppo mobile in una delle realtà
attualmente più interessanti ed in continua evoluzione, quella degli applicativi Android, appunto.
Gli strumenti e le possibilità offerte da questa piattaforma ci permettono di lavorare in uno dei
contesti più tecnologicamente avanzati del momento. Lo sviluppo di applicativi mobile non è solo
divertimento, ma rappresenta anche un'interessante occasione di guadagno e offre la possibilità di
entrare in un mercato ancora tutto da scoprire e formare. I market offrono l'occasione di distribuire i
nostri lavori a milioni di utenze a costi decisamente contenuti.
46
5.Bibliografia
Android API Guides -http://developer.android.com/guide/components/activities.html
Redazione Io Programmo-“Android Programming” -Edizioni Masters
Android API Guides -http://developer.android.com/guide/components/fundamentals.html
Guida Android –
http://www.html.it/guide/guida-android
http://punto-informatico.it/PILibri/Dettaglio.aspx?id=238
http://sourceforge.net/projects/jvoicexml/files/userguide/0.7.5.GA/jvxml-userguide0.7.5.GA.pdf
W3C
-Voice
Extensible
Markup
http://www.w3.org/TR/voicexml20/
Language
(VoiceXML)
Version
2.0-
47