¿Cómo obtener la ubicación actual en Google Maps Android API v2?

Utilizando

mMap.setMyLocationEnabled(true) 

puede configurar la capa myLocation habilitada.
Pero el problema es cómo obtener myLocation cuando el usuario hace clic en el botón? Quiero obtener la longitud y la latitud.

La ubicación de la API de Google Maps ahora funciona, incluso tiene oyentes, puedes hacerlo usando eso, por ejemplo:

 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)); } } }; 

y luego configure el oyente para el mapa:

 mMap.setOnMyLocationChangeListener(myLocationChangeListener); 

Se llamará a esto cuando el mapa encuentre la ubicación por primera vez.

No hay necesidad de LocationService o LocationManager en absoluto.

OnMyLocationChangeListener interfaz OnMyLocationChangeListener está en desuso. use com.google.android.gms.location.FusedLocationProviderApi en su lugar. FusedLocationProviderApi proporciona un mejor hallazgo de ubicación y uso de energía y es utilizado por el punto azul “Mi ubicación”. Consulte la MyLocationDemoActivity en la carpeta de aplicaciones de muestra, por ejemplo, código de ejemplo o la Guía de desarrollo de ubicación.

Por el momento, GoogleMap.getMyLocation () siempre devuelve null en todas las circunstancias.

Actualmente hay dos informes de errores para Google que conozco, el Issue 40932 y el Issue 4644 .

Implementar LocationListener como se mencionó anteriormente sería incorrecto porque LocationListener no estaría sincronizado con LocationOverlay dentro de la nueva API que está intentando usar.

Siguiendo el tutorial en el sitio de Vogella, vinculado anteriormente por Pramod J George, le daría instrucciones para la API anterior de Google Maps.

Entonces, me disculpo por no darle un método para recuperar su ubicación de esa manera. Por ahora, LocationListener puede ser el único medio para hacerlo, pero estoy seguro de que Google está trabajando para solucionar el problema dentro de la nueva API.

También lo siento por no publicar más enlaces, StackOverlow cree que soy spam porque no tengo representante.

—- Actualización el 4 de febrero de 2013 —-

Google ha declarado que el problema se solucionará en la próxima actualización de la API de Google Maps a través del Issue 4644 . No estoy seguro de cuándo se realizará la actualización, pero una vez que lo haga, volveré a editar esta publicación.

—- Actualización el 10 de abril de 2013 —-

Google ha declarado que el problema se ha solucionado a través del Issue 4644 . Debería funcionar ahora.

prueba esto

 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()); 

Asegúrese de haber activado los servicios de ubicación en el dispositivo. De lo contrario, no obtendrá ninguna información relacionada con la ubicación.

Esto funciona para mí,

  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); 

}

Para obtener la ubicación cuando el usuario hace clic en un botón, llame a este método en 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(); } } 

También asegúrese de que el

setMyLocationEnabled

está establecido en verdadero .

Intenta ver si esto funciona …

¿Has probado GoogleMap.getMyLocation() ?

Acabo de encontrar este fragmento de código simple y funcional, intente:

 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())); } }} 

aquí está el enlace del tutorial: Obtener la última ubicación conocida

prueba esto

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

Prueba esto

 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(); } 

Le dará la ubicación actual.

 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)); 

Solo una condición, probé que no era nula, si permites que el usuario tenga suficiente tiempo para tocar el botón de capa “obtener mi ubicación”, entonces no obtendrá valor nulo.

la respuesta aceptada funciona, pero algunos de los métodos utilizados ahora están en desuso, por lo que creo que es mejor si respondo esta pregunta con métodos actualizados.

esta es la respuesta es completamente de esta guía en los desarrolladores de Google

así que aquí hay una guía paso a paso:

  1. implementar todo esto en tu actividad de mapa

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

  2. en tu 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. en su onConnected :

     SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(map); mapFragment.getMapAsync(this); 
  4. en su 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. y estos dos son métodos en 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); } } 

esto es muy rápido, suave y efectivo. espero que esto ayude

Preferiría usar FusedLocationApi dado que OnMyLocationChangeListener está en desuso.

Primero declara estas 3 variables:

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

Definir métodos:

 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() se utiliza para inicializar el objeto GoogleApiClient
  • setLocationListener() se usa para configurar el escucha de cambio de ubicación
  • removeLocationListener() se utiliza para eliminar el oyente

Llame initGoogleApiClient método initGoogleApiClient para iniciar el funcionamiento del código 🙂 No olvide quitar el oyente ( mLocationListener ) al final para evitar problemas de pérdida de memoria.