2016-07-25 38 views
0

花費很多很多的實驗小時後,並試圖調用和設置的多種組合後,我縮小到這一點:FusedLocationApi.requestLocationUpdates得到觸發調用onLocationChanged打開GPS只後

谷歌Play服務的位置當任何位置服務開啓時,API FusedLocationApi.requestLocationUpdates理想情況下應該在指定的時間間隔內調用onLocationChanged。然而,實際的行爲是weired是這樣的:

  1. 如果所有位置服務關閉它從來沒有要求onLocationChanged .......預期的行爲
  2. 如果只有WiFi /移動網絡位置服務它從來不打電話onLocationChanged .......意外的行爲
  3. 如果只有GPS定位服務打開,它永遠不會調用onLocationChanged(即使我們打開後,wifi位置服務).......意外的行爲
  4. 如果打開了GPS定位服務(打開第一個wifi /移動位置之後它會呼叫onLocationChanged(並且在我們關閉GPS後繼續撥打電話).......預期行爲
  5. 如果打開了wifi位置服務(打開第一個GPS位置服務之後),它永遠不會撥打onLocationChanged .......意外的行爲

簡而言之:它只有先打開wifi然後再打開GPS,纔會呼叫onLocationChanged。 (然而,GPS不再需要事後爲它調用onLocationChanged

這裏是我的代碼:

void ConnectToLocationApi() 
{ 
    // Create an instance of GoogleAPIClient. 
    if(m_GoogleApiClient == null) 
    { 
     // Initialize Google Api client 
     m_GoogleApiClient = new GoogleApiClient.Builder(this) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 

     // Connect to Google play service location api 
     m_GoogleApiClient.connect(); 
    } 
} 


@Override 
public synchronized void onConnected(Bundle bundle) // Called when m_GoogleApiClient.connect() succeeds 
{ 
    Log.d(TAG, "GoogleApiClient connected"); 

    try 
    { 
     LocationRequest locationRequest; 

     // Initialize location request 
     locationRequest = new LocationRequest(); 
     locationRequest.setInterval(LOCATION_UPDATE_INTERVAL_IN_MILLISECONDS); 
     locationRequest.setFastestInterval(FASTEST_LOCATION_UPDATE_INTERVAL_IN_MILLISECONDS); 
     locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 

     // Start receiving location updates 
     LocationServices.FusedLocationApi.requestLocationUpdates(m_GoogleApiClient, locationRequest, this); 

     // Get location details of last available location (if any) 
     Location lastLocation = LocationServices.FusedLocationApi.getLastLocation(m_GoogleApiClient); 

     if (lastLocation != null) 
     { 
      ShowToast(this, "Last location received", Toast.LENGTH_SHORT); 
      Log.i(TAG, "In onConnected. Latitude:" + m_Location.getLatitude() + ", Longitude: " + m_Location.getLongitude()); 
     } 
     else 
     { 
      Log.e(TAG, "getLastLocation returned NULL value"); 
     } 
    } 
    catch (SecurityException e) 
    { 
     Log.e(TAG, "getLastLocation failed because of security exception (permission issue?)"); 
    } 
} 

@Override 
public void onConnectionFailed(ConnectionResult connectionResult) // Called when m_GoogleApiClient.connect fails 
{ 
    ShowToast(this, "GoogleApiClient connection failed", Toast.LENGTH_SHORT); 
    m_GoogleApiClient = null; 
    Log.e(TAG, "GoogleApiClient connection failed"); 
} 

@Override 
public void onConnectionSuspended(int i) // Called when m_GoogleApiClient.connect suspended 
{ 
    Log.e(TAG, "GoogleApiClient connection suspended"); 
} 

@Override 
public synchronized void onLocationChanged(Location location) 
{ 
    ShowToast(this, "Location update received", Toast.LENGTH_SHORT); 
    Log.i(TAG, "In location changed. Latitude:" + location.getLatitude() + ", Longitude: " + location.getLongitude()); 
} 

注:我更喜歡谷歌Play服務的位置API在Android框架位置API我讀this後。有任何線索嗎?我很困難。

+0

你能描述你是如何做wifi /移動位置檢查(物理設備移動x米,模擬位置提供者)和使用的物理設備? –

+0

使用的物理設備。但是,當我要求定期更新時,移動不是必需的。它每次持續調用回調'LOCATION_UPDATE_INTERVAL_IN_MILLISECONDS/1000'秒。 – Atul

+0

您使用LOCATION_UPDATE_INTERVAL_IN_MILLISECONDS和FASTEST_LOCATION_UPDATE_INTERVAL_IN_MILLISECONDS –

回答

0

在我的情況下,問題是在聆聽。 如果我在獲得位置和gps的權限之前開始使用GoogleApi服務,那麼OnLocationChanged永遠不會調用。所以 在OnPermissionGrantedResult和reciver for android.location.PROVIDERS_CHANGED我重新啓動GoogleApiServices並開始收回位置事件