To create a Google Map in an Android application using Kotlin and display the user’s current location, follow these steps:
1. Set Up the Project
- Open Android Studio and create a new project with the Google Maps Activity template.
- Add the necessary dependencies for Google Maps in the
build.gradle
file (usually already included with the Maps template):
implementation 'com.google.android.gms:play-services-maps:18.1.0'
implementation 'com.google.android.gms:play-services-location:21.0.1'
2. Get a Google Maps API Key
- Go to the Google Cloud Console.
- Create a new project or select an existing one.
- Enable the Maps SDK for Android API.
- Generate an API key and add it to the
AndroidManifest.xml
:
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="YOUR_API_KEY_HERE" />
3. Modify the Activity Code
Update the MapsActivity.kt
file to display the user’s current location:
Imports
import android.Manifest
import android.content.pm.PackageManager
import android.location.Location
import android.os.Bundle
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
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.gms.location.FusedLocationProviderClient
import com.google.android.gms.location.LocationServices
Activity Code
class MapsActivity : AppCompatActivity(), OnMapReadyCallback {
private lateinit var mMap: GoogleMap
private lateinit var fusedLocationClient: FusedLocationProviderClient
private val LOCATION_PERMISSION_REQUEST_CODE = 1000
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_maps)
// Initialize the FusedLocationProviderClient
fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
// Obtain the SupportMapFragment and get notified when the map is ready
val mapFragment = supportFragmentManager
.findFragmentById(R.id.map) as SupportMapFragment
mapFragment.getMapAsync(this)
}
override fun onMapReady(googleMap: GoogleMap) {
mMap = googleMap
// Check for location permissions
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
enableUserLocation()
} else {
// Request location permission
ActivityCompat.requestPermissions(
this,
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
LOCATION_PERMISSION_REQUEST_CODE
)
}
}
private fun enableUserLocation() {
mMap.isMyLocationEnabled = true
// Get the user's last known location
fusedLocationClient.lastLocation.addOnSuccessListener { location: Location? ->
location?.let {
val currentLatLng = LatLng(it.latitude, it.longitude)
mMap.addMarker(MarkerOptions().position(currentLatLng).title("You are here"))
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(currentLatLng, 15f))
}
}
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
if (requestCode == LOCATION_PERMISSION_REQUEST_CODE) {
if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
enableUserLocation()
} else {
// Permission denied, handle as needed
}
}
}
}
4. Update the XML Layout
Ensure the activity_maps.xml
file includes a SupportMapFragment
:
<fragment
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/map"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
5. Test the Application
- Build and run the application on a device (not an emulator unless it has location services enabled).
- Grant location permissions when prompted.
- The map should display the user’s current location with a marker.
Optional Enhancements
- Add real-time location updates using
LocationCallback
. - Customize the map using Google Maps UI settings or add markers for nearby points of interest.