Eccoci alla seconda puntata dedicata alle problematiche di integrazione con le applicazioni native del BlackBerry. Prima di affrontare i temi tecnici, sono molto contento di poter annunciare che l'applicazione
Copilota è stata scaricata più di 150 volte nei primi due giorni dalla pubblicazione. Anche le altre applicazioni per BlackBerry che abbiamo rilasciato i mesi scorsi, cioè
IBANc,
Risparmiometro e
BB Trainer, sono state riscoperte e scaricate molte volte. Devo anche ringraziare gli amici di
BlackBerryItalia,
BBWorld e
Blackberry Italian Usergroup per aver pubblicato sui loro siti Web articoli sulle nostre applicazioni.
L'argomento di questo post è l'integrazione con il GPS e lo strumento per le Mappe. Il mio scopo era abbastanza semplice, cioè leggere le coordinate correnti e visualizzarle sulla mappa. Ovviamente il GPS fornisce molte altre informazioni, come l'altitudine o la velocità, ma per il momento mi sono limitato a latitudine e longitudine.
Prima di tutto è necessario recuperare un'istanza della classe
javax.microedition.location.LocationProvider tramite il metodo statico
getInstance(Criteria criteria): il parametro criteria permette di indicare il tipo di localizzazione desiderato (ad esempio GPS o GSM), specificando null, come nel mio caso, si ottiene il LocationProvider predefinito. Nel caso in cui questa funzionalità non sia disponibile viene lanciata una LocationException.
locationProvider = LocationProvider.getInstance(null);A questo punto è possibile recuperare le coordinate correnti tramite il metodo getLocation(int timeout). La documentazione in formato PDF riporta una nota non presente nei JavaDoc: questa chiamata non può essere eseguita nel thread degli eventi (ad esempio nel gestore di un menù), altrimenti viene lanciata un'eccezione LocationException. Ho sperimentato direttamente che quanto affermato è vero e quindi ho dovuto lanciare un thread in background per eseguire il metodo. Quindi nel metodo run() bisogna scrivere qualcosa del genere:
Location location = locationProvider.getLocation(60);QualifiedCoordinates qf = location.getQualifiedCoordinates();double latitudine = qf.getLatitude();double longitudine = qf.getLongitude();Per lasciare l'utente in attesa del completamento dell'operazione ho aperto un dialogo modale con una barra di avanzamento, che scandisce i secondi.
Una volta recuperate le coordinate è possibile aprire lo strumento per le Mappe e visualizzare la posizione, utilizzando la classe Invoke già analizzata nel post precedente. In questo caso è necessario preparare una stringa con un formato specifico e passarla tramite la classe MapsArguments.
String location = "<lbs>" +
"<location lat='" + String.valueOf((int)(latitudine * 100000)) +
"' lon='" + String.valueOf((int)(longitudine * 100000)) + "'/>" +
"</lbs>";MapsArguments maps = new MapsArguments(MapsArguments.ARG_LOCATION_DOCUMENT, location);Invoke.invokeApplication(Invoke.APP_TYPE_MAPS, maps);L'unica accortezza è moltiplicare per 100000 i valori delle coordinate e quindi trasformarli in interi.
Per ora vi saluto e vi rimando al prossimo articolo, in cui vedremo come gestire in modo personalizzato gli allegati dei messaggi di posta.