我想通过使用融合位置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将为我提供第一个时间间隔的更新。
使用融合位置API,您可以执行以下操作:
mLocationRequest = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setInterval(INTERVAL)
.setFastestInterval(FASTEST_INTERVAL);
然后,当您的应用中触发事件并且您想要更改时间间隔时,您将调用同一段代码,但只需更改INTERVAL
和FASTEST_INTERVAL
值。更改它们后,不要忘记像这样更新位置更新:
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
使用addOnCompleteListener以确保您取消注册先前的请求:
LocationServices.FusedLocationApi.removeLocationUpdates(mLocationCallback).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
}
});
问题很可能是您有另一个请求位置的过程,而您的应用只是在监听。 setInterval仅意味着您的应用程序需要什么,而不意味着它得到什么。因此,如果另一个进程的间隔时间更快,您将获得更快的位置更新。
例如,检查您是否启用了MyLocation图层的GoogleMap。地图将请求其自己的位置。
最后,不推荐使用LocationClient。查看FusedLocationApi的文档以实施正确的当前做法。