Recuperar o tempo de viagem estimado e a distância

Você pode criar um aplicativo que recupere o tempo e a distância estimados para viajar entre as duas localizações. Nas seguintes etapas, um aplicativo de interface de usuário é criado, contendo um campo de texto no qual o usuário do aparelho BlackBerry digita um endereço de destino, um botão no qual o usuário clica para recuperar o tempo e a distância estimados para chegar ao destino e um campo para exibir os resultados.

Antes de começar:

Assegure-se de que o aparelho BlackBerry ou o BlackBerry Smartphone Simulator tenha o GPS habilitado.

  1. Importe as classes e interfaces necessárias.
    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. Crie a estrutura do aplicativo estendendo a classe UiApplication. Em main(), crie uma instância da nova classe e invoque enterEventDispatcher() para habilitar o aplicativo para receber eventos. No construtor de aplicativo, invoque pushScreen() para exibir a tela personalizada do aplicativo. A classe TravelTimeScreen, descrito na etapa 3, representa a tela 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. Crie a estrutura da tela personalizada estendendo a classe MainScreen.
    class TravelTimeScreen extends MainScreen
    {
        private BasicEditField _destinationField;
        private LabelField _timeLabel;
        private LabelField _distanceLabel;
  4. No construtor, invoque super() para criar um menu padrão. Invoque setTitle() para especificar o título da tela. Crie uma instância da classe BasicEditField para criar um campo de texto para o usuário digitar o destino. Invoque add() para adicionar o campo à tela. Crie uma instância da classe ButtonField para criar um botão para carregar a estimativa de tempo de viagem e distância. Invoque Field.setChangeListener() para escutar as alterações no botão. Invoque findTravelTime(), que é descrito na etapa 5, para carregar a estimativa de tempo de viagem e distância quando o usuário clicar no botão. Invoque add() para adicionar o botão à tela. Crie instâncias da classe LabelField para exibir os resultados de tempo de viagem e distância.
    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. Crie um método na classe TravelTimeScreen para fornecer a estimativa de tempo de viagem. Crie uma instância da classe String que chama getText() para carregar o destino que o usuário digitou. Confirme que o campo não está vazio, assinalando um valor nulo ou uma extensão 0 no campo destination. Limpe os campos de resultado de tempo de viagem e distância.
    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. Carregue as coordenadas geoespaciais para as localizações de início e fim, criando primeiramente uma instância da classe Thread no método findTravelTime que invoca run(). Em run(), em um bloco try/catch, chame Locator.geocode() e defina como parâmetro o destino String para encontrar o endereço e retorna uma matriz de objetos Landmark. Invoque Landmark.getQualifiedCoordinates() para carregar as coordenadas geoespaciais para o destino usando o serviço de localização geográfica. Invoque LocationProvider.getInstance() para carregar um provedor de localização para solicitar a localização atual. Invoque Location.getQualifiedCoordinates() para carregar as coordenadas geoespaciais para a localização atual usando GPS. Por outro lado, se o GPS estiver indisponível, você poderá usar o serviço de localização geográfica para recuperar as coordenadas para a localização atual.
    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. Crie uma instância da classe TravelTimeEstimator chamando TraveTimeEstimator.getInstance(). Invoque requestArrivalEstimate() para solicitar a estimativa de tempo de viagem e distância. Especifique os objetos Coordinates para as localizações de início e fim e especifique o horário de início. Neste exemplo, uma solicitação de sincronização é feita porque um thread separado foi criado para recuperar as coordenadas geoespaciais. Você pode usar a constante TravelTime.START_NOW para indicar que a viagem começa imediatamente. Invoque showResults(), que é descrito na etapa 8, para exibir os resultados.
    TravelTimeEstimator estimator = TravelTimeEstimator.getInstance();
    final TravelTime travelTime = estimator.requestArrivalEstimate(startPoint, endPoint, TravelTime.START_NOW, null);
    showResults(travelTime);
  8. No métodoshowResults, chame invokeLater() para adicionar esta seção de código à fila de eventos do aplicativo. Crie uma instância da classe Runnable e defina-o como um parâmetro para invokeLater(). Substitua run() na definição de Runnable. Invoque getElapsedTime() para carregar o tempo estimado de viagem. Converta o tempo de viagem retornado de milissegundos para um formato hora: minuto: segundos. Invoque getDistance() para carregar a distância estimada de viagem. Converta as distâncias retornadas de metros para quilômetros. Invoque setText() para exibir os resultados de tempo de viagem e distância.
    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);
            }
        });
    }

Estas informações foram úteis? Gostaríamos de receber seus comentários.