2013-05-11 20 views
28

Pozdrawiam, próbuję uzyskać bieżącą lokalizację GPS przez Androida. Śledziłem także: this Tutorial i Vogellas article. Chociaż to nie działa. Podczas korzystania z LocationManager.NETWORK_PROVIDER zawsze otrzymuję szerokość geograficzną 51 i długość geograficzną 9 - bez względu na to, gdzie stoję. Podczas korzystania z LocationManager.GPS_PROVIDER nic nie dostaję.Jak uzyskać lokalizację GPS Android

Chociaż wszystko działa przy użyciu GMaps: S Nie mam pojęcia dlaczego. Jak mogę uzyskać aktualną Lokalizację GPS jak GMaps?

Oto mój kod:

package com.example.gpslocation; 

import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.app.Activity; 
import android.content.Context; 
import android.util.Log; 
import android.view.Menu; 

public class GPS_Location extends Activity implements LocationListener { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_gps__location); 

    LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.gps__location, menu); 
    return true; 
} 

@Override 
public void onLocationChanged(Location location) { 
    // TODO Auto-generated method stub 

    int latitude = (int) (location.getLatitude()); 
    int longitude = (int) (location.getLongitude()); 

    Log.i("Geo_Location", "Latitude: " + latitude + ", Longitude: " + longitude); 
} 

@Override 
public void onProviderDisabled(String provider) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onProviderEnabled(String provider) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onStatusChanged(String provider, int status, Bundle extras) { 
    // TODO Auto-generated method stub 

} 

} 
+2

Na wyższym poziomie i łatwiejszy sposób, aby uzyskać lokalizację GPS, można użyć tej biblioteki: https://github.com/delight-im/Android-SimpleLocation – caw

+0

sprawdź http: // stackoverflow.com/questions/1513485/how-do-i-get-the-current-gps-location-programowo-in-android/38897436 # 38897436 –

Odpowiedz

25

oto problem:

int latitude = (int) (location.getLatitude()); 
int longitude = (int) (location.getLongitude()); 

Szerokość i długość geograficzna są double -values, ponieważ stanowią one lokalizacja w stopniach.

Przesyłając je do int, odrzucasz wszystko za przecinkiem, co ma duże znaczenie. Zobacz "Decimal Degrees - Wiki"

+1

Już myślałem, że to coś głupiego. Udowodniłeś to: P Ty – JustBasti

+0

@JustBasti powinieneś oznaczyć to jako odpowiedź. –

+0

yeh właśnie zapomniałem: P thx – JustBasti

20

Spróbować:

public LatLng getLocation() 
    { 
    // Get the location manager 
    LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 
    Criteria criteria = new Criteria(); 
    String bestProvider = locationManager.getBestProvider(criteria, false); 
    Location location = locationManager.getLastKnownLocation(bestProvider); 
    Double lat,lon; 
    try { 
     lat = location.getLatitude(); 
     lon = location.getLongitude(); 
     return new LatLng(lat, lon); 
    } 
    catch (NullPointerException e){ 
     e.printStackTrace(); 
     return null; 
    } 
    } 
+4

Dziękuję za odpowiedź, chociaż już wypróbowałem twój kod powyżej i właśnie skróciłem własny kod do najprostszego rozwiązania, aby pokazać ci problem; P Dzięki i tak – JustBasti

12

Kod ten ma jeden problem:

int latitude = (int) (location.getLatitude()); 
int longitude = (int) (location.getLongitude()); 

Można zmienić int do double

double latitude = location.getLatitude(); 
double longitude = location.getLongitude(); 
6

Początkowy problem został rozwiązany przez zmianę lat i lon podwoić.

Chcę dodać komentarz do rozwiązania za pomocą Location location = locationManager.getLastKnownLocation(bestProvider); To działa, aby dowiedzieć się ostatniej znanej lokalizacji, gdy inna aplikacja została lisnerning do tego. Jeśli, na przykład, żadna aplikacja nie zrobiła tego od czasu uruchomienia urządzenia, kod zwróci zera (poświęciłem trochę czasu sobie ostatnio, aby to zrozumieć).

Ponadto, jest to dobra praktyka, aby przestać słuchać, gdy nie ma takiej potrzeby przez locationManager.removeUpdates(this);

Ponadto, nawet z uprawnieniami w manifest, kod działa, gdy usługa lokalizacji jest włączona w Android ustawień na urządzeniu.

0

Fragment: -

try 
     { 
      cnt++;scnt++;now=System.currentTimeMillis();r=rand.nextInt(6);r++; 
      loc=lm.getLastKnownLocation(best); 
      if(loc!=null){lat=loc.getLatitude();lng=loc.getLongitude();} 

      Thread.sleep(100); 
      handler.sendMessage(handler.obtainMessage()); 
     } 
     catch (InterruptedException e) 
     { 
      Toast.makeText(this, "Error="+e.toString(), Toast.LENGTH_LONG).show(); 
     } 

Jak widać powyżej, gwint pracuje obok głównego wątku aktywności interfejsu użytkownika, który ciągle wyświetla Lat GPS, długi i wynajęliśmy aktualny czas i losowym rzucie kośćmi.

Jeśli jesteś ciekaw, a potem po prostu sprawdzić cały kod: GPS Location with a randomized dice throw & current time in separate thread

Powiązane problemy