2013-05-11 4 views
28

Привет, я пытаюсь получить текущее местоположение GPS через Android. Я следил за this Tutorial и Vogellas article. Хотя он не работает. При использовании LocationManager.NETWORK_PROVIDER я всегда получаю широту 51 и долготу 9 - независимо от того, где я стою. При использовании LocationManager.GPS_PROVIDER я ничего не получаю.Как получить местоположение GPS на Android

Хотя все работает при использовании GMaps: S Не знаю, почему. Как я могу получить текущее местоположение GPS, например, GMaps?

Вот мой код:

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

Для более высокого уровня и более простой способ, чтобы получить местоположение GPS, вы можете использовать эту библиотеку: https://github.com/delight-im/Android-SimpleLocation – caw

+0

проверить http: // stackoverflow.com/questions/1513485/how-do-i-get-the-current-gps-location-programatically-in-android/38897436 # 38897436 –

ответ

25

Вот ваша проблема:

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

Широта и долгота являются double -значения, потому что они представляют местоположение в градусах.

Отбрасывая их на int, вы отбрасываете все, что находится за запятой, что имеет большое значение. См "Decimal Degrees - Wiki"

+1

Уже думал, что это будет что-то немым. Вы доказали это: P Ty – JustBasti

+0

@JustBasti вы должны пометить его как ответ. –

+0

yeh просто забыл: P thx – JustBasti

20

Дайте ему попробовать:

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

Спасибо за ответ, хотя я уже пробовал свой код и просто порезал свой собственный код к простейшему решению, чтобы показать вам проблему; P Спасибо anyways – JustBasti

12

Этот код есть одна проблема:

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

Вы можете изменить int к double

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

Исходная проблема решается путем изменения lat и lon в два раза.

Добавить комментарий к решению Location location = locationManager.getLastKnownLocation(bestProvider); Он работает, чтобы узнать последнее известное местоположение, когда для этого было занято другое приложение. Если, например, ни одно приложение не выполняло это с момента запуска устройства, код вернет нули (потратил некоторое время на себя, чтобы понять это).

Кроме того, это хорошая практика, чтобы перестать слушать, когда нет необходимости в том, что с помощью locationManager.removeUpdates(this);

Кроме того, даже с разрешениями в manifest, код работает, когда услуга определения местоположения включена в Android настройки на устройстве.

0

Выдержка: -

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(); 
     } 

Как вы можете видеть выше, поток работает вместе с основной нитью пользовательского интерфейса деятельности, которая постоянно отображает GPS Lat, долго Alongwith текущее время и случайной кость бросок.

Если вам интересно, то просто проверить полный код: GPS Location with a randomized dice throw & current time in separate thread

Смежные вопросы