Guia do desenvolvedor

Local Navigation

Recuperar múltiplos pontos otimizados

As seguintes etapas demonstram como criar um aplicativo de interface de usuário que fornece atualizações contínuas de localização recuperando pontos de GPS quando os pontos estão disponíveis ou dentro do período especificado de limite de tempo. Se o ponto de GPS estiver indisponível, um ponto de localização geográfica é retornado em seu lugar.

Antes de começar: Verifique se o aparelho BlackBerry ou o BlackBerry Smartphone Simulator tem o GPS habilitado.
  1. Importe as classes e interfaces necessárias.
    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. Crie a estrutura do aplicativo estendendo a classe UiApplication. Crie uma variável de número inteiro e atribua a ela o valor 1, que especifica o intervalo para atualizar as coordenadas de localização. Crie uma variável com o tipo EditField para armazenar as atualizações de localização exibidas na tela. Em main(), crie uma instância da nova classe e invoque enterEventDispatcher() para habilitar o aplicativo para receber eventos. No construtor de aplicativo, crie uma instância da classe MultipleFixScreen, que é descrita na etapa 7. Invoque setTitle() para especificar o título da tela. Crie uma instância da classe EditField e adicione o campo à tela. Invoque startLocationUpdate(), que é descrito na etapa 4, para começar a carregar as atualizações de localização. Invoque pushScreen() para exibir a tela personalizada do aplicativo.
    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. Crie um método updateLocationScreen que invoca invokeLater() para adicionar esta seção de código à fila de eventos do aplicativo. Crie uma instância da classe Runnable e defina-o como um parâmetro para invokeLater(). Substitua run() na definição de Runnable. Invoque setText() exibir os resultados na tela.
    private void updateLocationScreen(final String msg)
    {
        invokeLater(new Runnable()
        {
            public void run()
            {
                _status.setText(msg);
            }
        });
    }
  4. Crie a estrutura do método startLocationUpdate. Crie um bloco try/catch para especificar o critério carregar uma localização. Crie uma instância da classe BlackBerryCriteria chamando BlackBerryCriteria(). O modo padrão de localização é usado porque nenhum argumento é passado para BlackBerryCriteria(). Invoque enableGeolocationWithGPS() para especificar o carregamento de um ponto de GPS, se disponível, ou o carregamento de um ponto de localização geográfica, se o ponto de GPS estiver indisponível. No bloco catch, pegue um UnsupportedOperationException, que indica que o modo de localização não é suportado.
    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. No primeiro bloco try, crie um segundo bloco try/catch para carregar um provedor de localização. Invoque LocationProvider.getInstance() com o objeto BlackBerryCriteria para carregar um provedor de localização. Crie uma instância de Runnable e defina-o como um parâmetro para invokeLater(). Substitua run() na definição de Runnable e exiba uma mensagem que indica que o provedor de localização não pode ser carregado. Invoque setLocationListener() definindo o valor de intervalo, valor de limite de tempo e idade máxima como parâmetros para registrar um ouvinte, quando um provedor de localização estiver disponível. No bloco catch, pegue um LocationException, que indica que o provedor de localização não está disponível.
    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. Crie uma segunda classe que implemente LocationListener. Implemente locationUpdated() para fornecer atualizações de localização. Crie uma declaração if para verificar se a localização é válida. Se a localização for válida, carregue as coordenadas de longitude, latitude e altitude chamando getLongitude(), getLatitude() e getAltitude(), respectivamente. Crie uma instância da classe StringBuffer e anexe as coordenadas resultantes à memória intermediária. Invoque updateLocationScreen() para exibir as coordenadas resultantes na tela.
    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. Crie a estrutura da tela personalizada estendendo a classe MainScreen. No construtor de tela, chame super() para criar um menu padrão. Crie uma instância do RichTextField para exibir uma mensagem de instruções. Invoque add() para adicionar o RichTextField à tela.
    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);
        }
    } 

Estas informações foram úteis? Gostaríamos de receber seus comentários.