2014-05-18 2 views
0

현재 Google 서비스에서 제공하는 LocationClient를 사용하려고합니다. 내가 건물 옆에있을 때 나는 위치 업데이트를 자주 받는다. 그러나 도로의 중간에 덜 빈번하고 덜 정확하다. 국가 측면에서는 전혀 업데이트가 없습니다. Google 위치 서비스에서 GPS를 사용하는지 궁금해서 모든 위치 제공 업체를 사용 중지했지만 GPS를 휴대 전화 설정에서 사용 중지했는데 즉시 업데이트를받지 않았습니다. 분명히 내 LocationClient는 GPS 데이터를 사용하여 업데이트를 수신하지 않습니다.LocationClient Google에서 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

Google Play 서비스가 제공하는 LocationClient은, 융합 위치 제공자를 사용합니다. 즉, 휴대 전화의 센서와 함께 사용 가능한 최고의 제공 업체를 사용하여 가능한 가장 정확한 위치를 제공합니다.

위치 정확도가 30m 미만인 경우 업데이트를 무시하는 것으로 보이는 것 같습니다. GPS가 위치를 얻는 가장 정확한 방법 인 경우에도 위치가 얼마나 정확한지 제어 할 수는 없습니다.

또한 LocationRequest.create()을 호출하면 기본 매개 변수로 요청이 생성됩니다. 나는 당신이 create() 마지막으로 (setInterval() 후 등) 첫 번째 대신 전화를하고 싶다고 생각합니다.

+0

답을 알려 주셔서 감사합니다. 정확성 필터링 이전에 GPS를 사용하여 업데이트를 전혀받지 못하는 이유를 알 수는 있습니다. 지도는 업데이트를받습니다. – Showpath

+0

간격과 다른 매개 변수를 설정 한 후'create()'를 마지막으로 호출하고 지금은 정확성 검사를 제거하십시오. – Emmanuel

+0

실제로 더 좋아 보인다! 내일 더 많은 테스트를하고 문제가 해결되면 문제를 해결할 것입니다. 감사! – Showpath

관련 문제