Muestra tu ubicación

En este ejemplo, se indica cómo habilitar la capa Mi ubicación y se incluye una demostración de cómo se usa el botón Mi ubicación para mostrar la posición actual del dispositivo, que se representa en el mapa por medio de un punto azul.

Para obtener más información, consulta la documentación.

Comienza ahora mismo

Antes de probar el código de muestra, debes configurar tu entorno de desarrollo. Para obtener más información, consulta Muestras de código del SDK de Maps SDK para Android.

Consulta el código



class MyLocationDemoActivity : AppCompatActivity(),
   
OnMyLocationButtonClickListener,
   
OnMyLocationClickListener, OnMapReadyCallback,
   
OnRequestPermissionsResultCallback {
   
/**
     * Flag indicating whether a requested permission has been denied after returning in
     * [.onRequestPermissionsResult].
     */

   
private var permissionDenied = false
   
private lateinit var map: GoogleMap
   
override fun onCreate(savedInstanceState: Bundle?) {
       
super.onCreate(savedInstanceState)
        setContentView
(R.layout.my_location_demo)
        val mapFragment
=
            supportFragmentManager
.findFragmentById(R.id.map) as SupportMapFragment?
        mapFragment
?.getMapAsync(this)
   
}

   
override fun onMapReady(googleMap: GoogleMap) {
        map
= googleMap
        googleMap
.setOnMyLocationButtonClickListener(this)
        googleMap
.setOnMyLocationClickListener(this)
        enableMyLocation
()
   
}

   
/**
     * Enables the My Location layer if the fine location permission has been granted.
     */

   
@SuppressLint("MissingPermission")
   
private fun enableMyLocation() {

       
// 1. Check if permissions are granted, if so, enable the my location layer
       
if (ContextCompat.checkSelfPermission(
               
this,
               
Manifest.permission.ACCESS_FINE_LOCATION
           
) == PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(
               
this,
               
Manifest.permission.ACCESS_COARSE_LOCATION
           
) == PackageManager.PERMISSION_GRANTED
       
) {
            map
.isMyLocationEnabled = true
           
return
       
}

       
// 2. If if a permission rationale dialog should be shown
       
if (ActivityCompat.shouldShowRequestPermissionRationale(
               
this,
               
Manifest.permission.ACCESS_FINE_LOCATION
           
) || ActivityCompat.shouldShowRequestPermissionRationale(
               
this,
               
Manifest.permission.ACCESS_COARSE_LOCATION
           
)
       
) {
           
PermissionUtils.RationaleDialog.newInstance(
                LOCATION_PERMISSION_REQUEST_CODE
, true
           
).show(supportFragmentManager, "dialog")
           
return
       
}

       
// 3. Otherwise, request permission
       
ActivityCompat.requestPermissions(
           
this,
            arrayOf
(
               
Manifest.permission.ACCESS_FINE_LOCATION,
               
Manifest.permission.ACCESS_COARSE_LOCATION
           
),
            LOCATION_PERMISSION_REQUEST_CODE
       
)
   
}

   
override fun onMyLocationButtonClick(): Boolean {
       
Toast.makeText(this, "MyLocation button clicked", Toast.LENGTH_SHORT)
           
.show()
       
// Return false so that we don't consume the event and the default behavior still occurs
       
// (the camera animates to the user's current position).
       
return false
   
}

   
override fun onMyLocationClick(location: Location) {
       
Toast.makeText(this, "Current location:\n$location", Toast.LENGTH_LONG)
           
.show()
   
}

   
override fun onRequestPermissionsResult(
        requestCode
: Int,
        permissions
: Array<String>,
        grantResults
: IntArray
   
) {
       
if (requestCode != LOCATION_PERMISSION_REQUEST_CODE) {
           
super.onRequestPermissionsResult(
                requestCode
,
                permissions
,
                grantResults
           
)
           
return
       
}

       
if (isPermissionGranted(
                permissions
,
                grantResults
,
               
Manifest.permission.ACCESS_FINE_LOCATION
           
) || isPermissionGranted(
                permissions
,
                grantResults
,
               
Manifest.permission.ACCESS_COARSE_LOCATION
           
)
       
) {
           
// Enable the my location layer if the permission has been granted.
            enableMyLocation
()
       
} else {
           
// Permission was denied. Display an error message
           
// ...
       
}
   
}

   
override fun onResumeFragments() {
       
super.onResumeFragments()
       
if (permissionDenied) {
           
// Permission was not granted, display error dialog.
            showMissingPermissionError
()
            permissionDenied
= false
       
}
   
}

   
/**
     * Displays a dialog with error message explaining that the location permission is missing.
     */

   
private fun showMissingPermissionError() {
        newInstance
(true).show(supportFragmentManager, "dialog")
   
}

    companion
object {
       
/**
         * Request code for location permission request.
         *
         * @see .onRequestPermissionsResult
         */

       
private const val LOCATION_PERMISSION_REQUEST_CODE = 1
   
}
}

     

public class MyLocationDemoActivity extends AppCompatActivity
   
implements
   
OnMyLocationButtonClickListener,
   
OnMyLocationClickListener,
   
OnMapReadyCallback,
   
ActivityCompat.OnRequestPermissionsResultCallback {

   
/**
     * Request code for location permission request.
     *
     * @see #onRequestPermissionsResult(int, String[], int[])
     */

   
private static final int LOCATION_PERMISSION_REQUEST_CODE = 1;

   
/**
     * Flag indicating whether a requested permission has been denied after returning in {@link
     * #onRequestPermissionsResult(int, String[], int[])}.
     */

   
private boolean permissionDenied = false;

   
private GoogleMap map;

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

       
SupportMapFragment mapFragment =
           
(SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
        mapFragment
.getMapAsync(this);
   
}

   
@Override
   
public void onMapReady(@NonNull GoogleMap googleMap) {
        map
= googleMap;
        map
.setOnMyLocationButtonClickListener(this);
        map
.setOnMyLocationClickListener(this);
        enableMyLocation
();
   
}

   
/**
     * Enables the My Location layer if the fine location permission has been granted.
     */

   
@SuppressLint("MissingPermission")
   
private void enableMyLocation() {
       
// 1. Check if permissions are granted, if so, enable the my location layer
       
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
           
== PackageManager.PERMISSION_GRANTED
           
|| ContextCompat.checkSelfPermission(this, permission.ACCESS_COARSE_LOCATION)
           
== PackageManager.PERMISSION_GRANTED) {
            map
.setMyLocationEnabled(true);
           
return;
       
}

       
// 2. Otherwise, request location permissions from the user.
       
PermissionUtils.requestLocationPermissions(this, LOCATION_PERMISSION_REQUEST_CODE, true);
   
}

   
@Override
   
public boolean onMyLocationButtonClick() {
       
Toast.makeText(this, "MyLocation button clicked", Toast.LENGTH_SHORT).show();
       
// Return false so that we don't consume the event and the default behavior still occurs
       
// (the camera animates to the user's current position).
       
return false;
   
}

   
@Override
   
public void onMyLocationClick(@NonNull Location location) {
       
Toast.makeText(this, "Current location:\n" + location, Toast.LENGTH_LONG).show();
   
}

   
@Override
   
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
       
@NonNull int[] grantResults) {
       
if (requestCode != LOCATION_PERMISSION_REQUEST_CODE) {
           
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
           
return;
       
}

       
if (PermissionUtils.isPermissionGranted(permissions, grantResults,
           
Manifest.permission.ACCESS_FINE_LOCATION) || PermissionUtils
           
.isPermissionGranted(permissions, grantResults,
               
Manifest.permission.ACCESS_COARSE_LOCATION)) {
           
// Enable the my location layer if the permission has been granted.
            enableMyLocation
();
       
} else {
           
// Permission was denied. Display an error message
           
// ...
       
}
   
}

   
@Override
   
protected void onResumeFragments() {
       
super.onResumeFragments();
       
if (permissionDenied) {
           
// Permission was not granted, display error dialog.
            showMissingPermissionError
();
            permissionDenied
= false;
       
}
   
}

   
/**
     * Displays a dialog with error message explaining that the location permission is missing.
     */

   
private void showMissingPermissionError() {
       
PermissionUtils.PermissionDeniedDialog
           
.newInstance(true).show(getSupportFragmentManager(), "dialog");
   
}

}

     

Clona y ejecuta las muestras

Se requiere Git para ejecutar esta muestra a nivel local. Con el siguiente comando, se clona el repositorio de la aplicación de ejemplo.

git clone git@github.com:googlemaps-samples/android-samples.git

Importa el proyecto de muestra en Android Studio:

  1. En Android Studio, selecciona File > New > Import Project.
  2. Ve a la ubicación en la que guardaste el repositorio y selecciona el directorio del proyecto para Kotlin o Java:

    • Kotlin: PATH-REPO/android-samples/ApiDemos/kotlin
    • Java: PATH-REPO/android-samples/ApiDemos/java
  3. Selecciona Open. Android Studio creará tu proyecto con la herramienta de compilación Gradle.
  4. Crea un archivo secrets.properties en blanco en el mismo directorio en el que se encuentra el archivo local.properties de tu proyecto. Para obtener más información, consulta Agrega tu clave de API al proyecto.
  5. Agrega la siguiente cadena a secrets.properties reemplazando YOUR_API_KEY con el valor de tu clave de API:

    MAPS_API_KEY=YOUR_API_KEY
  6. Ejecuta la app.