Recupero della durata e della distanza del viaggio stimate

È possibile creare un'applicazione che recuperi l'ora e la distanza stimate per viaggiare tra due posizioni. Nei seguenti passaggi, viene creata un'applicazione dell'interfaccia utente che contiene un campo di testo in cui l'utente BlackBerry deve digitare un indirizzo di destinazione, un pulsante su cui l'utente deve fare clic per recuperare l'ora e la distanza stimate per raggiungere la destinazione e un campo per la visualizzazione dei risultati.

Prima di iniziare:

Assicurarsi che il dispositivo BlackBerry o BlackBerry Smartphone Simulator abbiano il GPS attivato.

  1. Importare le classi e le interfacce richieste.
    import net.rim.device.api.lbs.Locator;
    import net.rim.device.api.lbs.travel.*;
    import net.rim.device.api.system.*;
    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 TravelTimeScreen, come descritto al passaggio 3, rappresenta la schermata personalizzata.
    public final class MyTravelTimeDemo extends UiApplication
    {
        public static void main(String[] args)
        {
            MyTravelTimeDemo theApp = new MyTravelTimeDemo();
            theApp.enterEventDispatcher();
        }
        public MyTravelTimeDemo()
        {
            pushScreen(new TravelTimeScreen());
        }
    }
  3. Creare il framework della schermata personalizzata estendendo la classe MainScreen.
    class TravelTimeScreen extends MainScreen
    {
        private BasicEditField _destinationField;
        private LabelField _timeLabel;
        private LabelField _distanceLabel;
  4. Nel costruttore, richiamare super() per creare un menu predefinito. Richiamare setTitle() per specificare il titolo della schermata. Creare un'istanza della classe BasicEditField per creare un campo di testo in cui l'utente deve digitare la destinazione. Richiamare add() per aggiungere il campo alla schermata. Creare un'istanza della classe ButtonField per creare un pulsante per recuperare la durata del viaggio e la distanza stimate. Richiamare Field.setChangeListener() per ricevere gli eventi di modifica del pulsante. Richiamare findTravelTime(), come descritto al passaggio 5, per recuperare la durata del viaggio e la distanza stimate quando l'utente fa clic sul pulsante. Richiamare add() per aggiungere il pulsante alla schermata. Creare istanze della classe LabelField per visualizzare i risultati della durata del viaggio e della distanza.
    public TravelTimeScreen()
    {
        super(DEFAULT_CLOSE | DEFAULT_MENU);
        setTitle(new LabelField("Travel Time Demo" , Field.USE_ALL_WIDTH | DrawStyle.HCENTER));
        this._destinationField = new BasicEditField("Destination: ", "", 500, TextField.NO_NEWLINE);
        add(this._destinationField);
        ButtonField travelButton = new ButtonField("Get Travel Estimate", ButtonField.CONSUME_CLICK);
        travelButton.setChangeListener(new FieldChangeListener() 
        {
            public void fieldChanged(Field field, int context)
            {
                findTravelTime();
            }
        });
        add(travelButton);
        this._timeLabel = new LabelField();
        add(this._timeLabel);
        this._distanceLabel = new LabelField();
        add(this._distanceLabel);
    }
  5. Creare un metodo nella classe TravelTimeScreen per fornire la durata del viaggio stimata. Creare un'istanza della classe String che richiama getText() per recuperare la destinazione digitata dall'utente. Verificare che il campo non sia vuoto controllando se il campo destination contiene un valore null o 0. Deselezionare i campi relativi ai risultati della durata del viaggio e della distanza.
    private void findTravelTime() 
    {
        final String destination = this._destinationField.getText();
        if ((destination == null) || (destination.length() == 0))
        {
            Dialog.alert("Destination field cannot be empty");
            return;
        }
        this._timeLabel.setText("");
        this._distanceLabel.setText("");
  6. Recuperare le coordinate geospaziali per le posizioni di partenza e di arrivo, creando prima un'istanza della classe Thread nel metodo findTravelTime che richiama run(). In run(), in un blocco try/catch, richiamare Locator.geocode() e passare come parametro la destinazione String per trovare l'indirizzo e restituire una matrice di oggetti Landmark. Richiamare Landmark.getQualifiedCoordinates() per recuperare le coordinate geospaziali per la destinazione mediante il servizio di geolocation. Richiamare LocationProvider.getInstance() per recuperare un provider di posizioni per richiedere la posizione corrente. Richiamare Location.getQualifiedCoordinates() per recuperare le coordinate geospaziali della posizione corrente tramite il GPS. In alternativa, se il GPS non è disponibile, è possibile utilizzare il servizio di geolocation per recuperare le coordinate della posizione corrente.
    Thread travelTimeThread = new Thread()
    {
        public void run()
        {
            try
            {
                final Landmark[] landmarks = Locator.geocode(destination.replace('\n', ' '), null);
                Coordinates endPoint = landmarks[0].getQualifiedCoordinates();
                LocationProvider provider = LocationProvider.getInstance(null);
                if (provider == null)
                {
                    throw new IllegalStateException("no LocationProvider available");
                }
                Coordinates startPoint = provider.getLocation(-1).getQualifiedCoordinates();
  7. Creare un'istanza della classe TravelTimeEstimator richiamando TraveTimeEstimator.getInstance(). Richiamare requestArrivalEstimate() per richiedere la durata del viaggio e la distanza stimati. Specificare gli oggetti Coordinates per i punti di partenza e di arrivo e specificare l'ora di partenza. In questo esempio, viene creata una richiesta sincrona perché è stato creato un thread separato per il recupero delle coordinate geospaziali. È possibile utilizzare la costante TravelTime.START_NOW per indicare immediatamente l'inizio del viaggio. Richiamare showResults(), come descritto al passaggio 8, per visualizzare i risultati.
    TravelTimeEstimator estimator = TravelTimeEstimator.getInstance();
    final TravelTime travelTime = estimator.requestArrivalEstimate(startPoint, endPoint, TravelTime.START_NOW, null);
    showResults(travelTime);
  8. 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 getElapsedTime() per recuperare la durata del viaggio stimata. Convertire la durata del viaggio restituita da millisecondi al formato ore: minuti: secondi. Richiamare getDistance() per recuperare la distanza del viaggio stimata. Convertire le distanze restituite da metri a chilometri. RichiamaresetText() per visualizzare i risultati relativi alla durata del viaggio e alla distanza.
    private void showResults(final TravelTime travelTime)
    {
        Application.getApplication().invokeLater(new Runnable()
        {
            public void run()
            {
                long value = travelTime.getElapsedTime() / 1000;
                long seconds = value % 60;
                value /= 60;
                long minutes = value % 60;
                long hours = value / 60;
                StringBuffer buffer = new StringBuffer();
                buffer.append(hours);
                buffer.append(':');
                if (minutes < 10)
                {
                    buffer.append('0');
                }
                buffer.append(minutes);
                buffer.append(':');
                if (seconds < 10)
                {
                    buffer.append('0');
                }
                buffer.append(seconds);
                String msg = "Travel Time (h:m:s): " + buffer.toString();
                TravelTimeScreen.this._timeLabel.setText(msg);
                double distance = travelTime.getDistance() / 1000.0;
                msg = "Distance (km): " + Double.toString(distance);
                TravelTimeScreen.this._distanceLabel.setText(msg);
            }
        });
    }

Le informazioni sono state utili? Inviateci i vostri commenti.