2013-05-11 143 views
28

乾杯,我想通過Android獲取當前的GPS位置。我也跟着this TutorialVogellas article。雖然它不起作用。使用LocationManager.NETWORK_PROVIDER時,無論我站在何處,我總是可以獲得51的經度和9的經度。當使用LocationManager.GPS_PROVIDER時,我一無所獲。如何獲得Android的GPS位置

儘管使用GMaps時一切正常:S不知道爲什麼。我怎樣才能獲得像GMaps一樣的當前GPS位置?

這裏是我的代碼:

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 2015-03-04 22:19:20

+0

檢查http:// stackoverflow。問題/ 1513485 /如何獲得當前的GPS位置編程在Android/38897436#38897436 – 2016-08-11 13:13:59

回答

25

這是你的問題:

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

緯度和經度double - 值,因爲它們代表了位置以度爲單位。

通過將它們投射到int,您將丟棄逗號後面的所有內容,這會產生很大的差異。見"Decimal Degrees - Wiki"

+1

已經認爲它是愚蠢的。你已經證明了它; P Ty – JustBasti 2013-05-11 15:09:16

+0

@JustBasti你應該將它標記爲答案。 – 2013-05-12 00:50:08

+0

你剛剛忘了:P thx – JustBasti 2013-05-12 15:37:56

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謝謝 – JustBasti 2013-05-11 15:09:00

12

這段代碼有一個問題:

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

您可以更改intdouble

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

最初的問題是通過改變latlon翻番解決。

我想添加評論到解決方案Location location = locationManager.getLastKnownLocation(bestProvider); 它的工作原理是找出最後一個已知的位置,當其他應用程序正在lisnerning。例如,如果自設備啓動後沒有應用程序執行此操作,代碼將返回零(我最近花了一些時間來弄清楚)。

而且,這是一個很好的做法,停止監聽時,有沒有必要通過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緯度,經度非常久遠的當前時間和隨機骰子擲。

如果你很好奇,然後只檢查全碼: GPS Location with a randomized dice throw & current time in separate thread