2014-10-08 107 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以實施正確的當前做法。

相關問題