2016-04-16 11 views
7

Próbuję wyświetlić bieżącą lokalizację użytkownika na mapie google w mojej aplikacji, ale nie chcę aktualizować lokalizacji, gdy użytkownik się porusza. Jego początkowa lokalizacja powinna zostać zapisana i pokazana, dopóki nie zamknie aplikacji. Napisałem następujący kod na to:Uzyskaj bieżącą lokalizację w onMapReady w Androidzie za pomocą Google Maps API

private GoogleMap mMap; 
protected GoogleApiClient mGoogleApiClient; 
Location mLastLocation; 
double lat =0, lng=0; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_map); 
    buildGoogleApiClient(); 

    // Obtain the SupportMapFragment and get notified when the map is ready to be used. 
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
      .findFragmentById(R.id.map); 
    mapFragment.getMapAsync(this); 


} 

private void buildGoogleApiClient() { 
    mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API) 
      .build(); 
} 


/** 
* Manipulates the map once available. 
* This callback is triggered when the map is ready to be used. 
* This is where we can add markers or lines, add listeners or move the camera. In this case, 
* we just add a marker near Sydney, Australia. 
* If Google Play services is not installed on the device, the user will be prompted to install 
* it inside the SupportMapFragment. This method will only be triggered once the user has 
* installed Google Play services and returned to the app. 
*/ 
@Override 
public void onMapReady(GoogleMap googleMap) { 
    mMap = googleMap; 

    // Add a marker in Sydney and move the camera 
    mMap.setMyLocationEnabled(true); 

    LatLng loc = new LatLng(lat, lng); 
    mMap.addMarker(new MarkerOptions().position(loc).title("New Marker")); 
    mMap.moveCamera(CameraUpdateFactory.newLatLng(loc)); 
} 

@Override 
public void onConnected(Bundle bundle) { 
    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
      mGoogleApiClient); 
    if (mLastLocation != null) { 
     lat = mLastLocation.getLatitude(); 
     lng = mLastLocation.getLongitude(); 
    } 
} 

@Override 
protected void onStart() { 
    super.onStart(); 

    mGoogleApiClient.connect(); 
} 

Problem z tym kodem jest, że otrzymuję lat, lng po funkcja onMapReady już zakończeniu wykonywania. Pomyślałem, że jednym ze sposobów na poprawienie tego byłoby stworzenie AsyncTask, aby upewnić się, że dane lokalizacji są pobierane przed mapą. Jednak próbuję wdrożyć to w sposób, który nie będzie używać AsyncTask.

Odpowiedz

6

Wystarczy przenieść kod, który tworzy znaczniki z onMapReady() do onConnected() i przenieść rozmowę buildGoogleApiClient() połączenia z onCreate() do onMapReady():

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_map); 
    //buildGoogleApiClient(); 

    // Obtain the SupportMapFragment and get notified when the map is ready to be used. 
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
      .findFragmentById(R.id.map); 
    mapFragment.getMapAsync(this); 

} 


@Override 
public void onMapReady(GoogleMap googleMap) { 
    mMap = googleMap; 

    // Add a marker in Sydney and move the camera 
    mMap.setMyLocationEnabled(true); 

    //add this here: 
    buildGoogleApiClient(); 

    //LatLng loc = new LatLng(lat, lng); 
    //mMap.addMarker(new MarkerOptions().position(loc).title("New Marker")); 
    //mMap.moveCamera(CameraUpdateFactory.newLatLng(loc)); 
} 

@Override 
public void onConnected(Bundle bundle) { 
    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
      mGoogleApiClient); 
    if (mLastLocation != null) { 
     lat = mLastLocation.getLatitude(); 
     lng = mLastLocation.getLongitude(); 

     LatLng loc = new LatLng(lat, lng); 
     mMap.addMarker(new MarkerOptions().position(loc).title("New Marker")); 
     mMap.moveCamera(CameraUpdateFactory.newLatLng(loc)); 
    } 
} 

Chociaż należy pamiętać, że można często uzyskać zerowy od wezwania do getLastLocation(). Możesz użyć numeru requestLocationUpdates() i zadzwonić pod numer removeLocationUpdates(), gdy pojawi się pierwsze miejsce. Spójrz na this answer, ma pełny przykład dokładnie tego, co próbujesz zrobić.

Powiązane problemy