Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 根据当前位置和某些位置之间的距离更改LocationRequest的间隔_Android_Gps_Location - Fatal编程技术网

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

Android 根据当前位置和某些位置之间的距离更改LocationRequest的间隔,android,gps,location,Android,Gps,Location,我想通过使用Fused Location API更改更新间隔来节省电池。距离某个位置越远,间隔越大 public class service extends Service implements GooglePlayServicesClient.ConnectionCallbacks,GooglePlayServicesClient.OnConnectionFailedListener,LocationListener { private LocationRequest 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将为我提供第一个时间间隔的更新。

问题很可能是您有另一个请求位置的进程,而您的应用程序只是在其中列出。setInterval只表示你的应用程序需要什么,而不是它得到什么。因此,如果另一个进程具有更快的时间间隔,您将获得更快的位置更新

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());


        }

    }
}
例如,检查是否有启用MyLocation层的Google地图。地图将请求其自己的位置


最后,LocationClient不推荐使用。检查文档以实施正确的当前做法。

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

mLocationRequest = LocationRequest.create()
                    .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
                    .setInterval(INTERVAL)        
                    .setFastestInterval(FASTEST_INTERVAL); 
然后,当在应用程序中触发事件并希望更改间隔时,您可以调用同一段代码,但只需更改
间隔
最快间隔
值。 更改后,请不要忘记更新位置更新,如下所示:

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

更改间隔之前,请使用RemovelocationUpdate 使用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);
                }
            });
LocationServices.FusedLocationApi.RemovelocationUpdate(mLocationCallback).addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
mlLocationRequest=新位置请求();
mLocationRequest.setInterval(5000);
LocationServices.FusedLocationApi.RequestLocationUpdate(mgoogleapClient、mlLocationRequest、this);
}
});

你应该解释你的代码是如何失败的:到底发生了什么,以及这与你的预期有什么不同。@WoodrowBarlow现在呢?感谢只有当INTERVAL和FASTEST_INTERVAL的初始值是应用程序使用的最高值时,这才对我有用。例如,如果它们都是0,我增加间隔,我看不出有什么区别。如果它们是60000,我会减少或增加到这个极限,我会看到不同。有人能解释一下吗?@keshav.bahadoor尝试
removeLocationUpdates
然后
requestLocationUpdates
。在我的情况下它是有效的。@MuhammadResnaRizkiPratama当我尝试
RemovelocationUpdate
时,我的google api客户端不知怎么断开了连接。我打电话是因为它已经连接并接收到解决我问题的位置。在终端中手动运行没有问题,但当由主管启动时,它就是不起作用。