2011-09-16 51 views
0

我一直在爲gps功能亂搞幾個星期,現在我有一個問題。我的目標是按一下按鈕即可保存GPS位置,但我聽說GPS需要一段時間才能收聽衛星以獲取您的精確位置。我的程序記錄下它的位置不到一秒鐘,因此我相信它實際上並沒有花時間。它記錄的位置相當遙遠,有時它甚至不再聽新的位置,它只是告訴我,我在幾個小時前的地方。我應該怎麼做,現在我在點擊按鈕後立即調用requestLocationupdates(Location,0,0,loc_listener),我應該把它放在其他地方嗎?(例如我宣佈我的位置管理器之後?)android中的一般GPS問題

I非常感謝任何幫助。 感謝

這是我上創建方法

locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 

    location = locationManager 
      .getLastKnownLocation(LocationManager.GPS_PROVIDER); 
    loc_listener = new LocationListener() { 

     @Override 
     public void onStatusChanged(String provider, int status, 
       Bundle extras) { 
      // TODO Auto-generated method stub 
      float locationAccuracy = location.getAccuracy(); 
      if (locationAccuracy > 150) { 
       gpsStatus.setImageResource(gpsColor[0]); 
      } else if (locationAccuracy > 100) { 
       gpsStatus.setImageResource(gpsColor[1]); 
      } else { 
       gpsStatus.setImageResource(gpsColor[2]); 
      } 
     } 

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

     } 

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

     } 

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

     } 
    }; 

我把這個在我的onbuttonclick方法

 locationManager.requestLocationUpdates(
       LocationManager.GPS_PROVIDER, 30000, 0, 
       loc_listener); 

holder.put("lat", location.getLatitude()); 
holder.put("lon", location.getLongitude()); 

,我應該怎麼做呢?謝謝

回答

0

如果我是你,我會使用MyLocationOverlay,這是爲了獲取用戶的位置。

然後,您可以在獲取位置時使用getMyLocation()

0

你需要搜索,以獲得最佳的位置層。現在,您僅使用GPS提供商並利用網絡提供商嘗試查找您的位置。分層GPS位置在Obtaining User's Location「流量獲取用戶位置」中描述

現在關於你的問題,就按一下按鈕:

  • 您需要首先先檢查高速緩存,看看是否有緩存太舊以至於無法使用。使用你最好的提供者來做到這一點。下面是框架代碼與


LocationManager lm = (LocationManager)activity.getSystemService(Context.LOCATION_SERVICE); 
Criteria criteria = new Criteria(); 
criteria.setAccuracy(Criteria.ACCURACY_FINE); 
String bestProvider = lm.getBestProvider(criteria, true); 
Location locate = lm.getLastKnownLocation(bestProvider); 

if (locate != null) { 
    // if current location is already within time to expire apart, then get current location 
    // Check if we have cached location in the last 2 minutes, use that cached if we have one 
    if(System.currentTimeMillis() - locate.getTime() > TIME_TO_EXPIRE) { 
     // cache is too old and we assume the user has moved since then, initiate GPS location update 
    } else { 
     // cache is not too old, we could call the locationListener here itself 
     locationListener.onLocationChanged(locate); 
    } 
} else { 
    // Use GPS if no known cache is available. Wait for 7.5 secs for GPS lock 
} 
  • 如果我們沒有得到緩存,是不是太舊,我們需要開始監聽更新開始,讓我們開始與GPS

lm.requestLocationUpdates(
     LocationManager.GPS_PROVIDER, 
     MIN_TIME, 
     MIN_DISTANCE, 
     locationListener); 
  • 你需要時間GPS搜索,看看如果你真的鎖定和約束合理的時間內獲得位置更新。如果在某個時間限制內,您沒有獲得GPS鎖定和位置更新,則可以假定GPS無法獲取您的位置並使用網絡提供商繼續搜索您的位置。您可以使用Timer.schedule在進入下一層位置搜索之前安排超時。
    • 如果您獲得GPS鎖定並獲取位置更新,您首先需要比較該位置是否確實比您通過getLastKnownLocation獲得的位置更好。上面的Android開發者鏈接有一個關於如何確定「保持當前最佳估計值」的示例
    • 否則,如果經過了一段時間,您可能會決定基於NetworkProvider偵聽更新。如果這不適用於您的應用程序,則需要提醒用戶無法找到當前位置。
  • 如果你決定尋找基於NetworkProvider那麼你就放的下一行代碼

// remove the previous listeners based on GPS 
lm.removeUpdates(locationListener); 

// now request a new one based on the network 
lm.requestLocationUpdates(
     LocationManager.NETWORK_PROVIDER, 
     MIN_TIME, 
     MIN_DISTANCE, 
     locationListener); 
  • 你會再次啓動定時器您的位置。如果在計時器過後沒有獲得位置,則必須報告該位置無法獲取給用戶或使用舊的緩存位置(如果可用),因爲您已將所有選項用盡獲得定位