Entwicklungshandbuch

Local Navigation

Abrufen von mehreren optimalen Positionsdaten

Die folgenden Schritte demonstrieren, wie eine Benutzeroberflächen-Anwendung erstellt wird, die kontinuierliche Positionsaktualisierungen durch Abrufen von GPS-Positionsdaten bereitstellt, wenn die Positionsdaten verfügbar sind oder innerhalb des festgelegten Zeitlimits liegen. Wenn die GPS-Positionsdaten nicht verfügbar sind, werden stattdessen Geolocation-Positionsdaten zurückgegeben.

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.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 eine Ganzzahlvariable, und weisen Sie ihr einen Wert von 1 zu, der das Intervall für die Aktualisierung der Standortkoordinaten festlegt. Erstellen Sie eine Variable vom Typ EditField, um die Standort-Aktualisierung am Bildschirm anzuzeigen. Erstellen Sie in main() eine Instanz der neuen Klasse, und rufen Sie enterEventDispatcher() auf, um der Anwendung das Empfangen von Ereignissen zu ermöglichen. Erstellen Sie im Anwendungs-Konstruktor, wie unter Schritt 7 beschrieben, eine Instanz der MultipleFixScreen-Klasse. Rufen Sie setTitle() auf, um den Titel für den Bildschirm anzugeben. Erstellen Sie eine Instanz der EditField-Klasse, und fügen Sie das Feld zum Bildschirm hinzu. Rufen Sie, wie unter Schritt 4 beschrieben, startLocationUpdate() auf, um Standort-Aktualisierungen abzurufen. Rufen Sie pushScreen() auf, um den benutzerdefinierten Bildschirm für die Anwendung anzuzeigen.
    public class MultipleFixDemo extends UiApplication 
    {    
        private static int _interval = 1;
        private EditField _status;    
        public static void main(String[] args)
        {
            new MultipleFixDemo().enterEventDispatcher();
        }
        public MultipleFixDemo()
        {
            MultipleFixScreen screen = new MultipleFixScreen();
            screen.setTitle("Multiple Fix Demo");
            _status = new EditField(Field.NON_FOCUSABLE);
            screen.add(_status);
            startLocationUpdate();
            pushScreen(screen);
        }
    }
  3. Erstellen Sie eine updateLocationScreen-Methode, die invokeLater() aufruft, 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() auf, um die Ergebnisse am Bildschirm anzuzeigen.
    private void updateLocationScreen(final String msg)
    {
        invokeLater(new Runnable()
        {
            public void run()
            {
                _status.setText(msg);
            }
        });
    }
  4. Erstellen Sie das Framework für die startLocationUpdate-Methode. Erstellen Sie einen try/catch-Block, um für das Abrufen eines Standortes Kriterien festzulegen. Erstellen Sie durch Aufrufen von BlackBerryCriteria()eine Instanz der BlackBerryCriteria-Klasse. Der Standard-Standortmodus wird verwendet, weil keine Argumente an BlackBerryCriteria() übergeben werden. Rufen Sie enableGeolocationWithGPS() auf, um das Abrufen einer möglicherweise vorhandenen GPS-Problembehebung oder einer Geolocation-Problembehebung, wenn die GPS-Problembehebung nicht verfügbar ist, festzulegen. Legen Sie im catch-Block eine UnsupportedOperationException fest, die anzeigt, dass der Standortmodus nicht unterstützt wird.
    private void startLocationUpdate()
    {
        try
        {
            BlackBerryCriteria myCriteria = new BlackBerryCriteria();
            myCriteria.enableGeolocationWithGPS();
        catch (UnsupportedOperationException ue)
        {
            System.err.println("Require mode is unavailable");
            System.err.println(ue); 
            System.exit(0);   
        }
        return;
    }
  5. 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. Erstellen Sie eine Instanz von Runnable und übergeben Sie diese als Parameter an invokeLater(). Heben Sie run() in der Definition von Runnable auf, und zeigen Sie eine Nachricht mit dem Hinweis an, dass der Standortanbieter nicht abgerufen werden konnte. Rufen Sie setLocationListener() durch Übergabe des Intervallwerts, des Timeout-Werts und des maximalen Alters als Parameter auf, um Listener zu registrieren, wenn ein Standortanbieter verfügbar ist. Legen Sie im catch-Block eine LocationException fest, die anzeigt, dass der Standortanbieter nicht verfügbar ist.
    try
    {
        BlackBerryLocationProvider myProvider = (BlackBerryLocationProvider)
                LocationProvider.getInstance(myCriteria);
        if ( myProvider == null )
        {
            Runnable showUnsupportedDialog = new Runnable() 
            {
                public void run() 
                {
                    Dialog.alert("Location service unsupported, exiting...");
                    System.exit( 1 );
                }
             };
             invokeLater( showUnsupportedDialog );  
         }
         else
         {
             myProvider.setLocationListener(new LocationListenerImpl(), 
                     _interval, 1, 1);
         }
    }
    catch (LocationException le)
    {
        System.err.println("Failed to retrieve a location provider");
        System.err.println(le); 
        System.exit(0);
    }
  6. Erstellen Sie eine zweite Klasse, die LocationListener implementiert. Implementieren Sie locationUpdated(), um Standortaktualisierungen bereitzustellen. Erstellen Sie eine if-Anweisung, um die Gültigkeit des Standortes zu prüfen. Rufen Sie bei Gültigkeit des Standortes die Koordinaten für Länge, Breite und Höhe durch Aufrufen von getLongitude(), getLatitude() und getAltitude() ab. Erstellen Sie eine Instanz der StringBuffer-Klasse, und fügen Sie die resultierenden Koordinaten zum Puffer hinzu. Rufen Sie updateLocationScreen() auf, um die resultierenden Koordinaten am Bildschirm anzuzeigen.
    private class LocationListenerImpl implements LocationListener
    {
        public void locationUpdated(LocationProvider provider, Location location)
        {
            if(location.isValid())
            {
                double longitude = location.getQualifiedCoordinates()
                        .getLongitude();
                double latitude = location.getQualifiedCoordinates()
                        .getLatitude();
                float altitude = location.getQualifiedCoordinates()
                        .getAltitude();
                StringBuffer sb = new StringBuffer();
                sb.append("Longitude: ");
                sb.append(longitude);
                sb.append("\n");
                sb.append("Latitude: ");
                sb.append(latitude);
                sb.append("\n");
                sb.append("Altitude: ");
                sb.append(altitude);
                sb.append(" m");
                MultipleFixDemo.this.updateLocationScreen(sb.toString());
            }
        }
        public void providerStateChanged(LocationProvider provider, int newState)
        {
            // Not implemented
        }        
    }
  7. Erstellen Sie das Framework für den benutzerdefinierten Bildschirm durch Erweitern der MainScreen-Klasse. Rufen Sie auf dem Bildschirmkonstruktor super() auf, um ein Standardmenü zu erstellen. Erstellen Sie eine Instanz von RichTextField, um eine Nachricht mit Anweisungen anzuzeigen. Rufen Sie add() auf, um RichTextField zum Bildschirm hinzuzufügen.
    private final static class MultipleFixScreen extends MainScreen
    {
        MultipleFixScreen()
        {
            super(DEFAULT_CLOSE | DEFAULT_MENU);
            RichTextField instructions = new RichTextField(
                    "Waiting for location update...",Field.NON_FOCUSABLE);
            this.add(instructions);
        }
    } 

Waren diese Informationen hilfreich? Senden Sie uns Ihren Kommentar.