Recuperar la duración y distancia estimadas del viaje

Puede crear una aplicación que recupere la duración y la distancia estimadas que se tarda en desplazarse entre dos ubicaciones. En los siguientes pasos, se crea una aplicación de interfaz de usuario que contiene un campo de texto en el que el usuario del dispositivo BlackBerry escribe una dirección de destino, un botón en el que el usuario hace clic para recuperar la duración y la distancia estimadas para alcanzar el destino y un campo para mostrar los resultados.

Antes de comenzar:

Asegúrese de que el dispositivo BlackBerry o BlackBerry Smartphone Simulator tienen la tecnología GPS activada.

  1. Importe las clases y las interfaces necesarias.
    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. Cree el marco de la aplicación ampliando la clase UiApplication. En main(), cree una instancia de la clase nueva e invoque enterEventDispatcher() para activar la aplicación para recibir eventos. En el constructor de la aplicación, invoque pushScreen() para mostrar la pantalla personalizada para la aplicación. La clase TravelTimeScreen, descrita en el paso 3, representa la pantalla personalizada.
    public final class MyTravelTimeDemo extends UiApplication
    {
        public static void main(String[] args)
        {
            MyTravelTimeDemo theApp = new MyTravelTimeDemo();
            theApp.enterEventDispatcher();
        }
        public MyTravelTimeDemo()
        {
            pushScreen(new TravelTimeScreen());
        }
    }
  3. Cree el marco de la pantalla personalizada ampliando la clase MainScreen.
    class TravelTimeScreen extends MainScreen
    {
        private BasicEditField _destinationField;
        private LabelField _timeLabel;
        private LabelField _distanceLabel;
  4. En el constructor, invoque super() para crear un menú predeterminado. Invoque setTitle() para especificar el título de la pantalla. Cree una instancia de la clase BasicEditField para crear un campo de texto para que el usuario escriba el destino en él. Invoque add() para agregar el campo a la pantalla. Cree una instancia de la clase ButtonField para crear un botón para recuperar la duración del viaje y la distancia estimadas. Invoque Field.setChangeListener() para escuchar los cambios en el botón. Invoque findTravelTime(), que se describe en el paso 5, para recuperar la duración del viaje y la distancia estimadas cuando el usuario haga clic en el botón. Invoque add() para agregar el botón a la pantalla. Cree instancias de la clase LabelField para mostrar los resultados de duración del viaje y la distancia.
    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. Cree un método en la clase TravelTimeScreen para proporcionar la estimación de la duración del viaje. Cree una instancia de la clase String que invoque getText() para recuperar el destino que el usuario ha escrito. Compruebe que el campo no está vacío buscando un valor null o una longitud de 0 en el campo destination. Desactive los campos de resultados de la duración del viaje y la distancia.
    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. Recupere las coordenadas geoespaciales para las ubicaciones de partida y destino, creando en primer lugar una instancia de la clase Thread en el método findTravelTime que invoque run(). En run(), en un bloque try/catch, invoque Locator.geocode() y pase como parámetro el destino String para buscar la dirección y devolver una matriz de objetos Landmark. Invoque Landmark.getQualifiedCoordinates() para recuperar las coordenadas geoespaciales del destino mediante el servicio de geoubicación. Invoque LocationProvider.getInstance() para recuperar un proveedor de ubicación y solicitar la ubicación actual. Invoque Location.getQualifiedCoordinates() para recuperar las coordenadas geoespaciales de la ubicación actual mediante GPS. De forma alternativa, si no hay GPS disponible, puede utilizar el servicio de geoubicación para recuperar las coordenadas de la ubicación actual.
    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. Cree una instancia de la clase TravelTimeEstimator invocando TraveTimeEstimator.getInstance(). Invoque requestArrivalEstimate() para solicitar la duración y la distancia estimadas del viaje. Especifique los objetos Coordinates para las ubicaciones de partida y destino y especificar la hora de partida. En este ejemplo, se ha realizado una solicitud síncrona porque se ha creado un subproceso independiente para recuperar las coordenadas geoespaciales. Puede utilizar la constante TravelTime.START_NOW para indicar que el viaje comienza inmediatamente. Invoque showResults(), descrito en el paso 8, para mostrar los resultados.
    TravelTimeEstimator estimator = TravelTimeEstimator.getInstance();
    final TravelTime travelTime = estimator.requestArrivalEstimate(startPoint, endPoint, TravelTime.START_NOW, null);
    showResults(travelTime);
  8. En el método showResults, invoque invokeLater() para agregar esta sección de código a la cola de eventos de la aplicación. Cree una instancia de la clase Runnable y pásela como parámetro a invokeLater(). Omita run() en la definición de Runnable. Invoque getElapsedTime() para recuperar la duración estimada del viaje. Convierta el valor de duración del viaje de milisegundos al formato hora: minutos: segundos. Invoque getDistance() para recuperar la distancia estimada del viaje. Convierta las distancias devueltas de metros a kilómetros. Invoque setText() para mostrar los resultados de duración y distancia del viaje.
    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 ha resultado útil esta información? Envíenos sus comentarios.