Google Play服务位置API:onLocationChanged仅调用一次

时间:2014-06-24 17:04:21

标签: android geolocation google-play-services

我有一项使用Google Play服务API获取当前位置的服务。但onLocationChanged始终只在服务启动时调用一次,即使我使用Location Spoof欺骗新位置,也应该调用onLocationChanged。

我非常确定位置欺骗是否正常工作当我重新启动服务时它确实在启用了位置欺骗软件时给了我一个虚假的位置。我也为mLocationRequest设置了一个interval和fastInterval。我也在我的清单中添加了。

我尝试使用ACCESS_FINE_LOCATION和PRIORITY_HIGH_ACCURACY。如果我做了这个改变似乎是固定的,但我不应该使用GPS用于这个应用程序,因为该服务被设计为24/7全天候运行。

这是我的代码的一部分:

public MyService extends Service {
       //.....Other part...
       public void geolocationScanInit() {
              serviceEnableStatus = true
              mLocationRequest = LocationRequest.create();
              mLocationRequest.setInterval(LOCATION_UPDATE_INTERVAL);
              mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
              mLocationRequest.setFastestInterval(FAST_INTERVAL_CEILING);

              locationCallbacks = new LocationCallbacks(this, mLocationRequest);
   }
}

这是我设计的LocationCallbacks类

public class LocationCallbacks implements LocationListener, GooglePlayServicesClient.ConnectionCallbacks, GooglePlayServicesClient.OnConnectionFailedListener {

    private final String TAG = "LocationService";

    private LocationRequest mLocationRequest;
    private LocationClient mLocationClient;
    private MyService mService;

    public LocationCallbacks(MyService ms, 
        LocationRequest locReq) {
        mService = ms;
        mLocationRequest = locReq;
        mLocationClient = new LocationClient(mService, this, this);
        mLocationClient.connect();
    }

    public void startLocationUpdate() {
        mLocationClient.requestLocationUpdates(mLocationRequest, LocationCallbacks.this);
    }

    public void stopLocationUpdate() {
        if (mLocationClient != null && mLocationClient.isConnected()) {
            mLocationClient.removeLocationUpdates(this);
        }
    }

    @Override
    public void onConnected(Bundle arg0) {
        Log.w(TAG, "onConnected");
        startLocationUpdate();
    }

    @Override
    public void onLocationChanged(Location location) {
        mService.recievedLocationChanged(new GlobalLocation(location.getLatitude(), location.getLongitude()));
    }

}

我已经搜索了stackOverflow但是没有找到任何类似的问题。 虽然看起来Google Play服务的大多数应用程序都将Service和LocationCallbacks合并在一起,但这在我的应用程序中没有意义,因为获取当前位置只是我服务中的功能之一(实际上是最不重要的)。我怀疑这是否会成为一个问题。

谢谢!

=============================================== =========

更新

我想我可能对这个问题有所了解。

我发现了这个: onLocationChanged just called once using network provider 虽然它是不同的API但可能有连接。 如果这是真的那么似乎很难做到我想要的。

此外,通过我的测试,我发现该服务实际上正在调用onLocationChanged。它只是以非常低的频率更新它,它不遵循我设置的LOCATION_UPDATE_INTERVAL和FAST_INTERVAL_CEILING(我将它分别设置为8000ms和2000ms)。目前它在10多分钟内更新一次。

但我仍然不知道实现我想要的解决方案。有什么建议吗?

如果我使用定时器或类似的东西手动请求位置会不是一个好主意?

1 个答案:

答案 0 :(得分:4)

我也经历了同样的问题,幸运的是,下面对我有用。花了4个小时的试运行方法。

似乎locationClient.requestLocationUpdates(locationRequest, this);需要一个决定因素,就像何时获取位置更改的更新一样。

这些因素来自传递给LocationClient的LocationRequest对象。

尝试将您已指定的目标与setSmallestDisplacement(float meters)结合使用,该距离与您的上一个位置相距最小距离(以米为单位),以便触发onLocationChanged(Location loc)

您的LocationRequest现在看起来像这样,

mLocationRequest = LocationRequest.create();
mLocationRequest.setInterval(LOCATION_UPDATE_INTERVAL);
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
mLocationRequest.setFastestInterval(FAST_INTERVAL_CEILING);
mLocationRequest.setSmallestDisplacement(10); //10 meters

请知道这是否也适合您。 :)