根据当前和某个位置之间的距离更改LocationRequest的间隔

时间:2014-10-08 14:00:05

标签: android gps location

我想通过使用Fused Location API更改更新间隔来节省电量。远离某个位置,间隔应该更大。

public class service extends Service implements GooglePlayServicesClient.ConnectionCallbacks,GooglePlayServicesClient.OnConnectionFailedListener,LocationListener {
    private LocationRequest locationrequest;
    private LocationClient locationclient;



    @Override
    public void onCreate() {

        int resp = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
        if (resp == ConnectionResult.SUCCESS) {
            locationclient = new LocationClient(this, this, this);
            locationclient.connect();
        } else {
            Toast.makeText(this, "Google Play Service Error " + resp, Toast.LENGTH_LONG).show();

        }

    }



    @Override
    public void onDestroy() {
        super.onDestroy();
        if(locationclient!=null)
            locationclient.disconnect();
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onConnected(Bundle connectionHint) {
        Log.i(TAG, "onConnected");
        if (locationclient != null && locationclient.isConnected()) {
            locationrequest = LocationRequest.create();
            locationrequest.setInterval(5000);
            locationrequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
            locationclient.requestLocationUpdates(locationrequest, this);

        }
    }

    @Override
    public void onDisconnected() {
        Log.i(TAG, "onDisconnected");


    }

    @Override
    public void onConnectionFailed(ConnectionResult result) {
        Log.i(TAG, "onConnectionFailed");


    }

    @Override
    public void onLocationChanged(Location location) {
        if(location!=null){
            double Lat=-34.922611;
            double Lng = 138.596161;
            Location Loc = new Location("");
            Loc.setLatitude(Lat);
            Loc.setLongitude(Lng);
            Float dist=location.distanceTo(Loc);
            String distance = Float.toString(dist);
            if (dist>100){
                Log.i("distance",distance);
                locationclient.removeLocationUpdates(this);
                locationrequest.setInterval(30000);
                locationrequest.setPriority(LocationRequest.PRIORITY_LOW_POWER);
                locationclient.requestLocationUpdates(locationrequest, this);

            }

            Log.i(TAG, "Location Request :" + location.getLatitude() + "," + location.getLongitude());


        }

    }
}

不幸的是这不起作用..有人知道为什么吗?或者有更好的方法吗? 谢谢

编辑1: 我作为输出得到的是一个locationrequest,它在更改之前的行为方式相同。如果我调用locationrequest.getInterval,则会显示新的间隔,但locationrequest会在第一个间隔给我更新。

3 个答案:

答案 0 :(得分:2)

使用Fused Location API,您可以执行以下操作:

mLocationRequest = LocationRequest.create()
                    .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
                    .setInterval(INTERVAL)        
                    .setFastestInterval(FASTEST_INTERVAL); 

然后,当您的应用中触发某个事件并且您想要更改间隔时,您可以调用同一段代码但只需更改INTERVALFASTEST_INTERVAL值。 更改后,请不要忘记更新位置更新,如下所示:

LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);

答案 1 :(得分:0)

在更改间隔之前使用 removeLocationUpdates 使用 addOnCompleteListener 来确保取消注册先前的请求,然后重新初始化LocationRequest对象:

    LocationServices.FusedLocationApi.removeLocationUpdates(mLocationCallback).addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    mLocationRequest = new LocationRequest();
                    mLocationRequest.setInterval(5000);
    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
                }
            });

答案 2 :(得分:-1)

问题很可能是您有另一个请求位置的进程,并且您的应用只是在监听。 setInterval仅表示您的应用需要的内容,而不是它所获得的内容。因此,如果另一个进程的间隔更快,您将获得更快的位置更新。

检查您是否拥有启用了MyLocation图层的GoogleMap。地图将请求自己的位置。

最后,不推荐使用LocationClient。查看FusedLocationApi的文档以实施正确的当前实践。