Guia do desenvolvedor

Local Navigation

Recuperar a localização de um aparelho usando serviços de localização geográfica

As seguintes etapas demonstram como criar um aplicativo de interface de usuário que forneça a localização do aparelho BlackBerry usando o serviço de localização geográfica.

Antes de começar: Verifique se o aparelho BlackBerry ou o BlackBerry Smartphone Simulator pode acessar o serviço de localização geográfica.
  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. Em main(), crie uma instância da nova classe e invoque enterEventDispatcher() para habilitar o aplicativo para receber eventos. No construtor de aplicativo, invoque pushScreen() para exibir a tela personalizada do aplicativo. A classe GeolocationScreen, que é descrita na etapa 3, representa a tela 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. Crie a estrutura da tela personalizada estendendo a classe MainScreen. Crie uma instância da classe LabelField para armazenar as coordenadas que aparecem na tela. Crie duas variáveis double para armazenar valores de latitude e longitude.
    class GeolocationScreen extends MainScreen
    {
        private LabelField _coordLabel;
        private double _latitude;
        private double _longitude;
    }
  4. No construtor de tela, chame super() para criar um menu padrão. Invoque setTitle() para especificar o título da tela.
    public GeolocationScreen() 
    {
        super(DEFAULT_CLOSE | DEFAULT_MENU);
        setTitle(new LabelField("Geolocation Demo", Field.USE_ALL_WIDTH | 
                DrawStyle.HCENTER));
    }
  5. No construtor de tela, crie uma instância da classe ButtonField para criar um botão no qual o usuário do aparelho BlackBerry clica para recuperar a localização geográfica do aparelho. Invoque Field.setChangeListener() para escutar as alterações no botão. Invoque findGeolocation(), que é descrito na etapa 6, para recuperar os dados de localização geográfica quando o usuário clicar no botão. Invoque add() para adicionar o botão à tela. Crie uma instância da classe LabelField para exibir as coordenadas resultantes e chame add() para adicionar o campo à tela.
    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. Crie a estrutura do método findGeolocation. Invoque setText() com um valor String vazio para limpar LabelField para as coordenadas. Crie uma instância da classe Thread que chama run(). Este thread é usado para processar a recuperação das informações de localização geográfica. Em run(), crie um bloco try/catch para especificar o modo de localização geográfica. Crie uma instância da classe BlackBerryCriteria chamando BlackBerryCriteria() e defina LocationInfo.GEOLOCATION_MODE como o modo para carregar informações de localização geográfica. No bloco catch, chame showException(), que é descrito na etapa 10, para exibir a mensagem de erro para um 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. 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. No bloco catch, chame showException(), que é descrito na etapa 10, para exibir a mensagem de erro para um LocationException.
    try
    {
        BlackBerryLocationProvider myProvider = (BlackBerryLocationProvider)
                LocationProvider.getInstance(myCriteria);
    }
    catch (LocationException e)
    {
        showException(e);
    }
  8. No segundo bloco try, crie um terceiro bloco try/catch para carregar as informações de localização. Invoque BlackBerryLocationProvider.getLocation() com um parâmetro de -1 para carregar um provedor de localização usando o valor padrão de limite de tempo. Invoque getLongitude() e getLatitude() para carregar as coordenadas de longitude e latitude, respectivamente. Crie uma instância da classe StringBuffer e anexe as coordenadas resultantes à memória intermediária. Crie uma variável String e chame toString() com o objeto StringBuffer para retornar o valor String para as coordenadas. Invoque showResults() para exibir os resultados na tela, o que é descrito na etapa 9. No primeiro bloco catch, chame showException(), que é descrito na etapa 10, para exibir a mensagem de erro para um InterruptedException. No segundo blococatch, chame showException(), que é descrito na etapa 10, para exibir a mensagem de erro para um 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. No métodoshowResults, chame 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() com a variável String para especificar as coordenadas resultantes do LabelField.
    private void showResults(final String msg)
    {
        Application.getApplication().invokeLater(new Runnable()
        {
            public void run()
            {
                GeolocationScreen.this._coordLabel.setText(msg);
            }
        });
    }
  10. No métodoshowException, chame invokeLater() para adicionar esta seção de código à fila de eventos do aplicativo. Crie uma instância de Runnable e defina-o como um parâmetro para invokeLater(). Substitua run() na definição de Runnable. Invoque Dialog.alert() para criar um caixa de diálogo de alerta e defina a mensagem de erro chamando getMessage().
    private void showException(final Exception e) 
    {
        Application.getApplication().invokeLater(new Runnable()
        {
            public void run()
            {
                Dialog.alert(e.getMessage());
            }
        });
    }

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