¿Cómo implementar la función de botón de ubicación actual en Google Maps en Android?

La ubicación actual es una característica de Google Maps que nos ayuda a ubicar la posición del dispositivo en el mapa. A través de este artículo, mientras implementamos Google Maps, también implementaremos un botón, que buscará nuestra ubicación actual y la navegará en el mapa. Tenga en cuenta que vamos a implementar este proyecto utilizando el lenguaje Kotlin

Captura de pantalla de la aplicación Google Map real en un dispositivo Android

Siga los pasos a continuación para implementar un mapa y un botón para navegar a la posición actual del dispositivo

Paso 1: crea un nuevo proyecto en Android Studio

Para crear un nuevo proyecto en Android Studio, consulte Cómo crear/iniciar un nuevo proyecto en Android Studio . Demostramos la aplicación en Kotlin, así que asegúrese de seleccionar Kotlin como idioma principal al crear un nuevo proyecto.

Paso 2: obtenga y oculte la clave API

Nuestra aplicación utiliza la API de lugares de Google para implementar Google Map, por lo que necesitamos obtener la clave de la API de lugares de Google. Para obtener una clave de API, consulte Generación de claves de API para usar cualquier API de Google . Ocultar una clave API es esencial y para hacerlo, consulte ¿Cómo ocultar API y claves secretas en Android Studio? .

Paso 3: Agregar las dependencias en el archivo build.gradle

Necesitamos agregar la dependencia a continuación para importar bibliotecas para admitir la implementación de Google Map.

implementación ‘com.google.android.libraries.places:places:2.4.0’

Paso 4: agregar permisos a la aplicación en el archivo Manifest.xml

Como la aplicación se ocupa principalmente de la ubicación actual, le damos a la aplicación los permisos para acceder a la ubicación. Para otorgar tales permisos a la aplicación, declare los permisos entre el manifiesto y las etiquetas de apertura de la aplicación de la siguiente manera.

XML

<manifest...>
  
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
  
    <application ...>

Paso 5: Implementación de un fragmento simple de botón y mapa de Google en el archivo activity_main.xml (front-end)

aplicación > res > diseño > actividad_principal.xml actividad_principal.xml

XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">
  
    <fragment xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/map"
        tools:context=".MapsActivity"
        android:name="com.google.android.gms.maps.SupportMapFragment" />
  
    <Button
        android:id="@+id/currentLoc"
        android:layout_width="30sp"
        android:layout_height="40sp"
        android:layout_alignBottom="@id/map"
        android:layout_alignEnd="@id/map"
        android:layout_alignRight="@id/map"
        android:layout_marginRight="30sp"
        android:layout_marginBottom="30sp"
        />
  
</RelativeLayout>

Paso 6: Trabajar con MainActivity.kt (back-end)

Lo que hicimos en resumen es:

  1. Obtuve la clave API que almacenamos en el paso 2 .
  2. Inicializó la API de Places con el uso de la clave API.
  3. Inicializó el fragmento de mapa en el diseño (actividad_principal.xml).
  4. Cliente de ubicación fusionada inicializado.
  5. Botón inicializado en el diseño (actividad_principal.xml).
  6. Creó una función para obtener la última ubicación.
  7. Creó una función para solicitar una nueva ubicación.
  8. Creó una función para la devolución de llamada de ubicación.
  9. Creó una función para verificar si el GPS del dispositivo está encendido.
  10. Creó una función para verificar si se otorgan permisos para acceder a la ubicación.
  11. Creó una función para otorgar requests de permisos para acceder a la ubicación.
  12. Creó una función para llamar a getLastLocation() cuando se otorgan permisos.

Actividad principal.kt Actividad principal.kt

Kotlin

import android.Manifest
import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.content.pm.ApplicationInfo
import android.content.pm.PackageManager
import android.location.Location
import android.location.LocationManager
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.Looper
import android.provider.Settings
import android.widget.Button
import android.widget.Toast
import androidx.core.app.ActivityCompat
import com.google.android.gms.location.*
import com.google.android.gms.maps.CameraUpdateFactory
import com.google.android.gms.maps.GoogleMap
import com.google.android.gms.maps.OnMapReadyCallback
import com.google.android.gms.maps.SupportMapFragment
import com.google.android.gms.maps.model.LatLng
import com.google.android.gms.maps.model.MarkerOptions
import com.google.android.libraries.places.api.Places
  
class MainActivity : AppCompatActivity(), OnMapReadyCallback {
  
    private val pERMISSION_ID = 42
    lateinit var mFusedLocationClient: FusedLocationProviderClient
    lateinit var mMap: GoogleMap
        
      // Current location is set to India, this will be of no use
    var currentLocation: LatLng = LatLng(20.5, 78.9)
  
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
  
        // Fetching API_KEY which we wrapped
        val ai: ApplicationInfo = applicationContext.packageManager
            .getApplicationInfo(applicationContext.packageName, PackageManager.GET_META_DATA)
        val value = ai.metaData["com.google.android.geo.API_KEY"]
        val apiKey = value.toString()
  
        // Initializing the Places API with the help of our API_KEY
        if (!Places.isInitialized()) {
            Places.initialize(applicationContext, apiKey)
        }
  
        // Initializing Map
        val mapFragment = supportFragmentManager.findFragmentById(R.id.map) as SupportMapFragment
        mapFragment.getMapAsync(this)
  
        // Initializing fused location client
        mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
  
        // Adding functionality to the button
        val btn = findViewById<Button>(R.id.currentLoc)
        btn.setOnClickListener {
            getLastLocation()
        }
    }
  
    // Services such as getLastLocation()
      // will only run once map is ready
    override fun onMapReady(p0: GoogleMap) {
        mMap = p0
        getLastLocation()
    }
  
    // Get current location
    @SuppressLint("MissingPermission")
    private fun getLastLocation() {
        if (checkPermissions()) {
            if (isLocationEnabled()) {
  
                mFusedLocationClient.lastLocation.addOnCompleteListener(this) { task ->
                    val location: Location? = task.result
                    if (location == null) {
                        requestNewLocationData()
                    } else {
                        currentLocation = LatLng(location.latitude, location.longitude)
                        mMap.clear()
                        mMap.addMarker(MarkerOptions().position(currentLocation))
                        mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(currentLocation, 16F))
                    }
                }
            } else {
                Toast.makeText(this, "Turn on location", Toast.LENGTH_LONG).show()
                val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)
                startActivity(intent)
            }
        } else {
            requestPermissions()
        }
    }
  
    // Get current location, if shifted
      // from previous location
    @SuppressLint("MissingPermission")
    private fun requestNewLocationData() {
        val mLocationRequest = LocationRequest()
        mLocationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
        mLocationRequest.interval = 0
        mLocationRequest.fastestInterval = 0
        mLocationRequest.numUpdates = 1
  
        mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
        mFusedLocationClient.requestLocationUpdates(
            mLocationRequest, mLocationCallback,
            Looper.myLooper()
        )
    }
  
    // If current location could not be located, use last location
    private val mLocationCallback = object : LocationCallback() {
        override fun onLocationResult(locationResult: LocationResult) {
            val mLastLocation: Location = locationResult.lastLocation
            currentLocation = LatLng(mLastLocation.latitude, mLastLocation.longitude)
        }
    }
  
    // function to check if GPS is on
    private fun isLocationEnabled(): Boolean {
        val locationManager: LocationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager
        return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled(
            LocationManager.NETWORK_PROVIDER
        )
    }
  
    // Check if location permissions are
      // granted to the application
    private fun checkPermissions(): Boolean {
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED &&
            ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
        ) {
            return true
        }
        return false
    }
  
    // Request permissions if not granted before
    private fun requestPermissions() {
        ActivityCompat.requestPermissions(
            this,
            arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION),
            pERMISSION_ID
        )
    }
  
    // What must happen when permission is granted
    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
        if (requestCode == pERMISSION_ID) {
            if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
                getLastLocation()
            }
        }
    }
}

Producción:

Nota : La aplicación solicitará requests de permiso, permita amablemente una vez. Además, mantenga el dispositivo conectado a Internet.

Publicación traducida automáticamente

Artículo escrito por aashaypawar y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *