2012-12-07 13 views
42

UsoCome ottenere la posizione corrente nell'API Android di Google Maps v2?

mMap.setMyLocationEnabled(true) 

può impostare abilitare lo strato miaPosizione.
Ma il problema è come ottenere il myLocation quando l'utente fa clic sul pulsante? Voglio ottenere la longitudine e la latitudine.

+0

cosa ti serve? bisogno del luogo quando l'utente tocca lo schermo o ha bisogno della posizione dell'utente quando l'utente fa clic sul pulsante "Ottieni la mia posizione"? –

risposta

53

La posizione API di Google Maps ora funziona, ha anche gli ascoltatori, è possibile farlo utilizzando che, ad esempio:

private GoogleMap.OnMyLocationChangeListener myLocationChangeListener = new GoogleMap.OnMyLocationChangeListener() { 
    @Override 
    public void onMyLocationChange(Location location) { 
     LatLng loc = new LatLng(location.getLatitude(), location.getLongitude()); 
     mMarker = mMap.addMarker(new MarkerOptions().position(loc)); 
     if(mMap != null){ 
      mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(loc, 16.0f)); 
     } 
    } 
}; 

e quindi impostare l'ascoltatore per la mappa:

mMap.setOnMyLocationChangeListener(myLocationChangeListener); 

Questo verrà chiamato quando la mappa prima trova la posizione.

Nessuna necessità di LocationService o LocationManager.

OnMyLocationChangeListener L'interfaccia è obsoleta. utilizza invece com.google.android.gms.location.FusedLocationProviderApi. FusedLocationProviderApi fornisce una migliore localizzazione della posizione e l'utilizzo di energia e viene utilizzato dal punto blu "La mia posizione". Vedere MyLocationDemoActivity nella cartella delle applicazioni di esempio come esempio di codice o la Guida degli sviluppatori di posizione.

+0

buona soluzione, ma è necessario aggiungere rimuovere il marcatore di posizione prima di aggiungerne uno nuovo. In ogni cambio di posizione, google map aggiungerà il nuovo marker –

+0

adesso funziona, ma il problema è che c'è qualche ritardo. – jjLin

+11

"Questa interfaccia è obsoleta. utilizza com.google.android.gms.location.FusedLocationProviderApi invece" https://developers.google.com/android/reference/com/google/android/gms/maps/GoogleMap.OnMyLocationChangeListener – Eduardo

1
+0

Questo purtroppo non ti informerà di aggiornamenti. Secondo quanto riferito è rotto, anche. –

+4

** Aggiornamento: ** "Questo metodo è obsoleto. utilizza invece com.google.android.gms.locationLocationClient" https://developers.google.com/maps/documentation/android/location, http: // developer.android.com/google/play-services/location.html – samosaris

0

Try This

public class MyLocationListener implements LocationListener 
{ 

@Override 

public void onLocationChanged(Location loc) 
{ 

loc.getLatitude(); 

loc.getLongitude(); 

String Text = “My current location is: ” + 

“Latitud = ” + loc.getLatitude() + 

“Longitud = ” + loc.getLongitude(); 

Toast.makeText(getApplicationContext(),Text, Toast.LENGTH_SHORT).show(); 



tvlat.setText(“”+loc.getLatitude()); 

tvlong.setText(“”+loc.getLongitude()); 

this.gpsCurrentLocation(); 

} 
31

Al momento GoogleMap.getMyLocation() restituisce sempre nullo in ogni circostanza.

Attualmente ci sono due segnalazioni di bug verso Google, che io conosco, Issue 40932 e Issue 4644.

L'implementazione di un LocationListener come riportato in precedenza non è corretta perché LocationListener non è sincronizzato con LocationOverlay all'interno della nuova API che si sta tentando di utilizzare.

Dopo il tutorial sul sito di Vogella, collegato in precedenza da Pramod J George, è possibile fornire le indicazioni per l'API di Google Maps precedente.

Quindi mi scuso per non averti fornito un metodo per recuperare la tua posizione con questo mezzo. Per ora, locationListener potrebbe essere l'unico mezzo per farlo, ma sono sicuro che Google sta lavorando per risolvere il problema all'interno della nuova API.

Anche scusate per non pubblicare più link, StackOverlow pensa che io sia spam perché non ho un rappresentante.

---- Aggiornamento su 4 FEBBRAIO 2013 ----

Google ha dichiarato che il problema verrà risolto nel prossimo aggiornamento alle API di Google Maps tramite Issue 4644. Non sono sicuro di quando si verificherà l'aggiornamento, ma una volta fatto modificherò di nuovo questo post.

---- Aggiornamento 10 aprile, 2013 ----

Google ha dichiarato il problema è stato risolto tramite Issue 4644. Dovrebbe funzionare ora.

+0

Il thread collegato ha un post che dice che è stato corretto. Potresti voler aggiornare la tua risposta. +1 – Mzn

+0

Sembra che stia ancora ottenendo "null". Chiamo 'setMyLocationEnabled (true)' in 'onCreate', quindi proviamo a' getMyLocation() 'in' onPostCreate'. – theblang

+0

Ho ottenuto nulla anche nel metodo onPostCreate –

19

provare questo

LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE); 
Criteria criteria = new Criteria(); 
String provider = service.getBestProvider(criteria, false); 
Location location = service.getLastKnownLocation(provider); 
LatLng userLocation = new LatLng(location.getLatitude(),location.getLongitude()); 
+2

getLastKnownLocation può restituire null, quindi non è abbastanza affidabile – AFD

+0

che il codice ha funzionato per me, grazie –

+4

Questo è per ottenere la posizione nota, ma non la posizione corrente. –

2

Per ottenere la posizione quando l'utente fa clic su un pulsante di chiamata di questo metodo nel onClick

void getCurrentLocation() { 
    Location myLocation = mMap.getMyLocation(); 
    if(myLocation!=null) 
    { 
     double dLatitude = myLocation.getLatitude(); 
     double dLongitude = myLocation.getLongitude(); 
     Log.i("APPLICATION"," : "+dLatitude); 
     Log.i("APPLICATION"," : "+dLongitude); 
     mMap.addMarker(new MarkerOptions().position(
       new LatLng(dLatitude, dLongitude)).title("My Location").icon(BitmapDescriptorFactory.fromBitmap(Utils.getBitmap("pointer_icon.png")))); 
     mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(dLatitude, dLongitude), 8)); 

    } 
    else 
    { 
     Toast.makeText(this, "Unable to fetch the current location", Toast.LENGTH_SHORT).show(); 
    } 

} 

Assicurarsi inoltre che il

setMyLocationEnabled

è impostato su true.

Prova a vedere se funziona ...

+4

Mylocation è sempre nullo – Sami

+1

mMap.getMyLocation() è deprecato – sdelvalle57

0

Fornirà la posizione corrente.

mMap.setMyLocationEnabled(true); 
Location userLocation = mMap.getMyLocation(); 
     LatLng myLocation = null; 
     if (userLocation != null) { 
      myLocation = new LatLng(userLocation.getLatitude(), 
        userLocation.getLongitude()); 
      mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(myLocation, 
        mMap.getMaxZoomLevel()-5)); 
3

Assicurarsi di aver attivato i servizi di localizzazione sul dispositivo. Altrimenti non avrai informazioni relative alla posizione.

Questo funziona per me,

map = ((MapFragment)getFragmentManager().findFragmentById(R.id.map)).getMap(); 
    map.setMyLocationEnabled(true); 
    GoogleMap.OnMyLocationChangeListener myLocationChangeListener = new GoogleMap.OnMyLocationChangeListener() { 
     @Override 
     public void onMyLocationChange (Location location) { 
      LatLng loc = new LatLng (location.getLatitude(), location.getLongitude()); 
      map.animateCamera(CameraUpdateFactory.newLatLngZoom(loc, 16.0f)); 
     } 
    }; 
    map.setOnMyLocationChangeListener(myLocationChangeListener); 

}

1

Ho appena trovato questo frammento di codice semplice e funzionale, prova:

public class MainActivity extends ActionBarActivity implements 
    ConnectionCallbacks, OnConnectionFailedListener { 
... 
@Override 
public void onConnected(Bundle connectionHint) { 
    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
      mGoogleApiClient); 
    if (mLastLocation != null) { 
     mLatitudeText.setText(String.valueOf(mLastLocation.getLatitude())); 
     mLongitudeText.setText(String.valueOf(mLastLocation.getLongitude())); 
    } 
}} 

Ecco il link del tutorial: Getting the Last Known Location

0

Solo una condizione, ho provato che io non era nulla, se si concede abbastanza tempo all'utente per toccare il pulsante del livello "Ottieni la mia posizione", quindi non otterrà valore nullo.

1

provare questo

if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) 
       == PackageManager.PERMISSION_GRANTED) { 
    mMap.setMyLocationEnabled(true); 
} else { 
    // Show rationale and request permission. 
} 
0

opere risposta accettata, ma alcuni dei metodi utilizzati sono ora sconsigliato quindi penso che è meglio se rispondo a questa domanda con metodi aggiornati.

questa è la risposta è del tutto da this guide on google developers

ecco guida passo passo:

  1. attuare tutto questo nella vostra attività mappa

    MapActivity extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.OnConnectionFailedListener, GoogleApiClient.ConnectionCallbacks

  2. nella vostra onCreate :

    private GoogleMap mMap; 
    private Context context; 
    private TextView txtStartPoint,txtEndPoint; 
    private GoogleApiClient mGoogleApiClient; 
    private Location mLastKnownLocation; 
    private LatLng mDefaultLocation; 
    private CameraPosition mCameraPosition; 
    private boolean mLocationPermissionGranted; 
    
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_maps); 
    context = this; 
    mGoogleApiClient = new GoogleApiClient.Builder(this) 
         .enableAutoManage(this /* FragmentActivity */, 
           this /* OnConnectionFailedListener */) 
         .addConnectionCallbacks(this) 
         .addApi(LocationServices.API) 
         .addApi(Places.GEO_DATA_API) 
         .addApi(Places.PLACE_DETECTION_API) 
         .build(); 
    mGoogleApiClient.connect(); 
    } 
    
  3. nel onConnected:

    SupportMapFragment mapFragment = (SupportMapFragment)  getSupportFragmentManager() 
         .findFragmentById(map); 
    mapFragment.getMapAsync(this); 
    
  4. nelle onMapReady:

    @Override 
    public void onMapReady(GoogleMap googleMap) { 
    mMap = googleMap; 
    
    // Do other setup activities here too, as described elsewhere in this tutorial. 
    
    // Turn on the My Location layer and the related control on the map. 
    updateLocationUI(); 
    
    // Get the current location of the device and set the position of the map. 
    getDeviceLocation(); 
    } 
    
  5. e questi due sono i metodi in onMapReady:

    private void updateLocationUI() { 
        if (mMap == null) { 
        return; 
    } 
    
    if (ContextCompat.checkSelfPermission(this.getApplicationContext(), 
         android.Manifest.permission.ACCESS_FINE_LOCATION) 
         == PackageManager.PERMISSION_GRANTED) { 
        mLocationPermissionGranted = true; 
    } 
    
    if (mLocationPermissionGranted) { 
        mMap.setMyLocationEnabled(true); 
        mMap.getUiSettings().setMyLocationButtonEnabled(true); 
    } else { 
        mMap.setMyLocationEnabled(false); 
        mMap.getUiSettings().setMyLocationButtonEnabled(false); 
        mLastKnownLocation = null; 
    } 
    } 
    
    private void getDeviceLocation() { 
    if (ContextCompat.checkSelfPermission(this.getApplicationContext(), 
         android.Manifest.permission.ACCESS_FINE_LOCATION) 
         == PackageManager.PERMISSION_GRANTED) { 
        mLocationPermissionGranted = true; 
    } 
    
    if (mLocationPermissionGranted) { 
        mLastKnownLocation = LocationServices.FusedLocationApi 
          .getLastLocation(mGoogleApiClient); 
    } 
    
    // Set the map's camera position to the current location of the device. 
    float DEFAULT_ZOOM = 15; 
    if (mCameraPosition != null) { 
        mMap.moveCamera(CameraUpdateFactory.newCameraPosition(mCameraPosition)); 
    } else if (mLastKnownLocation != null) { 
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(
          new LatLng(mLastKnownLocation.getLatitude(), 
            mLastKnownLocation.getLongitude()), DEFAULT_ZOOM)); 
    } else { 
        Log.d("pouya", "Current location is null. Using defaults."); 
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(mDefaultLocation, DEFAULT_ZOOM)); 
        mMap.getUiSettings().setMyLocationButtonEnabled(false); 
    } 
    } 
    

questo è molto veloce, regolare ed efficace. spero che questo aiuti

0

Preferisco usare FusedLocationApi dal OnMyLocationChangeListener è deprecato.

prima dichiarare queste 3 variabili:

private LocationRequest mLocationRequest; 
private GoogleApiClient mGoogleApiClient; 
private LocationListener mLocationListener; 

definire i metodi:

private void initGoogleApiClient(Context context) 
{ 
    mGoogleApiClient = new GoogleApiClient.Builder(context).addApi(LocationServices.API).addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() 
    { 
     @Override 
     public void onConnected(Bundle bundle) 
     { 
      mLocationRequest = LocationRequest.create(); 
      mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
      mLocationRequest.setInterval(1000); 

      setLocationListener(); 
     } 

     @Override 
     public void onConnectionSuspended(int i) 
     { 
      Log.i("LOG_TAG", "onConnectionSuspended"); 
     } 
    }).build(); 

    if (mGoogleApiClient != null) 
     mGoogleApiClient.connect(); 

} 

private void setLocationListener() 
{ 
    mLocationListener = new LocationListener() 
    { 
     @Override 
     public void onLocationChanged(Location location) 
     { 
      String lat = String.valueOf(location.getLatitude()); 
      String lon = String.valueOf(location.getLongitude()); 
      Log.i("LOG_TAG", "Latitude = " + lat + " Longitude = " + lon); 
     } 
    }; 

    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, mLocationListener); 
} 

private void removeLocationListener() 
{ 
    LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, mLocationListener); 
} 
  • initGoogleApiClient() viene utilizzato per inizializzare GoogleApiClient oggetto
  • setLocationListener() viene utilizzato per luogo di installazione cambiamento ascoltatore
  • removeLocationListener() viene utilizzato per rimuovere l'ascoltatore

metodo di chiamata initGoogleApiClient per avviare il codice di lavoro :) Non dimenticare di rimuovere l'ascoltatore (mLocationListener) alla fine per evitare problemi di perdita di memoria.

Problemi correlati