Récupérer le temps de trajet et la distance estimés

Vous pouvez créer une application qui récupère une estimation du temps de trajet et de la distance entre deux lieux. Dans les étapes suivantes, on crée une application d'interface utilisateur contenant un champ de texte dans lequel l'utilisateur de terminal BlackBerry saisit une adresse de destination, un bouton sur lequel l'utilisateur clique pour récupérer le temps et la distance estimés pour atteindre la destination et un champ permettant d'afficher les résultats.

Avant de commencer :

vérifiez que le terminal BlackBerry ou que BlackBerry Smartphone Simulator prend en charge le GPS.

  1. Importez les classes et les interfaces requises.
    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. Créez le cadre d'application en développant la classe UiApplication. Dans main(), créez une instance de la nouvelle classe et appelez enterEventDispatcher() pour activer l'application et recevoir des événements. Dans le constructeur d'application, appelez pushScreen() pour afficher l'écran personnalisé de l'application. La classe TravelTimeScreen décrite à l'étape 3 représente l'écran personnalisé.
    public final class MyTravelTimeDemo extends UiApplication
    {
        public static void main(String[] args)
        {
            MyTravelTimeDemo theApp = new MyTravelTimeDemo();
            theApp.enterEventDispatcher();
        }
        public MyTravelTimeDemo()
        {
            pushScreen(new TravelTimeScreen());
        }
    }
  3. Créez le cadre de l'écran personnalisé en développant la classe MainScreen.
    class TravelTimeScreen extends MainScreen
    {
        private BasicEditField _destinationField;
        private LabelField _timeLabel;
        private LabelField _distanceLabel;
  4. Dans le constructeur, appelez super() pour créer un menu par défaut. Appelez setTitle() pour indiquer le titre de l'écran. Créez une instance de la classe BasicEditField pour créer un champ textuel dans lequel l'utilisateur tape sa destination. Appelez add() pour ajouter le champ à l'écran. Créez une instance de la classe ButtonField pour créer un bouton permettant de récupérer le temps de trajet et la distance estimés. Appelez Field.setChangeListener() pour détecter les modifications du bouton. Appelez findTravelTime(), comme décrit à l'étape 5, pour récupérer le temps de trajet et la distance estimés lorsque l'utilisateur clique sur le bouton. Appelez add() pour ajouter le bouton à l'écran. Créez une instance de la classe LabelField pour afficher les résultats de temps de trajet et la distance.
    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. Créez une méthode dans la classe TravelTimeScreen pour fournir le temps de trajet estimé. Créez une instance de la classe String qui appelle getText() pour récupérer la destination saisie par l'utilisateur. Assurez-vous que le champ n'est pas vide en vérifiant que le champ destination ne comporte pas de valeur nulle ou de longueur 0. Effacez les valeurs des champs de résultat de la durée du trajet et de la distance.
    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. Récupérez les coordonnées géospatiales des points de départ et des destinations, en créant d'abord une instance de la classe Thread dans la méthode findTravelTime qui appelle run(). Dans run(), dans un bloc try/catch, appelez Locator.geocode() et transmettez comme paramètre l'objet de destination String pour rechercher l'adresse et renvoyer un tableau d'objets Landmark. Appelez Landmark.getQualifiedCoordinates() pour récupérer les coordonnées géospatiales de la destination à l'aide du service de géolocalisation. Appelez LocationProvider.getInstance() pour récupérer un fournisseur de positionnement auprès duquel demander la position actuelle. Appelez Location.getQualifiedCoordinates() pour récupérer les coordonnées géospatiales de la position actuelle à l'aide du GPS. Sinon, si le GPS n'est pas disponible, vous pouvez utiliser le service de géolocalisation pour récupérer les coordonnées de la position actuelle.
    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. Créez une instance de la classe TravelTimeEstimator en appelant TraveTimeEstimator.getInstance(). Appelez requestArrivalEstimate() pour demander la durée du trajet et la distance estimés. Spécifiez les objets Coordinates du point de départ et de la destination, puis indiquez l'heure de départ. Dans cet exemple, une demande synchrone est effectuée, car un fil distinct a été créé pour récupérer les coordonnées géospatiales. Vous pouvez utiliser la constante TravelTime.START_NOW pour indiquer un départ immédiat pour le trajet. Appelez showResults(), comme décrit à l'étape 8, pour afficher les résultats.
    TravelTimeEstimator estimator = TravelTimeEstimator.getInstance();
    final TravelTime travelTime = estimator.requestArrivalEstimate(startPoint, endPoint, TravelTime.START_NOW, null);
    showResults(travelTime);
  8. Dans la méthode showResults, appelez invokeLater() pour ajouter une section de code à la file d'attente d'événement de l'application. Créez une instance de la classe Runnable et transmettez-la comme paramètre à invokeLater(). Remplacez run() dans la définition de Runnable. Appelez getElapsedTime() pour récupérer le temps de trajet estimé. Convertissez la durée du trajet renvoyée en millisecondes au format heures:minutes:secondes. Appelez getDistance() pour récupérer la longueur de trajet estimée. Convertissez en kilomètres les distances renvoyées en mètres. Appelez setText() pour afficher les résultats de la durée du trajet et de la distance.
    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);
            }
        });
    }

Ces informations vous ont-elles été utiles ? Envoyez-nous vos commentaires.