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 .
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:
- Obtuve la clave API que almacenamos en el paso 2 .
- Inicializó la API de Places con el uso de la clave API.
- Inicializó el fragmento de mapa en el diseño (actividad_principal.xml).
- Cliente de ubicación fusionada inicializado.
- Botón inicializado en el diseño (actividad_principal.xml).
- Creó una función para obtener la última ubicación.
- Creó una función para solicitar una nueva ubicación.
- Creó una función para la devolución de llamada de ubicación.
- Creó una función para verificar si el GPS del dispositivo está encendido.
- Creó una función para verificar si se otorgan permisos para acceder a la ubicación.
- Creó una función para otorgar requests de permisos para acceder a la ubicación.
- 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