Android e i sui sensori – Openintents

Come già detto nel precedente articolo i terminali Android come l’htc dream(G1) o l’htc magic(G2) possiedono dei sensori molto interessanti per l’interattività che essi possono fornire all’interfaccia grafica del dispositivo, parliamo dell’accelerometro e del  compasso, se al momento  volessimo però sviluppare applicazioni che utilizzano questi sensori avremo delle serie difficoltà in quanto l’emulatore fornito con l’SDK non consente di poter testare l’applicazione sviluppata.

Spinto dall’esigenza di sviluppare un applicativo che utilizzasse sia l’accelerometro che il compasso, ho cercato in rete una soluzione al problema, ho trovato un progetto open source rilasciato sulla piattaforma google code, questo progetto si chiama openintents.

Openintents, oltre ai numerosi applicativi ha rilasciato un tool che faceva proprio al mio caso, il tool si chiama SensorSimulator, questo tool scritto in java è in grado di connettersi all’emulatore Android tramite l’apertura di un socket di comunicazione, il simulatore di sensori una volta connesso è infatti in grado di veicolari la simulazione dei diversi sensori tra cui l’accelerometro e il compasso.

Come procedere all’installazione

  • Scaricare l’ultima versione openintents-binary-x.x.x.zip
  • Scompattare lo zip ed eseguire il tool SensorSimulator.jar
  • Installare sull’emulatore l’ultima versione di OpenIntents.apk
  • Installare samples/OpenGLSensor.apk (Applicazione d’esempio)

Come procedere al suo utilizzo

Una volta eseguita l’applicazione “SensorSimulator” sul vostro  emultore scegliere l’opzione settings, impostare quindi l’indirizzo IP della vostra macchia e il socket utilizzato per la comunicazione(8010) settings

settImpostati i parametri di connessione, spostarsi nel tab “testing”  premere quindi sul pulsante Connect per eseguire un test di connessione, mettento “la spunta” sui vari sensori disponibili dovreste riuscire a ricevere le tre coordinate dal simulatore,  variando il posizionamento del telefono vituale dovremmo essere in grado di vedere le coordinate variare.

testing

sens_test

Ora che tutto è pronto proviamo l’applicazione di demo, premere il pulsante ritorno(sopra il tasto per chiudere la telefonata) sul nostro emulatore.

sensorsimulator01

Nel prossimo  articolo vedremo come sviluppare un applicazione d’esempio che utilizza questa libreria “openintent”.

Share/Save/Bookmark

Android e i sui sensori – Un pò di teoria

L’accelerometro e il compasso

Nei moderni dispositivi “mobile” sono stati aggiunti dei componenti hardware in grado di rilevare l’orientamento e l’accelerazione dei dispositivi, questi nuovi dispositivi hanno consentito di sviluppare nuove tecniche di input che consentono di interagire con il device in modo più diretto e tramite la gestualità.

Android, tramite la componente Sensor Manager è in grado di gestire i sensori hardware disponibili sul dispositivo, questa classe consente di determinare l’orientamento, monitorare il  cambiamento dell’orientamento e monitorare l’accelerazione rispetto uno dei tre assi.

Accelerometro(da wikipedia)

Un accelerometro è uno strumento di misura in grado di rilevare e/o misurare l’accelerazione.
Negli ultimi anni l’importanza di questi sensori è notevolmente accresciuta, questo perché, accanto alle tradizionali applicazioni in ambito scientifico e aerospaziale, si è sviluppato il loro uso un molti campi civili (automobilistico, testing, analisi meccanica, eccetera).

Con il moltiplicarsi delle applicazioni, sono accresciute anche le tipologie di questi strumenti, e oggi se ne possono contare decine tipi, ognuno con caratteristiche funzionali e costruttive differenti.

Gli accelerometri sono presenti oggi in molti dispositivi portabili controlli per video games: Nokia N95, Nokia 5800, Sony Ericsson W910i, Blackberry Storm, Apple iPhone], Apple iPod Nano 4G Nintendo’s Wii Remote e  Google G1.

Utilizzando la chiamata getSystemService è possibile acquisire una reference al  servizio relativo ai sensori, il metodo  public abstract Object getSystemService (String name) è in grado infatti di ritornare un riferimento a livello di sistema al servizio,  Context.SENSOR_SERVICE è il nome del servizio che dovremo utilizzare per acquisire un instanza del SensorManager di Android.


Share/Save/Bookmark

Android accesso alle risorse (II di II)

In questo secondo articolo vogliamo mostrarvi, con un esempio pratico, come sia possibile modificare le risorse di un un applicativo Android a runtime, nell’area download è possibile scaricare il progetto d’esempio, qui il link all’articolo precedente.

Cambiamento delle risorse a Runtime
La classe Activity di Android, ha la capacità di ricevere notifiche sul cambiamento di configurazione da parte del dispositivo; l’evento viene gestito tramite il metodo onConfigurationChanged(Configuration config). nel progetto d’esempio viene gestito l’evento del cambio della configurazione sull’orientamento del video: per abilitare un Activity alla ricezione dell’evento oltre a sovrascrivere il metodo della classe padre Activity è necessario dichiarare che suddetta Activity è abilitata a ricevere questo evento; aggiungiamo quindi nel file di configurazione dell’applicazione(AndroidManifest.xml) una ulteriore direttiva: android:configChanges=”orientation|keyboardHidden”

<activity android:name=”.ResChangeExample”
android:label=”@string/titoloApplicazione”
android:configChanges=”orientation|keyboardHidden”>

onconfigurationchanges

Lo scopo dell’esempio è quello di mostrare due immagini differenti in base all’orientamento del video del dispositivo, come si puo’ notare nel file di risorse, oltre all’icona abbiamo aggiunto altre due immagini amit.jpg e amobl.jpg img_resource

Per default carichiamo una delle due immagini definendole nel file di layout, come si può notare  l’immagine viene referenziata tramite il riferimento “@drawable/amit”,  “@drawable” indica che la risorsa si trova nel folder “res/drawable/” seguita poi dal nome del file immagine senza estensione.

Vediamo nel video il funzionamento dell’applicazione: tramitela combinazione dei tasti CTRL+F11  forziamo l’emulatore a cambiare l’orientamento del display. Da notare il cambiamento d’immagine al variare dell’orientamento.

Il codice in dettaglio:

methodIn questo articolo abbiamo visto un  esempio abbastanza banale ma che rende bene l’idea di come si possano gestire i vari cambi di configurazione consentiti dal dispositivo(Language, Screen Orintation, Keyboard input type, ecc). Da notare che al momento con l’attuale versione di Android non è possibile agire sul cambio di Locale fissato al lang  “en”.

Share/Save/Bookmark

Android accesso alle risorse (I di II)

Android supporta l’esternalizzazione delle risorse, una pratica che evita di cablare le risorse a livello di codice. Le risorse esternalizzate in Android possono essere di vario tipo: stringhe, colori, immagini, animazioni, temi e layout.

Esternalizzare una risorsa significa aumentare la manutenibilità l’aggiornamento  e la gestione in generale di una applicazione, un esempio su tutti è il concetto d’internazionalizzazione che utilizza un file diverso per ogni lingua.

Come funziona l’esternalizzazione di Android?

Le risorse applicative sono memorizzate sotto la cartella  /res del progetto, ogni risorsa  è contenuta all’interno di una sotto cartella specifica in base alla sua tipologia. Quando creiamo un nuovo progetto(da Eclipse) automaticamente ADT(Android Developer Tool) creerà il folder /res e  tre “subfolder”  principali, che sono: values, drawable e layout.

resdrawable contiene i files immagini, possono essere usati oltre i file png anche formati jpeg e gif anche se il prmo formato è da preferire

layout contiene i file di layout, questi file hanno lo scopo di disaccoppiare  il layer di presentazione da quello di business, tramite questi file xml è possibile infatti disegnare la user interface per ogni singola “activity”. Avere un disaccoppiamento della  view dal codice offre una serie di benefici, un esempio su tutti è la possibilità di definire viste diverse in base a l’hardware e/o alla dimensioni dello schermo o al suo orientamento(verticale/orizzontale).

values in questa cartella vengono definite tutte le risorse come stringhe, colori e dimensioni.Nel file xml è possibile definire il tipo di valore memorizzato: “<string”,”<dimen”,”<color” e “<array”

Come utilizzare le risorse

Le risorse possono essere utilizzate direttamente nel codice, oppure  referenziate in altre risorse, la classe R contiene un riferimento statico per ogni tipo di risorsa( R.string , R.drawable), ogni volta che viene aggiunta o modificata una risorsa, ADT si occupa di aggiornare la classe R aggiungendo i riferimenti alle risorse  definite nelle directorie contenute in /res.

Nel prossimo articolo andremo in dettaglio sull’argomento  e realizzeremo un applicativo d’esempio con il quale poter variare dinamicamente il layout.

Share/Save/Bookmark

Android plugin per NetBeans

Anche gli amanti dell’abiente di sviluppo Netbeans potranno oggi contare su un plug-in molto interessante.

Si chiama nbandroid il plug-in per netbeans, ospitato nel repository “Project Kanai” il progetto è stato sviluppato a partire dal mese di novembre 2008 e al momento conta 34 membri.

Per chi fosse interessato a provare questo plug-in può visitare la seguente pagina.

Share/Save/Bookmark

Android database

Android utilizza SQLite come database, SQLite è una libreria che implementa un database engine transazionale, questo database ha una serie di caratteristiche che lo rendono particolarmente adatto all’utilizzo su dispositivi di tipo “embedded”.

Self-contained
si definisce self-contained in quanto richiede un supporto minimale alle librerie esterne e al sistema operativo

servless

Generalmente un database tradizionale è implementato come un processo server che viene utilizzato tipicamente tramite un protocollo come TCP/IP, SQLite non lavora in questo modo, il processo utilizzatore del servizio accede direttamente sia in scrittura che in lettura ai file presenti sul disco, non esiste infatti un processo intermediario.

Questa modalità operativa consente di utilizzare questo database senza la necessità di installare e configurare nessun processo sul sistema operativo ospitante, il rovescio della medaglia è quello di avere un minor controllo in generale sulle attività dell’utilizzatore(client) e una minore sicurezza in termini di robustezza e corruzione dei dati

zero-configuration
SQLite come dicevamo non richiede una fase d’installazione ne una procedura di setup

Share/Save/Bookmark

Sviluppare in Android- Seconda parte

Nel precedente articolo abbiamo visto come definire il menu, procediamo con il codice necessario per agganciare delle azioni alle diverse voci del menu precedentemente creato.
Sempre nella classe LunarLander.java è presente un altro metodo onOptionsItemSelected(MenuItem item)
questo metodo ridefinito dalla classe padre Activity viene richiamato quando l’utente seleziona una qualsiasi voce del menu.
Vediamo in dettaglio il comportamento della prima voce di menu’

switch (item.getItemId()) {
case MENU_START:
mLunarThread.doStart();
return true;

tramite uno switch sull’id selezionato, viene richiamata l’azione corrispondente, in questo caso viene avviato il gioco, vedremo più avanti il comportamento in dettaglio, per il momento procediamo analizzando il primo metodo richiamato della classe LunarLander quando l’activity viene creata, stiamo parlando del metodo
onCreate(Bundle savedInstanceState).


Il primo metodo(requestWindowFeature) serve a disabilitare il titolo della finestra.
Il secondo metodo setContentView, indica al sistema di utilizzare il layout definito a livello XML, anche in questo caso la risorsa viene recuperata con la classe “speciale” R.
Il Layout
Android ha la possibilità di sfruttare due modalità per la definizione dell’interfaccia, la prima mediante codice java, in uno stile simile alle librerie Swing di Java Sdk e l’altro decisamente più semplice ed intuitivo mediante tag xml.


Nella definizione XML del Layout, possiamo notare un ViewGroup(FrameLayout ) che definisce
il contenitore principale degli elementi grafici. Il contenitore principale può al suo interno contenere altri contenitori o elementi grafici.
Per assegnare un ID ad un elemento si utilizza la sintassi @+id/nome_del_id,
questo ID assegnato sarà recuperabile successivamente tramite la classe R.
In questo caso specifico, viene utilizzata una classe LunarView per la rappresentazione a video del gioco vero e proprio.
Tornando al metodo onCreate, tramite la chiamata R.id.lunar, siamo in grado di prendere il riferimento alla classe LunarView.
Successivamente prendiamo dalla classe il riferimento
al thread che si occuperà dell’esecuzione del gioco, settiamo infine uno stato al thread.

Tornando al menu vediamo che per far partire il gioco viene
richiamata una funzione proprio su questo thread recuperato(mLunarThread.doStart();)

Share/Save/Bookmark