Guía de desarrollo

Local Navigation

Recuperar la ubicación de un dispositivo mediante el servicio de geoubicación

Los siguientes pasos muestran cómo crear una aplicación de interfaz de usuario que proporcione la ubicación del dispositivo BlackBerry mediante el servicio de geoubicación.

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 GeolocationScreen que se describe en el paso 3, representa la pantalla personalizada.
    public final class GeolocationDemo extends UiApplication
    {
        public static void main(String[] args)
        {
            GeolocationDemo theApp = new GeolocationDemo();
            theApp.enterEventDispatcher();
        }
        public GeolocationDemo() 
        {
            pushScreen(new GeolocationScreen());
        }
    }
  3. Cree el marco de la pantalla personalizada ampliando la clase MainScreen. Cree una instancia de la clase LabelField para almacenar las coordenadas que se muestran en la pantalla. Cree dos variables double para almacenar los valores de latitud y longitud.
    class GeolocationScreen extends MainScreen
    {
        private LabelField _coordLabel;
        private double _latitude;
        private double _longitude;
    }
  4. En el constructor de pantalla, invoque super() para crear un menú predeterminado. Invoque setTitle() para especificar el título de la pantalla.
    public GeolocationScreen() 
    {
        super(DEFAULT_CLOSE | DEFAULT_MENU);
        setTitle(new LabelField("Geolocation 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 geoubicación del dispositivo. Invoque Field.setChangeListener() para escuchar los cambios en el botón. Invoque findGeolocation(), 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 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. Cree el marco para el método findGeolocation. 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 geoubicación. En run(), cree un bloque try/catch para especificar el modo de geoubicación. Cree una instancia de la clase BlackBerryCriteria invocando BlackBerryCriteria() y pasando LocationInfo.GEOLOCATION_MODE como el modo de recuperar la información de geoubicación. En el bloque catch, invoque showException(), que se describe en el paso 10, para mostrar el mensaje de error para una UnsupportedOperationException.
    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. 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. Cree una instancia de la clase StringBuffer y anexe las coordenadas 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();
        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. 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 el LabelField.
    private void showResults(final String msg)
    {
        Application.getApplication().invokeLater(new Runnable()
        {
            public void run()
            {
                GeolocationScreen.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.