Entwicklungshandbuch

Local Navigation

Abrufen des Gerätstandorts mit dem Geolocation-Dienst

Die folgenden Schritte demonstrieren, wie Sie eine Benutzeroberflächen-Anwendung erstellen, die den BlackBerry-Gerätestandort mithilfe des Geolocation-Diensts bereitstellt.

Vor Beginn erforderliche Aktion: Stellen Sie sicher, dass das BlackBerry-Gerät oder der BlackBerry Smartphone Simulator auf den Geolocation-Dienst zugreifen können.
  1. Importieren Sie die erforderlichen Klassen und Schnittstellen.
    import net.rim.device.api.gps.*;
    import net.rim.device.api.system.Application;
    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 GeolocationScreen-Klasse stellt den benutzerdefinierten Bildschirm dar.
    public final class GeolocationDemo extends UiApplication
    {
        public static void main(String[] args)
        {
            GeolocationDemo theApp = new GeolocationDemo();
            theApp.enterEventDispatcher();
        }
        public GeolocationDemo() 
        {
            pushScreen(new GeolocationScreen());
        }
    }
  3. Erstellen Sie das Framework für den benutzerdefinierten Bildschirm durch Erweitern der MainScreen-Klasse. Erstellen Sie eine Instanz der LabelField-Klasse, um die auf dem Bildschirm angezeigten Koordinaten zu speichern. Erstellen Sie zwei double-Variablen, um die Breiten- und Längenwerte zu speichern.
    class GeolocationScreen extends MainScreen
    {
        private LabelField _coordLabel;
        private double _latitude;
        private double _longitude;
    }
  4. Rufen Sie auf dem Bildschirmkonstruktor super() auf, um ein Standardmenü zu erstellen. Rufen Sie setTitle() auf, um den Titel für den Bildschirm anzugeben.
    public GeolocationScreen() 
    {
        super(DEFAULT_CLOSE | DEFAULT_MENU);
        setTitle(new LabelField("Geolocation Demo", Field.USE_ALL_WIDTH | 
                DrawStyle.HCENTER));
    }
  5. Erstellen Sie im Bildschirmkonstruktor eine Instanz der ButtonField-Klasse, um eine Schaltfläche zu erstellen, auf die der BlackBerry-Gerätebenutzer klickt, um die Geolocation des Geräts abzurufen. Rufen Sie Field.setChangeListener() auf, um Änderungen zur Schaltfläche abzufragen. Rufen Sie, wie unter Schritt 6 beschrieben, findGeolocation() auf, um die Geolocation abzurufen, wenn der Benutzer auf die Schaltfläche klickt. Rufen Sie add() auf, um die Schaltfläche zum Bildschirm hinzuzufügen. Erstellen Sie eine Instanz der LabelField-Klasse, um die resultierenden Koordinaten anzuzeigen, und rufen Sie add() auf, um das Feld zum Bildschirm hinzuzufügen.
    ButtonField geolocButton = new ButtonField("Get geolocation", 
            ButtonField.CONSUME_CLICK);
    geolocButton.setChangeListener(new FieldChangeListener()
        {
            public void fieldChanged(Field field, int context)
            {
                findGeolocation();
            }
        });
    add(geolocButton);
    this._coordLabel = new LabelField();
    add(this._coordLabel);
  6. Erstellen Sie das Framework für die findGeolocation-Methode. Rufen Sie setText() mit einem leeren String-Wert auf, um LabelField für die Koordinaten zu entfernen. Erstellen Sie eine Instanz der Thread-Klasse, die run() aufruft. Dieser Thread wird verwendet, um den Abruf der Geolocation-Informationen zu bearbeiten. Erstellen Sie in run() einen try/catch-Block, um den Geolocation-Modus festzulegen. Erstellen Sie durch Aufrufen von BlackBerryCriteria() eine Instanz der BlackBerryCriteria-Klasse, und übergeben Sie LocationInfo.GEOLOCATION_MODE als Modus für den Abruf von Geolocation-Informationen. Rufen Sie, wie unter Schritt 10 beschrieben, im catch-Block showException() auf, um die Fehlermeldung für eine UnsupportedOperationException anzuzeigen.
    private void findGeolocation()
    {
        this._coordLabel.setText("");
        Thread geolocThread = new Thread() 
        {
            public void run() 
            {
                try
                {
                    BlackBerryCriteria myCriteria = new BlackBerryCriteria(
                            LocationInfo.GEOLOCATION_MODE);
                } 
                catch (UnsupportedOperationException e) 
                {
                   showException(e);
                }
            }
        };
        geolocThread.start();
    }
  7. Erstellen Sie im ersten try-Block einen zweiten try/catch-Block, um einen Standortanbieter abzurufen. Rufen Sie LocationProvider.getInstance() mit dem BlackBerryCriteria-Objekt auf, um einen Standortanbieter abzurufen. Rufen Sie, wie unter Schritt 10 beschrieben, im catch-Block showException() auf, um die Fehlermeldung für eine LocationException anzuzeigen.
    try
    {
        BlackBerryLocationProvider myProvider = (BlackBerryLocationProvider)
                LocationProvider.getInstance(myCriteria);
    }
    catch (LocationException e)
    {
        showException(e);
    }
  8. Erstellen Sie im zweiten try-Block einen dritten try/catch-Block, um die Standortinformationen abzurufen. Rufen Sie BlackBerryLocationProvider.getLocation() mit einem Parameter vom Typ -1 auf, um einen Standortanbieter mithilfe des Standard-Timeout-Werts abzurufen. Rufen Sie getLongitude() und getLatitude() auf, um die Koordinaten der Längen- und Breitenwerte abzurufen. Erstellen Sie eine Instanz der StringBuffer-Klasse, und fügen Sie die resultierenden Koordinaten zum Puffer hinzu. Erstellen Sie eine String-Variable, und rufen Sie toString() mit dem StringBuffer-Objekt auf, um den String-Wert für die Koordinaten anzuzeigen. Rufen Sie showResults() auf, um die Ergebnisse, wie unter Schritt 9 beschrieben, auf dem Bildschirm anzuzeigen. Rufen Sie, wie unter Schritt 10 beschrieben, im ersten catch-Block showException() auf, um die Fehlermeldung für eine InterruptedException anzuzeigen. Rufen Sie, wie unter Schritt 10 beschrieben, im zweiten catch-Block showException() auf, um die Fehlermeldung für eine LocationException anzuzeigen.
    try
    {
        BlackBerryLocation myLocation =(BlackBerryLocation)myProvider
                .getLocation(-1);
        _longitude = myLocation.getQualifiedCoordinates().getLongitude();
        _latitude = myLocation.getQualifiedCoordinates().getLatitude();
        StringBuffer sb = new StringBuffer();
        sb.append("Longitude: ");
        sb.append(_longitude);
        sb.append("\n");
        sb.append("Latitude: ");
        sb.append(_latitude);
        String msg = sb.toString();
        showResults(msg);
    }
    catch (InterruptedException e)
    {
        showException(e);
    }
    catch (LocationException e)
    {
        showException(e);
    }
  9. 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 setText() mit der String-Variablen auf, um die resultierenden Koordinaten für LabelField festzulegen.
    private void showResults(final String msg)
    {
        Application.getApplication().invokeLater(new Runnable()
        {
            public void run()
            {
                GeolocationScreen.this._coordLabel.setText(msg);
            }
        });
    }
  10. Rufen Sie in der showException-Methode invokeLater() auf, um der Ereigniswarteschlange der Anwendung einen Codeabschnitt hinzuzufügen. Erstellen Sie eine Instanz von Runnable und übergeben Sie diese als Parameter an invokeLater(). Überschreiben Sie run() in der Definition von Runnable. Rufen Sie Dialog.alert() auf, um ein Alarmdialogfeld zu erstellen, und übergeben Sie die Fehlermeldung durch Aufrufen von getMessage().
    private void showException(final Exception e) 
    {
        Application.getApplication().invokeLater(new Runnable()
        {
            public void run()
            {
                Dialog.alert(e.getMessage());
            }
        });
    }

Waren diese Informationen hilfreich? Senden Sie uns Ihren Kommentar.