39

Utilizando o recurso de GPS em uma app Android

by Luiz Jr 19. novembro 2011 15:03

Olá, este será mais um post sobre a melhor plataforma de desenvolvimento mobile da atualidade, o Android. Os números não me deixam mentir, com o SO do Google dominando mais de 50% do mercado de smartphones no mundo e com mais de 250 mil aplicativos disponíveis no Android Market (desses, cerca de 130 mil gratuitos). Neste post, iremos tratar do uso do hardware de GPS presente em alguns dispositivos com Android, como o Motorola Defy e o Motorola Milestone, só para citar alguns exemplos que pude utilizar (sem contar a infinidade de xing-lings que tem no mercado). A idéia é utilizar tal hardware para descobrir onde o usuário da app está e com essa informação em mãos, você fazer o que quiser, como plotar esta localização em um mapa do Google Maps, por exemplo.

Mas já não existe aplicações que fazem isso? Sim, e aos montes. Então por que diabos eu iria querer aprender a fazer isso? Simplesmente porque a idéia aqui é estudar o funcionamento de aplicações que consumam os dados do GPS nativo do aparelho, para então, desenvolver suas próprias aplicações que necessitem de tais dados. Como exemplo podemos citar aplicações como o Four Square, que coleta a informação de sua localização para garantir que você realmente está no local que diz estar ou o Google Latitude, que permite ver onde seus amigos estão neste exato momento, só para citar algumas. No meu caso o estudo é pertinente a um trabalho freelancer com a plataforma, que exigirá conhecimentos dessa API.

Usando a Android Location-Based API

O Android SDK contém uma API que foi criada especialmente para utilizar de forma abstrata sua Activity com qualquer hardware de GPS que possa existir em seu dispositivo. Uma vez que normalmente trabalhamos com um emulador baseado em software (O AVD - Android Virtual Device), e não com um dispositivo de verdade, a presença do hardware de GPS terá que ser simulada. Para que isto ocorra o emulador que você está utilizando deve prover simulação de hardware GPS, o que você pode aplicar indo no AVD Manager e criando (ou editando) um AVD, adicionando tal recurso, como mostra na tela abaixo:

Adicionando suporte ao GPS

Uma vez que seu AVD tenha suporte à GPS, você usará o console do ADB (Android Debugger Bridge) para enviar comandos de localização, simulando que o usuário do dispositivo se locomoveu. Também usaremos as ferramentas existentes no Motodev Studio 3 (e provavelmente devem existir no Eclipse tradicional também) para enviar as coordenadas ao emulador que você deseja testar. Estas ferramentas ficam disponíveis na aba Emulator Control, no rodapé da IDE, como mostra a figura abaixo. Com elas é possível simular que o celular encontra-se em uma região diferente da atual, para que você possa testar sua aplicação sob diferentes circunstâncias (as configurações de GPS estão na aba Emulator Control, porém devem rolar um pouco para baixo até encontrá-las).

Simulando coordenadas GPS

A outra forma, é usando o Console do ADB, que você habilita indo na aba Gerenciador de Dispositivos e clicando no ícone Console. Uma vez com o console aberto, você pode enviar comandos ao emulador que está rodando em seu MotoDev/Eclipse. O comando que você utiliza para enviar posições GPS é o geo. O geo na verdade é um grupo de comandos para manipulação de localização, e o que iremos usar é o geo fix. Digitando "geo fix help" no console você consegue dicas de como usar este comando. Resumindo, basta digitar "geo fix <longitude> <latitude>" visto que dificilmente você irá usar os demais parâmetros, como altitude, por exemplo. A figura abaixo mostra o funcionamento do console, inserindo as coordenadas de Porto Alegre-RS:

Comando geo fix

Lendo os dados de GPS com a Android Location-Based API

O restante deste post irá tratar exclusivamente do desenvolvimento de uma aplicação "OndEstou" que identifica a localização do usuário, sendo esta primeira parte bem simples, pois apenas exibirá a informação de latitude e longitude de onde o usuário se encontra, lhe dando uma base para prosseguir com o restante dos estudos da API. Os seguintes passos serão executados para que nossa demo tenha sucesso: devemos ajustar os níveis de permissão, criar o layout de nossa Activity, escrever o cpodigo da Activity e testá-la.

Ajustando o Nível de Permissão

O primeiro passo para trabalhar com a Android Location-Based API é ajustar o nível de permissão. Usar a API por si só não requer nenhuma permissão específica, mas usar a mesma para acessar informações de localização no GPS sim. A maneira mais fácil de setar permissões para um aplicativo é através da edição do manifesto do seu projeto, que foi descrito em meu último post. Este manifesto é facilmente editável pelo MotoDev Studio (de forma idêntica ao Eclipse tradicional).

Primeiramente, vamos criar um novo projeto no MotoDev/Eclipse com o nome de OndEstou, a versão do Android 2.2 (a mais comum no Brasil), com a Activity MainActivity.java. Em seguida, vamos abrir o arquivo AndroidManifest.xml e na aba Permissions do editor visual do manifesto, vamos adicionar a seguinte permissão (do tipo Uses Permission): ACCESS_FINE_LOCATION, como indicado na figura abaixo:

Acces Fine Location

Criando o layout de sua aplicação

Para iniciar o desenvolvimento do seu layout, abra o arquivo main.xml no MotoDev/Eclipse. Você terá de adicionar um Button e quatro TextView no seu layout, como a tela abaixo mostra:

Layout OndEstou

Este layout pode ser obtido com o código de exemplo abaixo, mas encorajo que você tente criar o seu sem utilizar este código (afinal, é um layout bem simples):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

    <Button
    android:id="@+id/btnGps"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Onde estou?"/>
   
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
   
    <TextView
    android:id="@+id/lblLatitude"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Latitude: "/>
   
    <TextView
    android:id="@+id/txtLatitude"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
    </LinearLayout>
   
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
   
    <TextView
    android:id="@+id/lblLongitude"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Longitude: "/>
   
    <TextView
    android:id="@+id/txtLongitude"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
    </LinearLayout>

</LinearLayout>

Escrevendo o código da sua Activity

Agora que você criou o layout, você pode começar a escrever o código que irá executar sua Activity. Seu Button precisa iniciar o serviço de monitoramento do GPS, para então enviar a latitude e longitude ao TextView correspondente. Primeiro você irá precisar adicionar nove diretivas import, que são os packages necessários para o funcionamento da Activity. Embora alguns programadores sintam-se tentados a adicionar imports mais genéricos como android.location.*, evitem isso para diminuir o tamanho de suas aplicações com código de biblioteca desnecessário:

 

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.content.Context;
import android.widget.Button;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;

 

A seguir, devemos criar o código para o evento OnCreate de sua Activity, que irá carregar os widgets de sua aplicação e definir o algoritmo para o evento Click do Button. O objetivo é que quando se clique no botão, seja registrado um Listener para o serviço de GPS que passará a enviar informações de localização à app. O código abaixo exemplifica o código necessário:

 

Button btnGps;
	TextView txtLatitude;
    TextView txtLongitude;
	
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        txtLatitude = (TextView) findViewById(R.id.txtLatitude);
        txtLongitude = (TextView) findViewById(R.id.txtLongitude);
        
        btnGps = (Button) findViewById(R.id.btnGps);
        btnGps.setOnClickListener(new Button.OnClickListener() {
	        public void onClick(View v){
	        	IniciarServico();
        }});
    }

Note que ainda não criamos o método IniciarServico, então é natural que sua IDE acuse um erro neste código. Além de carregarmos o botão, carregamos os TextViews que serão editados (txtLongitude e txtLatitude, neste exemplo). Os demais TextViews não serão instanciados pois eles são apenas rótulos de texto, e não serão editados posteriormente. Agora começamos a brincar com o serviço de GPS do Android, que é invocado através de um objeto Location Manager, que carrega o serviço de localização do dispositivo, como segue (agora criando nosso método IniciarServico):

 

public void IniciarServico()
    {
    	LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    	
    	LocationListener locationListener = new LocationListener() {
    	    public void onLocationChanged(Location location) {
    	      Atualizar(location);
    	    }

    	    public void onStatusChanged(String provider, int status, Bundle extras) {}

    	    public void onProviderEnabled(String provider) {}

    	    public void onProviderDisabled(String provider) {}
    	  };

    	  locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
    }

 

E por fim, devemos codificar o método Atualizar, que nada mais faz do que pegar o objeto Localization enviado pelo serviço de GPS e jogar suas informações nos TextViews correspondentes à latitude e longitude:

 

public void Atualizar(Location location)
    {
    	Double latPoint = location.getLatitude();
    	Double lngPoint = location.getLongitude();
        
        txtLatitude.setText(latPoint.toString());
        txtLongitude.setText(lngPoint.toString());
    }

App GPS funcionando

Para testar sua aplicação, basta rodá-la no MotoDev/Eclipse em um AVD configurado com o hardware de GPS, como citei no início do post e clicar no botão "Onde estou?" para ficar monitorando o serviço de GPS. Nada aconteceu? Não esqueça de enviar comandos de localização pelo console (usando geo fix) ou pelo editor gráfico na aba Emulator Control. O resultado esperado você vê na direita.

Abaixo você pode fazer download de todo o código fonte do projeto. Futuramente talvez eu continue este post ensinando como plotar esta informação em uma camada overlay na App do Google Maps, disponível em todos os aparelhos Android. Espero que tenham gostado do post e até a próxima.

OndEstou.zip (53,42 kb)

Tags: , , ,

Android | Mobile

Powered by BlogEngine.NET 1.6.1.0
Design por Laptop Geek, adaptado por onesoft e personalizado por mim.