Guia do desenvolvedor

Local Navigation

Recuperar o ponto único otimizado

As seguintes etapas demonstram como criar um aplicativo de interface de usuário que fornece o ponto de localização mais rápido disponível, que pode vir de uma localização geográfica ou de uma fonte de localização de GPS. As coordenadas de localização e o modo que o aplicativo usa para recuperar a localização são exibidos na tela.

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 SingleFixScreen, que é descrita na etapa 3, representa a tela 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. Crie a estrutura da tela personalizada estendendo a classe MainScreen. Crie uma instância da classe LabelField para armazenar as coordenadas que você deseja exibição na tela. Crie duas variáveis double para armazenar os valores para latitude e longitude. Crie uma variável integer e uma variável String para armazenar o modo de localização.
    class SingleFixScreen extends MainScreen 
    {
        private LabelField _coordLabel;
        private double _latitude;
        private double _longitude;
        private int _modeUsed;
        private String _mode;
    }
  4. No construtor de tela, chame super() para criar um menu padrão. Invoque setTitle() para especificar o título da tela.
    public SingleFixScreen() 
    {
        super(DEFAULT_CLOSE | DEFAULT_MENU);
        setTitle(new LabelField("Single Fix 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 do aparelho. Invoque Field.setChangeListener() para escutar as alterações no botão. Invoque findLocation(), 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 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. Crie a estrutura do método findLocation. 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. Em run(), crie um bloco try/catch para especificar os critérios para carregar uma localização. Crie uma instância da classe BlackBerryCriteria chamando BlackBerryCriteria(). Nenhum argumento está definido como BlackBerryCriteria(), então é usado o modo padrão de localização. Invoque enableGeolocationWithGPS(BlackBerryCriteria.FASTEST_FIX_PREFERRED) para carregar o primeiro reparo disponível de localização. No bloco catch, chame showException(), que é descrito na etapa 10, para exibir a mensagem de erro para um 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. 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. Invoque getGPSMode() para carregar o modo que é usado para carregar a localização. Crie um bloco switch para identificar se o modo usado é GPS ou localização geográfica. Crie uma instância da classe StringBuffer e anexe as coordenadas resultantes e modo ao buffer. 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();
        _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. 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()
            {
                SingleFixScreen.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.