2013-10-16 112 views
3

我有一個簡單的類GPSListener其獲取GPS座標:的Android位置服務不更新requestLocationUpdates

public class GPSListener implements LocationListener { 

public static double latitude; 
public static double longitude; 

@Override 
public void onLocationChanged(Location loc) 
{ 
    loc.getLatitude(); 
    loc.getLongitude(); 
    latitude = loc.getLatitude(); 
    longitude = loc.getLongitude(); 
    Log.d("GPSLISTENER ", "lat: "+latitude+" long:"+longitude); 
} ... 

然後試圖利用這個類在我的活動,我簡單地調用這個類在我onCreate()功能我的活動:

LocationManager mlocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
    LocationListener mlocListener = new GPSListener(); 

    Criteria criteria = new Criteria(); 
    String bestProvider = mlocManager.getBestProvider(criteria, false); 
    mlocManager.requestLocationUpdates(bestProvider, 0, 0, mlocListener); 

    mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener); 

    if (mlocManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
      lat = GPSListener.latitude; 
      lon = GPSListener.longitude; 
      Log.d("GPS", "lat: "+lat+" long:"+lon); 
    } else { 
      // TODO: GPS not enabled 
      Log.d("GPSERROR", "GPS not enabled"); 
    } 

但每當我運行應用程序,在我的活動latlon始終爲零。我不太清楚如何解決這個問題。

當日志:

Log.d("GPSLISTENER ", "lat: "+latitude+" long:"+longitude); 

它返回正確的緯度和經度,它只是需要一兩秒鐘的活動開始後。

Log.d("GPSSUCCESS", "lat: "+lat+" long:"+lon); 

僅返回0.0。在if語句執行之前,我的印象是.requestLocationUpdates會將值傳遞給latlon。我怎樣才能做到這一點?

+0

你添加的權限(android.permission.ACCESS_FINE_LOCATION)在清單文件中的位置? – prijupaul

+0

@prijupaul是的。 –

+0

如果您正在仿真器上進行測試,您需要將座標傳遞給它,或者如果您在設備上,請重新啓動設備並檢查。 – Shrikant

回答

2

您正在使用公共靜態字段的緯度,經度。

請其即時改變對象非靜態和使用二傳手,吸氣:

lat = mlocListener.getLatitude(); 
lon = mlocListener.getLongitude(); 
+0

沒有運氣。仍是同樣的問題。 –

+0

您可以替換: mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,mlocListener);通過: 位置loc = mlocManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); –

+0

也許我有點困惑。你介意在代碼中再詳細一點嗎? –

0

的LocationManager從緩存使用最後一個已知位置。加載谷歌地圖時,緩存會更新。試試看,在外面打開並檢查你的位置。移動到大約200米的不同位置,然後再次檢查您的位置。它會和舊的一樣。現在,加載谷歌地圖,你會發現你的應用程序神奇地現在有了新的位置。

您需要以編程方式將該緩存踢到最新位置。要做到這一點的唯一方法是

YOUR_APPLICATION_CONTEXT.getLocationManager().requestLocationUpdates(
LocationManager.NETWORK_PROVIDER, 0, 0, new LocationListener() { 
    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
    } 
    @Override 
    public void onProviderEnabled(String provider) { 
    } 
    @Override 
    public void onProviderDisabled(String provider) { 
    } 
    @Override 
    public void onLocationChanged(final Location location) { 
    } 
}); 
1

谷歌更新了其位置的處理邏輯。使用融合位置提供程序監聽位置更新現在更容易。你可以在5分鐘內實現你的位置監聽器。看一看。 Methods for getting the most accurate location

您正在監聽僅gps提供程序,它尚未準備好(在等待位置狀態),然後它不返回任何位置。只要看看融合的位置提供商,然後再寫下你的位置監聽器。

1

試試這個...

mGoogleMap.setOnMyLocationButtonClickListener(new OnMyLocationButtonClickListener() { 

      @Override 
      public boolean onMyLocationButtonClick() 
       { 
        try 
         { 
          Location myLocation = mGoogleMap.getMyLocation(); 
          onLocationChanged(myLocation); 

         } 
        catch (Exception e) 
         { 
          Log.getStackTraceString(e); 
         } 

        return false; 
       } 
     }); 

用戶這個處理程序來獲取位置

private Handler customHandler = new Handler(); 


    private Runnable updateTimerThread = new Runnable() { 

    @Override 
    public void run() 
     { 
      try 
       { 

        Location myLocation = mGoogleMap.getMyLocation(); 
        secndLocationListener.onLocationChanged(myLocation); 
       } 
      catch (Exception e) 
       { 
        Log.getStackTraceString(e); 
       } 

     } 
}; 

運行此

customHandler.postDelayed(updateTimerThread , 1000);