Guida allo sviluppo

Local Navigation

Recupero della posizione di un dispositivo mediante il servizio di geolocation

I seguenti passaggi mostrano come creare un'applicazione dell'interfaccia utente che fornisca la posizione del dispositivo BlackBerry mediante il servizio di geolocation.

Prima di iniziare: Verificare che il dispositivo BlackBerry o BlackBerry Smartphone Simulator possa accedere al servizio di geolocation.
  1. Importare le classi e le interfacce richieste.
    import net.rim.device.api.gps.*;
    import net.rim.device.api.system.Application;
    import net.rim.device.api.ui.*;
    import net.rim.device.api.ui.component.*;
    import net.rim.device.api.ui.container.*;
    import javax.microedition.location.*;
  2. Creare il framework dell'applicazione estendendo la classe UiApplication. In main(), creare un'istanza della nuova classe e richiamare enterEventDispatcher() per abilitare l'applicazione a ricevere gli eventi. Nel costruttore dell'applicazione, richiamare pushScreen() per visualizzare la schermata personalizzata per l'applicazione. La classe GeolocationScreen, descritta nel passaggio 3, rappresenta la schermata personalizzata.
    public final class GeolocationDemo extends UiApplication
    {
        public static void main(String[] args)
        {
            GeolocationDemo theApp = new GeolocationDemo();
            theApp.enterEventDispatcher();
        }
        public GeolocationDemo() 
        {
            pushScreen(new GeolocationScreen());
        }
    }
  3. Creare il framework della schermata personalizzata estendendo la classe MainScreen. Creare un'istanza della classe LabelField per memorizzare le coordinate visualizzate sulla schermata. Creare due variabili double per memorizzare i valori di latitudine e longitudine.
    class GeolocationScreen extends MainScreen
    {
        private LabelField _coordLabel;
        private double _latitude;
        private double _longitude;
    }
  4. Nel costruttore della schermata, richiamare super() per creare un menu predefinito. Richiamare setTitle() per specificare il titolo della schermata.
    public GeolocationScreen() 
    {
        super(DEFAULT_CLOSE | DEFAULT_MENU);
        setTitle(new LabelField("Geolocation Demo", Field.USE_ALL_WIDTH | 
                DrawStyle.HCENTER));
    }
  5. Nel costruttore della schermata, creare un'istanza della classe ButtonField per creare un pulsante su cui l'utente BlackBerry deve fare clic per recuperare le informazioni di geolocation del dispositivo. Richiamare Field.setChangeListener() per ricevere gli eventi di modifica del pulsante. Richiamare findGeolocation(), come descritto al passaggio 6, per recuperare le informazioni di geolocation quando l'utente fa clic sul pulsante. Richiamare add() per aggiungere il pulsante alla schermata. Creare un'istanza della classe LabelField per visualizzare le coordinate risultanti e richiamare add() per aggiungere il campo alla schermata.
    ButtonField geolocButton = new ButtonField("Get geolocation", 
            ButtonField.CONSUME_CLICK);
    geolocButton.setChangeListener(new FieldChangeListener()
        {
            public void fieldChanged(Field field, int context)
            {
                findGeolocation();
            }
        });
    add(geolocButton);
    this._coordLabel = new LabelField();
    add(this._coordLabel);
  6. Creare il framework per il metodo findGeolocation. Richiamare setText() con un valore String vuoto per cancellare le coordinate da LabelField. Creare un'istanza della classe Thread che richiama run(). Questo thread è utilizzato per elaborare il recupero delle informazioni di geolocation. In run(), creare un blocco try/catch per specificare la modalità di geolocation. Creare un'istanza della classe BlackBerryCriteria richiamando BlackBerryCriteria() e passare LocationInfo.GEOLOCATION_MODE come modalità di recupero delle informazioni di geolocation. Nel blocco catch, richiamare showException(), come descritto al passaggio 10, per visualizzare il messaggio di errore per un evento UnsupportedOperationException.
    private void findGeolocation()
    {
        this._coordLabel.setText("");
        Thread geolocThread = new Thread() 
        {
            public void run() 
            {
                try
                {
                    BlackBerryCriteria myCriteria = new BlackBerryCriteria(
                            LocationInfo.GEOLOCATION_MODE);
                } 
                catch (UnsupportedOperationException e) 
                {
                   showException(e);
                }
            }
        };
        geolocThread.start();
    }
  7. Nel primo blocco try, creare un secondo blocco try/catch per recuperare un provider di posizioni. Richiamare LocationProvider.getInstance() con l'oggetto BlackBerryCriteria per recuperare un provider di posizioni. Nel blocco catch, richiamare showException(), come descritto al passaggio 10, per visualizzare il messaggio di errore per un evento LocationException.
    try
    {
        BlackBerryLocationProvider myProvider = (BlackBerryLocationProvider)
                LocationProvider.getInstance(myCriteria);
    }
    catch (LocationException e)
    {
        showException(e);
    }
  8. Nel secondo blocco try, creare un terzo blocco try/catch per recuperare le informazioni sulla posizione. Richiamare BlackBerryLocationProvider.getLocation() con un parametro -1 per recuperare un provider di posizioni utilizzando il valore di timeout predefinito. Richiamare getLongitude() e getLatitude() per recuperare, rispettivamente, le coordinate di longitudine e latitudine. Creare un'istanza della classe StringBuffer e aggiungere le coordinate risultanti al buffer. Creare una variabile String e richiamare toString() con l'oggetto StringBuffer per restituire il valore String per le coordinate. Richiamare showResults() per visualizzare i risultati sulla schermata, come descritto al passaggio 9. Nel blocco catch, richiamare showException(), come descritto al passaggio 10, per visualizzare il messaggio di errore per un evento InterruptedException. Nel secondo blocco catch, richiamare showException(), come descritto al passaggio 10, per visualizzare il messaggio di errore per un evento LocationException.
    try
    {
        BlackBerryLocation myLocation =(BlackBerryLocation)myProvider
                .getLocation(-1);
        _longitude = myLocation.getQualifiedCoordinates().getLongitude();
        _latitude = myLocation.getQualifiedCoordinates().getLatitude();
        StringBuffer sb = new StringBuffer();
        sb.append("Longitude: ");
        sb.append(_longitude);
        sb.append("\n");
        sb.append("Latitude: ");
        sb.append(_latitude);
        String msg = sb.toString();
        showResults(msg);
    }
    catch (InterruptedException e)
    {
        showException(e);
    }
    catch (LocationException e)
    {
        showException(e);
    }
  9. Nel metodo showResults, richiamare invokeLater() per aggiungere questa sezione di codice alla coda eventi dell'applicazione. Creare un'istanza della classe Runnable e passarla come parametro a invokeLater(). Sovrascrivere run() nella definizione di Runnable. Richiamare setText() con la variabile String per specificare le coordinate risultanti per LabelField.
    private void showResults(final String msg)
    {
        Application.getApplication().invokeLater(new Runnable()
        {
            public void run()
            {
                GeolocationScreen.this._coordLabel.setText(msg);
            }
        });
    }
  10. Nel metodo showException, richiamare invokeLater() per aggiungere questa sezione di codice alla coda eventi dell'applicazione. Creare un'istanza Runnable e passarla come parametro a invokeLater(). Sovrascrivere run() nella definizione di Runnable. Richiamare Dialog.alert() per creare una finestra di dialogo di avviso e passare il messaggio di errore richiamando getMessage().
    private void showException(final Exception e) 
    {
        Application.getApplication().invokeLater(new Runnable()
        {
            public void run()
            {
                Dialog.alert(e.getMessage());
            }
        });
    }

Le informazioni sono state utili? Inviateci i vostri commenti.