Guía de desarrollo

Local Navigation

Recuperar la posición óptima

Los siguientes pasos muestran cómo crear una aplicación de interfaz de usuario que ofrezca la posición de ubicación disponible más rápida, ésta podría provenir de una geoubicación o de una fuente de ubicación GPS. Las coordenadas de ubicación y el modo que utiliza la aplicación para recuperar la ubicación se muestran en la pantalla.

Antes de comenzar: Compruebe que el dispositivo BlackBerry o que BlackBerry Smartphone Simulator pueden acceder al servicio de geoubicación.
  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. 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, invoque pushScreen() para mostrar la pantalla personalizada para la aplicación. La clase SingleFixScreen que se describe en el paso 3, representa la pantalla personalizada.
    public final class SingleFixDemo extends UiApplication
    {
        public static void main(String[] args)
        {
            SingleFixDemo theApp = new SingleFixDemo();
            theApp.enterEventDispatcher();
        }
        public SingleFixDemo() 
        {
            pushScreen(new SingleFixScreen());
        }
    }
  3. Cree el marco de la pantalla personalizada ampliando la clase MainScreen. Cree una instancia de la clase LabelField para almacenar las coordenadas que desea mostrar en la pantalla. Cree dos variables double para almacenar los valores de latitud y longitud. Cree una variable integer y una variable String para almacenar el modo de ubicación.
    class SingleFixScreen extends MainScreen 
    {
        private LabelField _coordLabel;
        private double _latitude;
        private double _longitude;
        private int _modeUsed;
        private String _mode;
    }
  4. En el constructor de pantalla, invoque super() para crear un menú predeterminado. Invoque setTitle() para especificar el título de la pantalla.
    public SingleFixScreen() 
    {
        super(DEFAULT_CLOSE | DEFAULT_MENU);
        setTitle(new LabelField("Single Fix Demo", Field.USE_ALL_WIDTH | 
                DrawStyle.HCENTER));
    }
  5. En el constructor de pantalla, cree una instancia de la clase ButtonField para crear un botón en el cual el usuario del dispositivo BlackBerry hará clic para recuperar la ubicación del dispositivo. Invoque Field.setChangeListener() para escuchar los cambios en el botón. Invoque findLocation(), que se describe en el paso 6, para recuperar la geoubicación cuando el usuario haga clic en el botón. Invoque add() para agregar el botón a la pantalla. Cree una instancia de la clase LabelField para mostrar las coordenadas resultantes e invoque add() para agregar el campo a la pantalla.
    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. Cree el marco para el método findLocation. Invoque setText() con un valor String vacío para borrar LabelField para las coordenadas. Cree una instancia de la clase Thread que invoque run(). Este subproceso se utiliza para procesar la recuperación de la información de ubicación. En run(), cree un bloque try/catch para especificar los criterios para recuperar una ubicación. Cree una instancia de la clase BlackBerryCriteria invocando BlackBerryCriteria(). No se pasarán argumentos a BlackBerryCriteria(), por lo que se utilizará el modo de ubicación predeterminado. Invoque enableGeolocationWithGPS(BlackBerryCriteria.FASTEST_FIX_PREFERRED) para recuperar el primer punto de ubicación disponible. En el bloque catch, invoque showException(), que se describe en el paso 10, para mostrar el mensaje de error para una UnsupportedOperationException.
    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. 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. En el bloque catch, invoque showException(), que se describe en el paso 10, para mostrar el mensaje de error para una LocationException.
    try
    {
        BlackBerryLocationProvider myProvider = (BlackBerryLocationProvider)
                LocationProvider.getInstance(myCriteria);
    }
    catch (LocationException e)
    {
        showException(e);
    }
  8. En el segundo bloque try, cree un tercer bloque try/catch para recuperar la información de ubicación. Invoque BlackBerryLocationProvider.getLocation() con un parámetro de -1 para recuperar un proveedor de ubicación mediante el valor predeterminado de tiempo de espera. Invoque getLongitude() y getLatitude() para recuperar las coordenadas de longitud y latitud respectivamente. Invoque getGPSMode() para recuperar el modo que se utiliza para recuperar la ubicación. Cree un bloque switch para identificar si el modo utilizado es GPS o geoubicación. Cree una instancia de la clase StringBuffer y anexe las coordenadas y el modo resultantes al búfer. Cree una variable String e invoque toString() con el objeto StringBuffer para devolver el valor String para las coordenadas. Invoque showResults() para mostrar los resultados en la pantalla, esto se describe en el paso 9. En el primer bloque catch, invoque showException(), que se describe en el paso 10, para mostrar el mensaje de error para una InterruptedException. En el segundo bloque catch, invoque showException(), que se describe en el paso 10, para mostrar el mensaje de error para una LocationException.
    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. En el método showResults, invoque invokeLater() para agregar esta sección de 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() con la variable String para especificar las coordenadas resultantes para LabelField.
    private void showResults(final String msg)
    {
        Application.getApplication().invokeLater(new Runnable()
        {
            public void run()
            {
                SingleFixScreen.this._coordLabel.setText(msg);
            }
        });
    }
  10. En el método showException, invoque invokeLater() para agregar esta sección de código a la cola de eventos de la aplicación. Cree una instancia de Runnable y pásela como parámetro a invokeLater(). Omita run() en la definición de Runnable. Invoque Dialog.alert() para crear un cuadro de diálogo de alerta y pasar el mensaje de error invocando getMessage().
    private void showException(final Exception e) 
    {
        Application.getApplication().invokeLater(new Runnable()
        {
            public void run()
            {
                Dialog.alert(e.getMessage());
            }
        });
    }

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