Guía de desarrollo

Local Navigation

Recuperar varias posiciones óptimas

Los siguientes pasos muestran cómo crear una aplicación de interfaz de usuario que proporcione actualizaciones de ubicación continuas mediante la recuperación de los puntos de posición GPS cuando las ubicaciones están disponibles o dentro del período de tiempo de espera especificado. Si el punto de posición GPS no está disponible, se devuelve en su lugar la posición de la geoubicación.

Antes de comenzar: Compruebe que el dispositivo BlackBerry o BlackBerry Smartphone Simulator tienen la tecnología GPS activada.
  1. Importe las clases y las interfaces necesarias.
    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. Cree el marco de la aplicación ampliando la clase UiApplication. Cree una variable de número entero y asígnele un valor de 1 que especifique el intervalo para actualizar las coordenadas de ubicación. Cree una variable con el tipo EditField para almacenar las actualizaciones de ubicación que se muestran en la pantalla. En main(), cree una instancia de la clase nueva e invoque enterEventDispatcher() para activar la aplicación para recibir eventos. En el constructor de la aplicación, cree una instancia de la clase MultipleFixScreen, que se describe en el paso 7. Invoque setTitle() para especificar el título de la pantalla. Cree una instancia de la clase EditField y agregue el campo a la pantalla. Invoque startLocationUpdate(), que se describe en el paso 4, para comenzar a recuperar actualizaciones de ubicación. Invoque pushScreen() para mostrar la pantalla personalizada de la aplicación.
    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. Cree un método updateLocationScreen que invoque invokeLater() para agregar esta sección del código a la cola de eventos de la aplicación. Cree una instancia de la clase Runnable y pásela como parámetro a invokeLater(). Omita run() en la definición de Runnable. Invoque setText() para mostrar los resultados en la pantalla.
    private void updateLocationScreen(final String msg)
    {
        invokeLater(new Runnable()
        {
            public void run()
            {
                _status.setText(msg);
            }
        });
    }
  4. Cree el marco para el método startLocationUpdate. Cree un bloque try/catch para especificar los criterios para recuperar una ubicación. Cree una instancia de la clase BlackBerryCriteria invocando BlackBerryCriteria(). El modo de ubicación predeterminado se utiliza porque no se pasan argumentos a BlackBerryCriteria(). Invoque enableGeolocationWithGPS() para especificar la necesidad de recuperar un punto de posición GPS si está disponible, o de recuperar una posición de geoubicación si el punto de posición GPS no está disponible. Si en el bloque catch observa una UnsupportedOperationException querrá decir que el modo de ubicación no es compatible.
    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. En el primer bloque try, cree un segundo bloque try/catch para recuperar un proveedor de ubicación. Invoque LocationProvider.getInstance() con el objeto BlackBerryCriteria para recuperar un proveedor de ubicación. Cree una instancia de Runnable y pásela como parámetro a invokeLater(). Omita run() en la definición de Runnable y muestre un mensaje que indique que no ha sido posible recuperar el proveedor de ubicación. Invoque setLocationListener() pasando el valor de intervalo, el valor de tiempo de espera y la antigüedad máxima como parámetros para registrar un servicio de escucha cuando esté disponible un proveedor de ubicación. Si en el bloque catch observa una LocationException querrá decir que el proveedor de ubicación no está disponible.
    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. Cree una segunda clase que implemente LocationListener. Implemente locationUpdated() para proporcionar actualizaciones de ubicación. Cree una instrucción if para comprobar que la ubicación es válida. Si la ubicación es válida, recupere las coordenadas de longitud, latitud y altitud invocando getLongitude(), getLatitude() y getAltitude() respectivamente. Cree una instancia de la clase StringBuffer y anexe las coordenadas resultantes al búfer. Invoque updateLocationScreen() para mostrar las coordenadas resultantes en la pantalla.
    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. Cree el marco de la pantalla personalizada ampliando la clase MainScreen. En el constructor de pantalla, invoque super() para crear un menú predeterminado. Cree una instancia de RichTextField para mostrar un mensaje de instrucciones. Invoque add() para agregar RichTextField a la pantalla.
    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);
        }
    } 

¿Le ha resultado útil esta información? Envíenos sus comentarios.