花費很多很多的實驗小時後,並試圖調用和設置的多種組合後,我縮小到這一點:FusedLocationApi.requestLocationUpdates得到觸發調用onLocationChanged打開GPS只後
谷歌Play服務的位置當任何位置服務開啓時,API FusedLocationApi.requestLocationUpdates
理想情況下應該在指定的時間間隔內調用onLocationChanged
。然而,實際的行爲是weired是這樣的:
- 如果所有位置服務關閉它從來沒有要求
onLocationChanged
.......預期的行爲 - 如果只有WiFi /移動網絡位置服務它從來不打電話
onLocationChanged
.......意外的行爲 - 如果只有GPS定位服務打開,它永遠不會調用
onLocationChanged
(即使我們打開後,wifi位置服務).......意外的行爲 - 如果打開了GPS定位服務(打開第一個wifi /移動位置之後它會呼叫
onLocationChanged
(並且在我們關閉GPS後繼續撥打電話).......預期行爲 - 如果打開了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後。有任何線索嗎?我很困難。
你能描述你是如何做wifi /移動位置檢查(物理設備移動x米,模擬位置提供者)和使用的物理設備? –
使用的物理設備。但是,當我要求定期更新時,移動不是必需的。它每次持續調用回調'LOCATION_UPDATE_INTERVAL_IN_MILLISECONDS/1000'秒。 – Atul
您使用LOCATION_UPDATE_INTERVAL_IN_MILLISECONDS和FASTEST_LOCATION_UPDATE_INTERVAL_IN_MILLISECONDS –