2014-10-08 82 views
2

我想通过使用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会给我第一个间隔的更新。

+0

你应该解释你的代码是如何失败的:到底发生了什么,以及如何从您的期望有所不同。 – 2014-10-08 14:06:54

+0

@WoodrowBarlow现在怎么样?谢谢 – maligno 2014-10-09 13:05:54

回答

2

使用一体化位置API,你可以这样做:当触发在你的应用的事件,你想改变间隔

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

然后,您需要调用相同的代码,但只是改变INTERVALFASTEST_INTERVAL值。 后您更改它们也没有忘记更新位置更新,像这样:

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

只有当INTERVAL和FASTEST_INTERVAL的初始值是应用程序使用的最高值时,这才适用于我。例如,如果他们都是0,并且我增加间隔,我看不出有什么区别。如果他们的60000说,我减少并增加到这个限制,我看到了一个区别。任何人都可以解释吗? – 2016-06-06 14:54:44

+0

@ keshav.bahadoor尝试'removeLocationUpdates'然后'requestLocationUpdates'。它适用于我的情况。 – 2016-06-08 15:30:01

+0

@MuhammadResnaRizkiPratama不知何故,当我尝试'removeLocationUpdates'时,我的google api客户端断开连接。我打电话后,它已经连接并接收地点 – 2016-06-12 00:23:19

-1

问题很可能是您有另一个请求位置的进程,并且您的应用只是一直监听。 setInterval只意味着你的应用需要什么,而不是它得到什么。因此,如果另一个进程的间隔时间更快,您将获得更快的位置更新。

检查例如您是否有启用MyLocation图层的GoogleMap。地图将要求自己的位置。

最后,LocationClient已被弃用。检查文档FusedLocationApi以实施正确的当前做法。

相关问题