Guia do desenvolvedor
Local Navigation
- Visão geral dos serviços que se baseiam em localização
- Encontrar uma localização
- Geocodificação e geocodificação reversa
- Receber alertas de proximidade usando geofence
- Determinar a direção ou a posição
- Obter o tempo estimado de viagem, distância e hora de partida
- Visualizar uma localização usando mapas
- Personalizar a aparência de um mapa
- Integrar com o BlackBerry Maps
- Mais informações
- Glossário
- Enviar comentários
- Aviso legal
Documentação do produto
>
Documentação do desenvolvedor
>
Guias de desenvolvimento Java e referência de API
>
Guia do desenvolvedor
Location-Based Services - BlackBerry Java SDK - 7.0
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.
- 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.*;
- 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()); } } - Crie a estrutura da tela personalizada estendendo a classe MainScreen.
class TravelTimeScreen extends MainScreen { private BasicEditField _destinationField; private LabelField _timeLabel; private LabelField _distanceLabel; - 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); } - 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(""); - 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(); - 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);
- 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); } }); }
Tópico anterior: Obter o tempo estimado de viagem, distância e hora de partida
Estas informações foram úteis? Gostaríamos de receber seus comentários.