Guide de développement

Local Navigation

Récupérer plusieurs positions GPS optimales

Les étapes suivantes indiquent comment créer une application d'interface utilisateur assurant la mise à jour continue de l'emplacement géographique en récupérant les positions GPS dès qu'elles sont disponibles ou dans le délai imparti spécifié. Si l'obtention de la position GPS est indisponible, une position de géolocalisation est renvoyée à la place.

Avant de commencer : vérifiez que le terminal BlackBerry ou que BlackBerry Smartphone Simulator prend en charge le GPS.
  1. Importez les classes et les interfaces requises.
    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. Créez le cadre d'application en développant la classe UiApplication. Créez une variable de type nombre entier et attribuez-lui la valeur 1 qui spécifie l'intervalle de mise à jour des coordonnées de position. Créez une variable de type EditField pour stocker les mises à jour de position qui s'affichent à l'écran. Dans main(), créez une instance de la nouvelle classe et appelez enterEventDispatcher() pour activer l'application et recevoir des événements. Dans le constructeur d'applications, créez une instance de la classe MultipleFixScreen, comme décrit à l'étape 7. Appelez setTitle() pour indiquer le titre de l'écran. Créez une instance de la classe EditField et ajoutez le champ à l'écran. Appelez startLocationUpdate(), comme décrit à l'étape 4, pour démarrer la récupération des mises à jour de position. Appelez pushScreen() pour afficher l'écran personnalisé de l'application.
    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. Créez une méthode updateLocationScreen qui appelle invokeLater() pour ajouter cette section de code à la file d'attente des événements de l'application. Créez une instance de la classe Runnable et transmettez-la comme paramètre à invokeLater(). Remplacez run() dans la définition de Runnable. Appelez setText() pour afficher les résultats à l'écran.
    private void updateLocationScreen(final String msg)
    {
        invokeLater(new Runnable()
        {
            public void run()
            {
                _status.setText(msg);
            }
        });
    }
  4. Créez le cadre de la méthode startLocationUpdate. Créez un bloc try/catch pour indiquer les critères de récupération d'une position. Créez une instance de la classe BlackBerryCriteria en appelant BlackBerryCriteria(). Le mode d'emplacement par défaut est utilisé car aucun argument n'est transmis à BlackBerryCriteria(). Appelez enableGeolocationWithGPS() pour indiquer la récupération d'une position GPS si elle est disponible, ou la récupération d'une position de géolocalisation si l'obtention de la position GPS est indisponible. Dans le bloc catch, repérez une exception UnsupportedOperationException, qui indique que le mode de positionnement n'est pas pris en charge.
    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. Dans le premier bloc try, créez un second bloc try/catch pour obtenir un fournisseur de positionnement. Appelez LocationProvider.getInstance() avec l'objet BlackBerryCriteria pour obtenir un fournisseur de positionnement. Créez une instance de Runnable et transmettez-la comme paramètre à invokeLater(). Remplacez run() dans la définition de Runnable et affichez un message qui indique que le fournisseur de positionnement n'a pas pu être récupéré. Appelez setLocationListener() en transmettant la valeur d'intervalle, la valeur de délai et l'âge maximal comme paramètres pour l'enregistrement d'écouteur lorsqu'un fournisseur de positionnement est disponible. Dans le bloc catch, repérez une exception LocationException, qui indique que le fournisseur de positionnement n'est pas pris en charge.
    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. Créez une seconde classe déployant LocationListener. Déployez locationUpdated() pour fournir les mises à jour de position. Créez une instruction if pour vérifier la validité de la position. Si la position est valide, récupérez les coordonnées pour la longitude, la latitude et l'altitude en appelant getLongitude(), getLatitude() et getAltitude() respectivement. Créez une instance de la classe StringBuffer et ajoutez les coordonnées obtenues au tampon. Appelez updateLocationScreen() pour afficher les coordonnées obtenues à l'écran.
    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. Créez le cadre de l'écran personnalisé en développant la classe MainScreen. Dans le constructeur d'écran, appelez super() pour créer un menu par défaut. Créez une instance de RichTextField pour afficher un message d'instruction. Appelez add() pour ajouter RichTextField à l'écran.
    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);
        }
    } 

Ces informations vous ont-elles été utiles ? Envoyez-nous vos commentaires.