Entwicklungshandbuch

Local Navigation

Abrufen der einzelnen optimalen Positionsbestimmung

Die folgenden Schritte demonstrieren, wie eine Benutzeroberflächen-Anwendung erstellt wird, die die schnellsten verfügbaren Positionsdaten bereitstellt, die von einer Geolocation- oder GPS-Positionsquelle abgerufen werden können. Die Standortkoordinaten und der Modus, die die Anwendung verwendet, um den Ort abzurufen, werden auf dem Bildschirm angezeigt.

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 SingleFixScreen-Klasse stellt den benutzerdefinierten Bildschirm dar.
    public final class SingleFixDemo extends UiApplication
    {
        public static void main(String[] args)
        {
            SingleFixDemo theApp = new SingleFixDemo();
            theApp.enterEventDispatcher();
        }
        public SingleFixDemo() 
        {
            pushScreen(new SingleFixScreen());
        }
    }
  3. Erstellen Sie das Framework für den benutzerdefinierten Bildschirm durch Erweitern der MainScreen-Klasse. Erstellen Sie eine Instanz der LabelField-Klasse, um die gewünschten, auf dem Bildschirm angezeigten, Koordinaten zu speichern. Erstellen Sie zwei double-Variablen, um die Breiten- und Längenwerte zu speichern. Erstellen Sie eine integer-Variable und eine String-Variable, um den Standortmodus zu speichern.
    class SingleFixScreen extends MainScreen 
    {
        private LabelField _coordLabel;
        private double _latitude;
        private double _longitude;
        private int _modeUsed;
        private String _mode;
    }
  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 SingleFixScreen() 
    {
        super(DEFAULT_CLOSE | DEFAULT_MENU);
        setTitle(new LabelField("Single Fix 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 den Standort des Geräts abzurufen. Rufen Sie Field.setChangeListener() auf, um Änderungen zur Schaltfläche abzufragen. Rufen Sie, wie unter Schritt 6 beschrieben, findLocation() 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 locButton = new ButtonField("Get location fix", 
            ButtonField.CONSUME_CLICK);
    locButton.setChangeListener(new FieldChangeListener()
    {
        public void fieldChanged(Field field, int context)
        {
            findLocation();
        }
    });
    add(locButton);
    this._coordLabel = new LabelField();
    add(this._coordLabel);
  6. Erstellen Sie das Framework für die findLocation-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 Standortinformationen zu bearbeiten. Erstellen Sie in run() einen try/catch-Block, um die Kriterien zum Abrufen eines Standorts festzulegen. Erstellen Sie durch Aufrufen von BlackBerryCriteria()eine Instanz der BlackBerryCriteria-Klasse. Es werden keine Argumente an BlackBerryCriteria() übergeben, sodass der Standard-Standortmodus verwendet wird. Rufen Sie enableGeolocationWithGPS(BlackBerryCriteria.FASTEST_FIX_PREFERRED) auf, um die ersten verfügbaren Positionsdaten abzurufen. Rufen Sie, wie unter Schritt 10 beschrieben, im catch-Block showException() auf, um die Fehlermeldung für eine UnsupportedOperationException anzuzeigen.
    private void findLocation()
    {
        this._coordLabel.setText("");
        Thread locThread = new Thread() 
        {
            public void run() 
            {
                try
                {
                    BlackBerryCriteria myCriteria = new BlackBerryCriteria();
                    myCriteria.enableGeolocationWithGPS(BlackBerryCriteria
                            .FASTEST_FIX_PREFERRED);
                } 
                catch (UnsupportedOperationException e) 
                {
                   showException(e);
                }
            }
        };
        locThread.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. Rufen Sie getGPSMode() auf, um den Modus abzurufen, der für das Abrufen des Standortes verwendet wird. Erstellen Sie einen switch-Block, um zu identifizieren, ob der verwendete Modus GPS oder Geolocation ist. Erstellen Sie eine Instanz der StringBuffer-Klasse, und fügen Sie die resultierenden Koordinaten und den resultierenden Modus 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();
        _modeUsed = myLocation.getGPSMode();
        switch (_modeUsed)
        {
            case LocationInfo.GEOLOCATION_MODE:
            case LocationInfo.GEOLOCATION_MODE_CELL:
            case LocationInfo.GEOLOCATION_MODE_WLAN:
                _mode = "Geolocation";
                break;
            default:
                _mode = "GPS";
        }    
        StringBuffer sb = new StringBuffer();
        sb.append("Longitude: ");
        sb.append(_longitude);
        sb.append("\n");
        sb.append("Latitude: ");
        sb.append(_latitude);
        sb.append("\n");
        sb.append("Mode: ");
        sb.append(_mode);
        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()
            {
                SingleFixScreen.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.