2014-05-18 60 views
0

我目前正在嘗試Google服務提供的LocationClient。當我在建築物旁邊時,我經常收到位置更新信息,但是在道路中間,他們不太常見,也不太準確。在鄉村方面,根本沒有更新。我想知道Google定位服務是否使用GPS,因此我禁用了所有位置提供商,但手機設置中的GPS已停用,並且我立即停止接收任何更新。很明顯,我的LocationClient沒有收到任何使用GPS數據的更新。谷歌服務的LocationClient不使用GPS數據

我錯過了什麼嗎?有什麼我必須爲LocationClient設置,還是必須使用標準的LocationManager.GPS_PROVIDER?

我想建立一個運行的應用程序,我需要準確的位置數據。任何意見,將不勝感激;-)

這裏是我使用的實現:

public class CustomLocationProvider implements ConnectionCallbacks, OnConnectionFailedListener, LocationListener, android.location.LocationListener { 

    private static final float DATA_UPDATE_DISTANCE = 100.0f; 
    private static final long ONE_MIN = 1000 * 60; 
    private static final long FIVE_MIN = ONE_MIN * 5; 
    private static final int UPDATE_TIME = 5000; 
    private static final int FASTEST_INTERVAL = 16; 
    private static final int ACCURACY_THRESHOLD = 30; 

    private Context mContext; 
    private LocationClient mLocationClient; 
    private Location mPreviousLocation; 
    private float mTotalDistance; 
    private float mDistanceSinceLastUpdate = 0.0f; 

    private WeakReference<Activity> mDelegate; 

    public interface LocationProviderDelegate { 
     void locationUpdated(Location location); 
    } 

    // These settings are the same as the settings for the map. They will in fact give you updates 
    // at the maximal rates currently possible. 
    private static final LocationRequest REQUEST = LocationRequest.create() 
      .setInterval(UPDATE_TIME)   // 5 seconds 
      .setFastestInterval(FASTEST_INTERVAL) // 16ms = 60fps 
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 

    public CustomLocationProvider (Context context, Activity delegate) { 
     if(context != null) { 
      mContext = context; 
      mDelegate = new WeakReference<Activity>(delegate); 
     } 
    } 

    public void enableTracking(boolean enable) { 
     if(enable) { 

      setUpLocationClientIfNeeded(); 
      mLocationClient.connect(); 
     } else { 
      if(mLocationClient != null) { 
       mLocationClient.disconnect(); 
      } 
     } 
    } 

    private void setUpLocationClientIfNeeded() { 
     if (mLocationClient == null) { 
      mLocationClient = new LocationClient(
        mContext, 
        this, // ConnectionCallbacks 
        this); // OnConnectionFailedListener 
     } 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     if(mPreviousLocation != null 
       && location.getTime() > mPreviousLocation.getTime() 
       && location.getAccuracy() < ACCURACY_THRESHOLD) 
     { 
      float distanceIncrement = mPreviousLocation.distanceTo(location); 
      mDistanceSinceLastUpdate += distanceIncrement; 
      mTotalDistance += distanceIncrement; 

      if(mDistanceSinceLastUpdate >= DATA_UPDATE_DISTANCE) 
      { 
       mDistanceSinceLastUpdate = 0.0f; 
       requestDataUpdate(location); 
      } 

      updateLocation(location); 
     } else if(mPreviousLocation == null){ 
      requestDataUpdate(location); 
      updateLocation(location); 
     } 
    } 

    private void updateLocation(Location location) { 
     try { 
      ((LocationProviderDelegate) mDelegate.get()).locationUpdated(location); 
     } catch (Exception e) { 
      Logger.logError("Cannot cast as a LocationProviderDelegate"); 
     } 
     mPreviousLocation = location; 
    } 

    /** 
    * Callback called when connected to GCore. Implementation of {@link ConnectionCallbacks}. 
    */ 
    @Override 
    public void onConnected(Bundle connectionHint) { 
     mLocationClient.requestLocationUpdates(
       REQUEST, 
       this); // LocationListener 
     Location location = mLocationClient.getLastLocation(); 
     if (location != null) { 
      if (age(location) < FIVE_MIN) { 
       mPreviousLocation = location; 
       requestDataUpdate(location); 
      } 
     } 
    } 

    /** 
    * Callback called when disconnected from GCore. Implementation of {@link ConnectionCallbacks}. 
    */ 
    @Override 
    public void onDisconnected() { 
     // Do nothing 
    } 

    /** 
    * Implementation of {@link OnConnectionFailedListener}. 
    */ 
    @Override 
    public void onConnectionFailed(ConnectionResult result) { 
     Logger.postMessageToTheUser("Connection failed", mDelegate.get()); 
    } 

    public void Reset(){ 
     mTotalDistance = 0; 
    } 

    public float TotalDistance() { 
     return mTotalDistance; 
    } 

    public void requestDataUpdate(Location location) 
    { 
     double latitude = location.getLatitude(); 
     double longitude = location.getLongitude(); 
     double offset = 0.002; 

     LatLngBounds bounds = LatLngBounds.builder() 
       .include(new LatLng(latitude - offset, longitude - offset)) 
       .include(new LatLng(latitude + offset, longitude + offset)) 
       .build(); 

     updateData(); 
    } 


    private long age(Location location) { 
     return System.currentTimeMillis() - location.getTime(); 
    } 

    @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) { 
     String newStatus = ""; 
     switch (status) { 
     case LocationProvider.OUT_OF_SERVICE: 
      newStatus = "OUT_OF_SERVICE"; 
      break; 
     case LocationProvider.TEMPORARILY_UNAVAILABLE: 
      newStatus = "TEMPORARILY_UNAVAILABLE"; 
      break; 
     case LocationProvider.AVAILABLE: 
      newStatus = "AVAILABLE"; 
      break; 
     } 
     String msg = provider + ": " + newStatus; 
     Logger.postMessageToTheUser(msg, mDelegate.get()); 
    } 
} 

回答

1

由谷歌提供播放服務LocationClient,採用了融合位置提供。這意味着它將使用可用的最佳提供商以及手機的傳感器爲您提供最準確的位置。

從代碼中可以看出,如果位置精度小於30米,則無視更新。請記住,即使GPS是獲取位置的最準確方法,您無法控制該位置的準確度。

此外,調用LocationRequest.create()將使用默認參數創建請求。我想你想最後撥打create()(在setInterval()之後),而不是第一個。

+0

感謝您的回答,它有助於理解它是如何工作的,但它並不告訴我爲什麼只有GPS啓用(甚至在精度過濾之前)我沒有收到任何更新。雖然地圖收到更新。 – Showpath

+0

在設置間隔和其他參數之後,嘗試調用'create()',並立即刪除精度檢查。 – Emmanuel

+0

現在看起來好多了!如果明天解決了我的問題,我會在明天進行更多測試,並將問題設置爲已解決。謝謝! – Showpath