Abrufen der geschätzten Reisezeit und Entfernung

Sie können eine Anwendung erstellen, die die geschätzte Zeit und Entfernung für die Reise zwischen zwei Orten abruft. In den folgenden Schritten wird eine Benutzeroberflächen-Anwendung erstellt, die ein Textfeld, in dem der BlackBerry-Gerätebenutzer eine Zieladresse eingibt, eine Schaltfläche, über die der Benutzer die geschätzte Zeit und Entfernung zum Ziel abrufen kann, und ein Feld zur Anzeige der Ergebnisse enthält.

Vor Beginn erforderliche Aktion:

Stellen Sie sicher, dass GPS auf dem BlackBerry-Gerät oder im BlackBerry Smartphone Simulator aktiviert ist.

  1. Importieren Sie die erforderlichen Klassen und Schnittstellen.
    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. Erstellen Sie das Anwendungsframework durch Erweitern der UiApplication-Klasse. Erstellen Sie in main() eine Instanz der neuen Klasse, und rufen Sie enterEventDispatcher() auf, um der Anwendung das Empfangen von Ereignissen zu ermöglichen. Rufen Sie im Anwendungskonstruktor pushScreen() auf, um den benutzerdefinierten Bildschirm für die Anwendung anzuzeigen. Die in Schritt 3 beschriebene TravelTimeScreen-Klasse stellt den benutzerdefinierten Bildschirm dar.
    public final class MyTravelTimeDemo extends UiApplication
    {
        public static void main(String[] args)
        {
            MyTravelTimeDemo theApp = new MyTravelTimeDemo();
            theApp.enterEventDispatcher();
        }
        public MyTravelTimeDemo()
        {
            pushScreen(new TravelTimeScreen());
        }
    }
  3. Erstellen Sie das Framework für den benutzerdefinierten Bildschirm durch Erweitern der MainScreen-Klasse.
    class TravelTimeScreen extends MainScreen
    {
        private BasicEditField _destinationField;
        private LabelField _timeLabel;
        private LabelField _distanceLabel;
  4. Rufen Sie im Konstruktor super() auf, um ein Standardmenü zu erstellen. Rufen Sie setTitle() auf, um den Titel für den Bildschirm anzugeben. Erstellen Sie eine Instanz der BasicEditField-Klasse, um ein Textfeld zur Eingabe des Zielorts für den Benutzer zu erstellen. Rufen Sie add() auf, um das Feld dem Bildschirm hinzuzufügen. Erstellen Sie eine Instanz der ButtonField-Klasse, um für den Abruf der geschätzten Reisezeit und Entfernung eine Schaltfläche zu erstellen. Rufen Sie Field.setChangeListener() auf, um Änderungen zur Schaltfläche abzufragen. Rufen Sie, wie unter Schritt 5 beschrieben, findTravelTime() auf, um die Reisezeit und die Entfernung abzurufen, wenn der Benutzer auf die Schaltfläche klickt. Rufen Sie add() auf, um die Schaltfläche zum Bildschirm hinzuzufügen. Erstellen Sie Instanzen der LabelField-Klasse, um die Ergebnisse zu Reisezeit und Entfernung anzuzeigen.
    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. Erstellen Sie eine Methode in der TravelTimeScreen-Klasse, um die geschätzte Reisezeit bereitzustellen. Erstellen Sie eine Instanz der String-Klasse, die getText() aufruft, um das vom Benutzer eingegeben Ziel abzurufen. Stellen Sie sicher, dass das Feld nicht leer ist, indem Sie das destination-Feld auf Vorhandensein eines Null-Wertes oder von mehreren 0 prüfen. Löschen Sie die Reisezeit- und Entfernungsergebnisfelder.
    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. Rufen Sie die Geokoordinaten für die Ausgangs- und Zielstandorte ab, indem Sie zuerst eine Instanz der Thread-Klasse in der findTravelTime-Methode, die run() aufruft, erstellen. Rufen Sie in run() in einem try/catch-Block Locator.geocode() auf, und übergeben als Parameter den Ziel-String, um die Adresse aufzufinden und ein Array von Landmark-Objekten anzuzeigen. Rufen Sie Landmark.getQualifiedCoordinates() auf, um die Geokoordinaten für das Ziel mithilfe des Geolocation-Dienstes abzurufen. Rufen Sie LocationProvider.getInstance() auf, um zur Anforderung des aktuellen Standortes einen Standortanbieter abzurufen. Rufen Sie Location.getQualifiedCoordinates() auf, um die Geokoordinaten für den aktuellen Standort mithilfe von GPS abzurufen. Alternativ können Sie, wenn GPS nicht verfügbar ist, den Geolocation-Dienst verwenden, um die Koordinaten für den aktuellen Standort abzurufen.
    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. Erstellen Sie durch Aufrufen von TraveTimeEstimator.getInstance()eine Instanz der TravelTimeEstimator-Klasse. Rufen Sie requestArrivalEstimate() auf, um die geschätzte Reisezeit und Entfernung anzufordern. Legen Sie die Coordinates-Objekte für die Ausgangs- und Zielstandorte fest, und legen Sie die Startzeit fest. In diesem Beispiel wird eine synchrone Anforderung ausgeführt, da ein separater Thread erstellt wurde, um die Geokoordinaten abzurufen. Sie können die TravelTime.START_NOW-Konstante verwenden, um den unverzüglichen Reisebeginn anzuzeigen. Rufen Sie, wie unter Schritt 8 beschrieben, showResults() auf, um die Ergebnisse anzuzeigen.
    TravelTimeEstimator estimator = TravelTimeEstimator.getInstance();
    final TravelTime travelTime = estimator.requestArrivalEstimate(startPoint, endPoint, TravelTime.START_NOW, null);
    showResults(travelTime);
  8. Rufen Sie in der showResults-Methode invokeLater() auf, um der Ereigniswarteschlange der Anwendung einen Codeabschnitt hinzuzufügen. Erstellen Sie eine Instanz der Runnable-Klasse, und übergeben Sie diese als Parameter an invokeLater(). Überschreiben Sie run() in der Definition von Runnable. Rufen Sie getElapsedTime() auf, um die geschätzte Reisezeit abzurufen. Konvertieren Sie die zurückgegebene Reisezeit von Millisekunden in ein Format nach dem Muster Stunde: Minute: Sekunden. Rufen Sie getDistance() auf, um die geschätzte Reiseentfernung abzurufen. Konvertieren Sie die zurückgegebenen Entfernungen von Metern in Kilometer. Rufen Sie setText() auf, um die Ergebnisse für Reisezeit und Entfernung anzuzeigen.
    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);
            }
        });
    }

Waren diese Informationen hilfreich? Senden Sie uns Ihren Kommentar.