Google Map Current Location

In this tutorial, we will explore how to display a user's current location on a Google Map within an Android application using Kotlin. Understanding how to work with maps is essential for developers who want to incorporate location-based features into their apps, such as navigation, geolocation services, and location tracking.

Why Google Maps Matter

Google Maps is one of the most popular mapping services available, widely used in mobile applications to provide users with geographical information. By integrating Google Maps into your Android app, you can enhance user experience by offering location services, directions, and real-time tracking.

Understanding Key Concepts

Before diving into the code, let's break down some essential concepts related to Google Maps and Kotlin:

  • Google Maps API: An interface that allows developers to integrate Google Maps features into their applications. It provides various functionalities like displaying maps, adding markers, and tracking user locations.
  • Location Services: Android provides a set of APIs to access the device's location. This is crucial for apps that require real-time location updates.
  • Permissions: Accessing location data requires explicit permissions from the user. Handling these permissions correctly is vital for a smooth user experience.
  • Common Interfaces You'll Encounter

  1. OnMapReadyCallback: This interface is triggered when the map is ready to be used. The onMapReady(GoogleMap) method allows you to customize the map.
  2. LocationListener: This interface lets you receive updates when the device's location changes.
  3. GoogleApiClient.ConnectionCallbacks: Provides callbacks for connection status to Google Play services.
  4. GoogleApiClient.OnConnectionFailedListener: Handles connection failures when trying to access Google Play services.
  5. Setting Up Your Project

    Step 1: Obtain Google Maps API Key

To use Google Maps, you'll need an API key. You can obtain one by following these steps:

  • Go to the Google Cloud Console.
  • Create a new project.
  • Enable the Maps SDK for Android.
  • Generate an API key and restrict it to your app's package name.
  • Step 2: Project Configuration

    Gradle Dependencies

Add the necessary dependencies to your build.gradle file:

Example

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.google.android.gms:play-services-maps:17.0.1'
    implementation 'com.google.android.gms:play-services-location:17.0.0'
}

XML Layout

Create a layout file activity_maps.xml with the following content:

Example

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/map"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MapsActivity" />

Manifest File

Ensure you have the appropriate permissions and the API key in your AndroidManifest.xml:

Example

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.kotlingooglemapcurrentlocation">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">

        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="@string/google_maps_key" />

        <activity
            android:name=".MapsActivity"
            android:label="@string/title_activity_maps">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Writing the Kotlin Code

Now, let’s implement the functionality in MapsActivity.kt. This activity will initialize the map and manage location updates.

Basic Code Structure

Example

package com.example.kotlingooglemapcurrentlocation

import android.Manifest
import android.content.pm.PackageManager
import android.location.Location
import android.os.Bundle
import android.os.Looper
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
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.BitmapDescriptorFactory
import com.google.android.gms.maps.model.LatLng
import com.google.android.gms.maps.model.MarkerOptions

class MapsActivity : AppCompatActivity(), OnMapReadyCallback {

    private lateinit var mMap: GoogleMap
    private lateinit var fusedLocationClient: FusedLocationProviderClient
    private lateinit var locationRequest: LocationRequest

    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 to be used.
        val mapFragment = supportFragmentManager
            .findFragmentById(R.id.map) as SupportMapFragment
        mapFragment.getMapAsync(this)
    }

    override fun onMapReady(googleMap: GoogleMap) {
        mMap = googleMap
        setupLocationRequest()
        enableUserLocation()
    }

    private fun setupLocationRequest() {
        locationRequest = LocationRequest.create().apply {
            interval = 10000
            fastestInterval = 5000
            priority = LocationRequest.PRIORITY_HIGH_ACCURACY
        }
    }

    private fun enableUserLocation() {
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), 101)
        } else {
            mMap.isMyLocationEnabled = true
            startLocationUpdates()
        }
    }

    private fun startLocationUpdates() {
        fusedLocationClient.requestLocationUpdates(locationRequest, object : LocationCallback() {
            override fun onLocationResult(locationResult: LocationResult?) {
                locationResult ?: return
                for (location in locationResult.locations) {
                    updateMapLocation(location)
                }
            }
        }, Looper.getMainLooper())
    }

    private fun updateMapLocation(location: Location) {
        val latLng = LatLng(location.latitude, location.longitude)
        mMap.clear() // Clear previous markers
        mMap.addMarker(MarkerOptions().position(latLng).title("Current Location")
            .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN)))
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 15f))
    }
}

Explanation of the Code

  • FusedLocationProviderClient: This class provides access to the location services and allows you to receive location updates.
  • LocationRequest: This object defines the parameters for the location requests, such as the interval and priority.
  • onMapReady: This method is called when the map is ready to be displayed. We set up the location request and enable location access here.
  • enableUserLocation: This method checks for location permission and enables the location layer on the map.
  • startLocationUpdates: This method starts requesting location updates using the FusedLocationProviderClient.
  • updateMapLocation: This method updates the map with the user's current location. It places a marker at the current location and moves the camera to that position.
  • Example Outputs

    Example 1: Display Current Location

    Example
    
    fun main() {
        println("Display Current Location")
    }
    

Output:

Output

Display Current Location

Example 2: Adding a Marker

Example

val markerOptions = MarkerOptions()
markerOptions.position(LatLng(37.4219983, -122.084))
markerOptions.title("Marker in Mountain View")
mMap.addMarker(markerOptions)

Output:

Output

Marker added at Mountain View

Example 3: Updating Location

Example

override fun onLocationResult(locationResult: LocationResult?) {
    locationResult ?: return
    for (location in locationResult.locations) {
        updateMapLocation(location)
    }
}

Output:

Output

Map updated with new location

Common Mistakes

  1. Not Handling Permissions Properly:
  • Failing to request location permissions can lead to app crashes.
  • Always check for permissions before accessing location data.
  1. Not Clearing Previous Markers:
  • If you don’t clear previous markers, multiple markers may overlap.
  • Use mMap.clear before adding a new marker.
  1. Forgetting to Call moveCamera:
  • If you forget to move the camera to the new location, users might not see their current position.
  • Always call moveCamera after updating the marker.
  • Best Practices

  • Permission Handling: Always check and request permissions dynamically to comply with best practices and keep users informed.
  • Performance Optimization: Use low-frequency location updates when possible to save battery life. Adjust the interval and fastestInterval as per your app’s requirements.
  • User Experience: Provide feedback to users when location access is denied or when there's an error accessing their location.
  • Practice Exercises

  1. Customize the Marker: Modify the marker's icon and title based on specific user locations, like restaurants or parks.
  2. Map Type Switching: Implement a feature that allows users to switch between different map types (Normal, Satellite, Terrain).
  3. Location History: Create a feature to log the user's location history and display it on the map with markers.

By following this tutorial, you should now have a solid understanding of how to implement Google Maps with current location features in your Android applications using Kotlin. Happy coding!

Input Required

This code uses input(). Please provide values below:

🤖 Coding Mentor
🤖

Hi! I'm your coding mentor

Ask me anything about programming:

• Python, Java, C++, JavaScript

• Algorithms & Data Structures

• Debugging & Code Help