Pegar latitude e longitude no android

Esse tutorial é bem simples. Se você quer saber sua latitude e longitude no Android e usar na sua aplicação, leia abaixo.

Essa é uma simples classe Activity chamada GpsDisplay. Nel, eu pego alguns TextViews e exibo as informações que eu quero, vindas do GPS.

O GPS pode fornecer essas informações para você.


final TextView acc = (TextView)findViewById(R.id.txtAccuracy);
final TextView alt = (TextView)findViewById(R.id.txtAltitude);
final TextView lat = (TextView)findViewById(R.id.txtLatitude);
final TextView longi = (TextView)findViewById(R.id.txtLongitude);
final TextView pro = (TextView)findViewById(R.id.txtProvider);
final TextView spd = (TextView)findViewById(R.id.txtSpeed);
final TextView proList = (TextView)findViewById(R.id.txtProvList);

  • Precisão = Accuracy
  • Altitude
  • Latitude
  • Longitude
  • Provider = Que é de onde ele está tirando a informação. Pode ser o gps ou network(internet).
  • Speed – Velocidade a qual vocÊ está se movimentando.
  • E por ultimo, uma lista de providers.

Nessa View, eu criei vários TextView´s para exibir as informações e um botão, que ao ser clicado, ele irá criar objetos da classe LocationManager e Location e mais uma String que armazenará os providers.


Button retrieve = (Button)findViewById(R.id.btnRetrieve);
retrieve.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
LocationManager LM = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
String bestProvider = LM.getBestProvider(new Criteria(),true);
//System.out.println("*************"+LM.getBestProvider(new Criteria(),true));
Location l = LM.getLastKnownLocation(bestProvider);
if(l!=null){
acc.setText(String.valueOf(l.getAccuracy()));
alt.setText(String.valueOf(l.getAltitude()));
lat.setText(String.valueOf(l.getLatitude()));
longi.setText(String.valueOf(l.getLongitude()));
pro.setText(String.valueOf(l.getProvider()));
spd.setText(String.valueOf(l.getSpeed()));
proList.setText(String.valueOf(LM.getAllProviders()));
}else{
acc.setText(R.string.noInfo);
alt.setText(R.string.noInfo);
lat.setText(R.string.noInfo);
longi.setText(R.string.noInfo);
pro.setText(R.string.noInfo);
spd.setText(R.string.noInfo);
proList.setText(R.string.noInfo);
}
}
});

LocationManager pega o serviço que está disponível, no caso, o serviço de localização, que é o que o GPS usa.
A String bestProvider armazena o melhor provider(o provedor de localização) que estiver disponível.
Ao criar um objeto Location ele pega a ultima localização(que seria a atual), e atribui ao objeto location.
Se o objeto não estiver nulo,
Através dele, conseguimos pegar os items citados no começo do post.
Senão,
os textViews são settados para “No Information”. Isso pode ocorrer no caso do GPS estiver desligado, ou no caso do emulador.

Maaasss. Pra isso tudo funcionar certinho, voce tem que editar o AndroidManifest.xml
E nele, voce adiciona uma uses-permission como aqui:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"> </uses-permission>

Abaixo segue o AndroidManifest.xml a classe que pega o gps e o main.xml.
Até mais.

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="lab.blog.ps"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".GpsDisplay"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

</application>
<uses-sdk android:minSdkVersion="8" />

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION">

</uses-permission>
</manifest>

main.xml

<?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"

>
<TableLayout android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
>
<TableRow android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
>
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btnRetrieve"
android:text = "Retrieve Data"
android:layout_gravity="center"
/>

</TableRow>
<TableRow android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Accuracy"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/noInfo"
android:id="@+id/txtAccuracy"
/>
</TableRow>
<TableRow android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Altitude"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/noInfo"
android:id="@+id/txtAltitude"
/>
</TableRow>
<TableRow android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Latitude"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/noInfo"
android:id="@+id/txtLatitude"
/>
</TableRow>
<TableRow android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Longitude"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/noInfo"
android:id="@+id/txtLongitude"
/>
</TableRow>
<TableRow android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Provider"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/noInfo"
android:id="@+id/txtProvider"
/>
</TableRow>
<TableRow android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Speed"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/noInfo"
android:id="@+id/txtSpeed"
/>
</TableRow>
</TableLayout>

<TextView
android:layout_marginTop="10px"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Providers currently available"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="------------------------------"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:id="@+id/txtProvList"
/>
</LinearLayout>

GpsDisplay.java


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

public class GpsDisplay extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

final TextView acc = (TextView)findViewById(R.id.txtAccuracy);
final TextView alt = (TextView)findViewById(R.id.txtAltitude);
final TextView lat = (TextView)findViewById(R.id.txtLatitude);
final TextView longi = (TextView)findViewById(R.id.txtLongitude);
final TextView pro = (TextView)findViewById(R.id.txtProvider);
final TextView spd = (TextView)findViewById(R.id.txtSpeed);
final TextView proList = (TextView)findViewById(R.id.txtProvList);

Button retrieve = (Button)findViewById(R.id.btnRetrieve);
retrieve.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
LocationManager LM = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
String bestProvider = LM.getBestProvider(new Criteria(),true);
//System.out.println("*************"+LM.getBestProvider(new Criteria(),true));
Location l = LM.getLastKnownLocation(bestProvider);
if(l!=null){
acc.setText(String.valueOf(l.getAccuracy()));
alt.setText(String.valueOf(l.getAltitude()));
lat.setText(String.valueOf(l.getLatitude()));
longi.setText(String.valueOf(l.getLongitude()));
pro.setText(String.valueOf(l.getProvider()));
spd.setText(String.valueOf(l.getSpeed()));
proList.setText(String.valueOf(LM.getAllProviders()));
}else{
acc.setText(R.string.noInfo);
alt.setText(R.string.noInfo);
lat.setText(R.string.noInfo);
longi.setText(R.string.noInfo);
pro.setText(R.string.noInfo);
spd.setText(R.string.noInfo);
proList.setText(R.string.noInfo);
}
}
});
}
}

REsultado:

Anúncios

33 comentários em “Pegar latitude e longitude no android

  1. tche como testo isso dai num emulador?? pegando as lat longs de um emulador tem como???
    TEm como eu simular isso dai num emulador pegando as lat longs nele????

  2. Muito obrigada por essa informação, eu tentei usar com o emulador, mas o resultado é mesmo No Information, já mudei as coordenadas no Emulador Control mas parece que nem assim o emulador vai buscá-las. Entretanto hei-de de tentar num dispositivo móvel para testar.
    Obrigada

  3. Muito bom tutorial, parabéns.

    Você teria algum exemplo ou tutorial de como pegar os dados do gps através de um serviço que executa em background.

    Estou tendo problemas com isso, meu serviço esta rodando perfeitamentamente ele executa tudo, mas nara hora de pegar latitude e longitude ele retorna erro.

    Quando eu chamo a função do objeto .getLatitude(), ele cai no catch com o erro.
    08-27 00:19:26.308: W/System.err(420): java.lang.NullPointerException
    08-27 00:19:26.308: W/System.err(420): at br.com.exemplo.GPSTracker.getLocation(GPSTracker.java:78)
    08-27 00:19:26.308: W/System.err(420): at br.com.exemplo.GPSTracker$1.run(GPSTracker.java:45)
    08-27 00:19:26.308: W/System.err(420): at java.util.Timer$TimerImpl.run(Timer.java:289)

    1. Muito obrigado.

      Eu tenho um código sim que força o gps ficar trabalhando em background até ele pegar a lat e long usando um listener. LocationListener
      Eu não tenho ele aqui na minha máquina, mas vou ver se a noite eu posto aqui.
      abs

  4. Baixei os 2 aplicativos no 4shared e no meu celular com android 2.2 nao instala de jeito nenhum. retorna com a mensagem: o aplicativo nao esta instalado.

  5. No Emulador não funciona a seguinte linha:

    LocationManager LM = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    String bestProvider = LM.getBestProvider(new Criteria(),true);

    Location l = LM.getLastKnownLocation(bestProvider);

    Sempre dará nullPointer, só funciona no celular.

    1. Você setou a latitude a longitude do emulador?
      Window->Show View->Other…
      Android-> Emulator Control.
      Dentro do Emulator Control você poderá ver um menu chamado Location Controls
      Aonde você seta a Latitude e Longitude to Emulador, com isso seu Location Manager será capaz de se instanciar e pegar um objeto location.

      Tenta isso que vai dar certo.
      abs

  6. Renato, bom dia…
    Sou novo com aplicações android e estou estudando a api maps v2, ainda não achei um tutorial explicando como posso pegar a latlng do ponto clicado (por exemplo, dou zoom até uma certa rua e clico em determinado ponto…) gostaria de saber como pegar o latlng dele para poder upar isto num servidor…
    Será que poderias me ajudar?
    Desde já agradeço e parabenizo pelo site, uma vez que ajuda muito a entender como tudo funciona.
    Abraço.

    1. Cara, eu nunca fiz isso.
      Mas eu imagino que seja no metodo quando o usuario clica, voce pega o ponto em que ele clicou, x e y, e pede pro seu mapa retorna a lat e long de x e y onde o usuario clicou.

  7. Muito bom o post, parabéns.
    Estou tendo um problema, quando não tenho uma posição válida atual (desativo 3g e GPS), ele me retorna a última posição. Sabe como tratar isso para não retornar nada?

    1. cara, voce pode tentar setar o provider para pegar a melhor e ultima posicao do GPS.
      E tambem voce pode guardar a ultima voce que recebeu um location e comprar o location velho com o novo.
      E mandar ele atualizar ate eles serem diferentes.

  8. Muito bom o post!
    Mas estou com uma dúvida, quando eu chamo o método pra baixar a latitude e longitude, ele baixa muito rápido, e por isso, quando estou conectado a internet da vivo, os dados não é exatamente do local aonde eu estou. E quando vou no mapa do celular, coloco pra aparecer meu local e demora um pouco até ele localizar corretamente.
    Então, teria como nesse programa que baixa a latitude e longitude, ele buscar por alguns segundos as coordenadas, um tempo que fosse possível baixar as coordenadas mais corretamente?
    Porque quando estou conectado ao Wi-fi vem certinho, mas estou desenvolvendo um projeto que precisaria saber o local correto onde a pessoa está, e possivelmente o celular estaria conectado a uma rede da operadora do celular.
    Se souber de algo sobre isso, me ajudaria muito! Obrigado.

    1. Cara, passei pelo mesmo problema.
      AS vezes as antenas das operadoras nao conseguem fornecer sua posicao exata. Usando o GPS e wi-fi funciona bem.
      E as vezes essa posicao que aparece no seu mapa eh de uma antena de operadora.
      Saca como eh triangulacao de posicao por antenas ?
      Tenta melhorar o accuracy do provider.

  9. blz cara.. aqui no meu caso ele não pegou a posição correta, como faço pra ele pegar exatamente a posição pelo gps, acho que lee pegou pelo wifi saca?

    1. Voce pode forcar o provider pegar a latitude somente do gps.
      ao inves de escolher o melhor provider, soh usar a String de LocationManager.GPS_PROVIDER e assim voce forca ele pegar as coordenadas do gps

  10. cara, to tentando usar, mas ele não consegue pegar a informação não, o GPS está ligado, mas não tenho conexão com a internet… é preciso ter conexão ou apenas com o GPS é possível pegar as informações?

  11. Eu coloquei um background maneiro, e uso o metodo Toast para mostrar os dados atualizados.

    A vantagem se eu to num mapa ele mostra dentro do mapa os valores.Mas o seu programa ficou bem estruturado.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s