2017-07-29 72 views
0

我使用的Mapbox SDK,我想移動和縮放地圖到當前位置。如果我啓用位置圖層,我會在正確的位置獲得點。但是我的位置引擎偵聽器沒有被調用,所以我不能移動攝像頭。Mabox Android的 - 沒有得到位置更新

onCreateView我開始與GoogleApiClient的連接。一旦這樣連接我用它來檢查的位置設置,看看他們是否開啓(許可檢查位置之後)。如果成功,我這樣做:

if (locationEngine == null) { 
    locationEngine = new LocationSource(getActivity()); 
    locationEngine.requestLocationUpdates(); 
} 
Location location = locationEngine.getLastLocation(); // This returns null 

onLocationChanged(location); // This moves the camera if a location is passed in 

locationEngine.addLocationEngineListener(locationEngineListener); 

// This works, the location layer functions properly  
getMap(new OnMapReadyCallback() { 
      @Override 
      public void onMapReady(MapboxMap mapboxMap) { 

       mapboxMap.setMyLocationEnabled(true); 
      } 
     }); 

這裏是locationEngineListener做:

private class Listener implements LocationEngineListener { 
     @Override 
     public void onConnected() { 
      // No action needed here. 
     } 

     @Override 
     public void onLocationChanged(Location location) { 

      CurrentLocationMap.this.onLocationChanged(location); 
     } 
    } 

問題是onLocationChanged永遠不會被調用。

回答

1

這是完全相同的工作方案,probaly輕微的不同情況。但我想添加一些小解釋步驟,以便任何人都能得到確切的概念。我沒有看到您在代碼中使用的LocationEngine。我在這裏使用LocationServices.FusedLocationApi作爲我LocationEngine。 。不IntentService),構建然後如下連接的GoogleApiClient:

的Android組件(例如,活動片段服務注1)的onCreate()。

buildGoogleApiClient(); 
mGoogleApiClient.connect(); 

其中,buildGoogleApiClient()實現,

protected synchronized void buildGoogleApiClient() { 
     Log.i(TAG, "Building GoogleApiClient"); 

     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .addApi(LocationServices.API) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .build(); 

    } 

上的onDestroy()之後,您可以斷開Goog​​leApiClient爲,

@Override 
    public void onDestroy() { 
     Log.i(TAG, "Service destroyed!"); 
     mGoogleApiClient.disconnect(); 
     super.onDestroy(); 
    } 

步驟1確保您構建和連接GoogleApiClient。

1)GoogleApiClient實例第一次通過onConnected()方法獲取連接。現在,你的下一步應該看onConnected()方法。

@Override 
    public void onConnected(@Nullable Bundle bundle) { 
     Log.i(TAG, "GoogleApiClient connected!"); 
     buildLocationSettingsRequest(); 
     createLocationRequest(); 
     location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
     Log.i(TAG, " Location: " + location); //may return **null** because, I can't guarantee location has been changed immmediately 
    } 

上面,你叫的方法createLocationRequest()創建位置請求。該方法createLocationRequest()看起來像的下方。

protected void createLocationRequest() { 
     //remove location updates so that it resets 
     LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); //Import should not be **android.Location.LocationListener** 
    //import should be **import com.google.android.gms.location.LocationListener**; 

     mLocationRequest = new LocationRequest(); 
     mLocationRequest.setInterval(10000); 
     mLocationRequest.setFastestInterval(5000); 
     mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
     //restart location updates with the new interval 
     LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 

    } 

3)現在,LocationListener的界面上onLocationChange()回調,你會得到新的位置。

@Override 
    public void onLocationChanged(Location location) { 
     Log.i(TAG, "Location Changed!"); 
     Log.i(TAG, " Location: " + location); //I guarantee,I get the changed location here 

    } 

你得到的結果像這樣的logcat: 03-22 18:34:17.336 817-817/com.LiveEarthquakesAlerts I/LocationTracker:位置:位置[融合37.421998,-122.084000 ACC = 20 et = + 15m35s840ms alt = 0.0]

爲了能夠完成這三個步驟,您應該已經配置了您的構建。gradle,如下所示:

compile 'com.google.android.gms:play-services-location:10.2.1' 
+0

謝謝,我會將其作爲回退位置,但Mapbox API(這是我使用的)似乎更簡單,所以如果我可以得到那個工作,我想。不過,這對於Google API來說是一個很好的答案。 – nasch

+0

我在這裏提供的代碼片段是我用於Google Play商店中的某個應用的確切代碼。這是100%的工作代碼。這個想法是一樣的。 https://play.google.com/store/apps/details?id=com.LiveEarthquakesAlerts –

+1

我沒有說它不起作用,它只是使用與我正在使用的API不同的API。 – nasch