2013-03-26 137 views
6

獲得準確的當前位置我用下面的代碼在我的應用程序在網絡提供商處獲取當前位置:從網絡提供商

LocationManager mgr = (LocationManager) getSystemService(LOCATION_SERVICE); 
boolean network_enabled = mgr.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 
if(network_enabled){ 
Location location = mgr.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 

但是它給出了一個地點,距離我的實際位置大約300-700米。

這是從網絡提供商預計的。但問題是:

只有啓用此網絡服務提供者,也沒有GPS,我openned四方 應用程序,其中就說明我目前的位置究竟我在哪裏。現在我回到我的申請 ,它顯示了準確的當前 位置或說Foursquare顯示相同的位置。

同樣的事情發生與谷歌應用程序,如導航,地圖等,

如何才能做到這一點?其他應用程序如何根據網絡提供商獲得確切位置?

完整代碼:

public class MyLocationActivity extends Activity implements LocationListener { 
    private LocationManager mgr; 
    private String best; 
    Location location; 
    public static double myLocationLatitude; 
    public static double myLocationLongitude; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     mgr = (LocationManager) getSystemService(LOCATION_SERVICE); 
     Criteria criteria = new Criteria(); 
     best = mgr.getBestProvider(criteria, true); 
     location = mgr.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
     dumpLocation(location); 
    } 

    public void onLocationChanged(Location location) { 

     dumpLocation(location); 
    } 

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

    } 

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

    } 

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

    } 

    @Override 
    protected void onPause() { 

     super.onPause(); 
     mgr.removeUpdates(this); 
    } 

    @Override 
    protected void onResume() { 

     super.onResume(); 
     mgr.requestLocationUpdates(best, 15000, 10, this); 
    } 

    private void dumpLocation(Location l) { 

     if (l != null){ 

      myLocationLatitude = l.getLatitude(); 
      myLocationLongitude = l.getLongitude(); 
     } 
    } 
} 

謝謝

+0

如果您使用的是Android 4.2與以前版本的Android相比,如果您的應用程序請求ACCESS_COARSE_LOCATION權限但未請求ACCESS_FINE_LOCATION權限,則用戶位置結果可能不太準確。 當您的應用請求粗略位置(而不是精細位置)的權限時,爲了滿足用戶對隱私的期望,系統將不會提供比城市街區更準確的用戶位置估計。 – 2013-03-26 10:17:30

+0

我在'4.1.2'上試過了。但無論如何,我要求'ACCESS_COARSE_LOCATION'和'ACCESS_FINE_LOCATION'權限。 – 2013-03-26 10:19:14

+0

你可以嘗試減少更新之間的時間嗎?後者的位置是否比第一個位置更精確? – 2013-03-26 10:42:45

回答

3

你得到只是最後已知的位置。您應該從LocationManager請求位置更新。使用LocationManager.getLocationUpdates

在您LocationListeneronLocationChanged(Location location)方法,您可以檢查Location對象上,該位置如何準確的,就像這樣:

float accuracy=location.getAccuracy(); 

那麼,如果這Location是你不夠準確,你可以停止使用removeUpdates()LocationManager接收位置更新,並使用收到的Location。如果Location不夠準確,則可以等待更精確的Location,並在後面停止更新。

+0

對不起,這只是有問題的代碼的一部分。其實我有一個'LocationListener',**請求更新**並實現'onLocationChanged'。哪個是'mgr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,15000,10這個);' – 2013-03-26 10:22:53

+0

爲什麼不提供完整的代碼...? – 2013-03-26 10:27:22

+0

完成。我已經添加了完整的代碼 – 2013-03-26 10:35:35

相關問題