Accessing Location Services (GPS, Network) in Android Development


Accessing location services is a common requirement in mobile applications for tasks such as tracking, navigation, or providing location-based services. Android provides several mechanisms for accessing location information, including GPS (Global Positioning System) and network-based location. In this article, we'll explore how to access and use location services in Android using Kotlin.

Location Permissions

Before accessing location services, you need to request the appropriate permissions from the user. There are two primary permissions for accessing location in Android:

  • ACCESS_FINE_LOCATION: Allows access to precise location using GPS.
  • ACCESS_COARSE_LOCATION: Allows access to approximate location based on network services (Wi-Fi, cell towers).

Adding Permissions in the Manifest

You need to declare these permissions in your AndroidManifest.xml file:

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

Additionally, since Android 6.0 (API level 23), you need to request permissions at runtime.

Requesting Permissions at Runtime

For runtime permission requests, use the ActivityCompat.requestPermissions() method. Here's an example of how to request permissions:

    import android.Manifest
    import android.content.pm.PackageManager
    import androidx.appcompat.app.AppCompatActivity
    import android.os.Bundle
    import androidx.core.app.ActivityCompat
    import androidx.core.content.ContextCompat

    class MainActivity : AppCompatActivity() {

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)

            if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) 
                != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this, 
                    arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), 1)
            } else {
                // Permission granted, proceed with accessing location
            }
        }
    }
        

Getting Location Using LocationManager

Android provides the LocationManager class to retrieve location updates. The LocationManager can provide location information from GPS, network providers, or passive providers.

Getting the Current Location

To access the current location, you can use the getLastKnownLocation() method or request continuous updates using requestLocationUpdates().

    import android.location.Location
    import android.location.LocationListener
    import android.location.LocationManager
    import android.os.Bundle
    import android.widget.TextView
    import androidx.appcompat.app.AppCompatActivity

    class MainActivity : AppCompatActivity() {

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)

            val locationManager = getSystemService(LOCATION_SERVICE) as LocationManager
            val locationListener = object : LocationListener {
                override fun onLocationChanged(location: Location) {
                    // Get latitude and longitude
                    val latitude = location.latitude
                    val longitude = location.longitude

                    val locationText: TextView = findViewById(R.id.locationText)
                    locationText.text = "Latitude: $latitude, Longitude: $longitude"
                }

                override fun onStatusChanged(provider: String?, status: Int, extras: Bundle?) {}
                override fun onProviderEnabled(provider: String?) {}
                override fun onProviderDisabled(provider: String?) {}
            }

            // Request location updates from GPS or Network provider
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 10f, locationListener)
        }
    }
        

In this example, we use the requestLocationUpdates() method to get continuous location updates from the GPS provider. The parameters are the provider type, minimum time interval in milliseconds, minimum distance between updates in meters, and the location listener.

Getting Location Using FusedLocationProviderClient

The FusedLocationProviderClient is part of Google's Play Services and provides an easier and more efficient way to get location updates. It combines data from GPS, Wi-Fi, and other sensors to provide more accurate location data.

Adding Google Play Services Dependency

To use the FusedLocationProviderClient, add the following dependency to your build.gradle file:

    dependencies {
        implementation 'com.google.android.gms:play-services-location:17.0.0'
    }
        

Using FusedLocationProviderClient

Here’s how to get the last known location using the FusedLocationProviderClient:

    import android.os.Bundle
    import androidx.appcompat.app.AppCompatActivity
    import com.google.android.gms.location.FusedLocationProviderClient
    import com.google.android.gms.location.LocationServices
    import com.google.android.gms.tasks.OnSuccessListener
    import android.widget.TextView

    class MainActivity : AppCompatActivity() {

        private lateinit var fusedLocationClient: FusedLocationProviderClient

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)

            fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)

            // Get the last known location
            fusedLocationClient.lastLocation
                .addOnSuccessListener(this, OnSuccessListener { location ->
                    if (location != null) {
                        val latitude = location.latitude
                        val longitude = location.longitude

                        val locationText: TextView = findViewById(R.id.locationText)
                        locationText.text = "Latitude: $latitude, Longitude: $longitude"
                    }
                })
        }
    }
        

The lastLocation method retrieves the most recent known location from all available location providers.

Handling Location Updates

If you want to continuously monitor location changes, you can use the requestLocationUpdates() method from FusedLocationProviderClient as well.

    import com.google.android.gms.location.LocationRequest
    import com.google.android.gms.location.LocationCallback
    import com.google.android.gms.tasks.OnSuccessListener

    class MainActivity : AppCompatActivity() {

        private lateinit var fusedLocationClient: FusedLocationProviderClient
        private lateinit var locationCallback: LocationCallback
        private lateinit var locationRequest: LocationRequest

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)

            fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)

            locationRequest = LocationRequest.create().apply {
                interval = 10000 // 10 seconds
                fastestInterval = 5000 // 5 seconds
                priority = LocationRequest.PRIORITY_HIGH_ACCURACY
            }

            locationCallback = object : LocationCallback() {
                override fun onLocationResult(locationResult: LocationResult?) {
                    locationResult?.let {
                        for (location in it.locations) {
                            // Handle new location
                            val latitude = location.latitude
                            val longitude = location.longitude

                            val locationText: TextView = findViewById(R.id.locationText)
                            locationText.text = "Latitude: $latitude, Longitude: $longitude"
                        }
                    }
                }
            }

            // Start receiving location updates
            fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, null)
        }

        override fun onPause() {
            super.onPause()
            // Stop receiving location updates
            fusedLocationClient.removeLocationUpdates(locationCallback)
        }
    }
        

In this example, we set up a LocationRequest with a desired update interval and priority. The LocationCallback receives location updates, which we then display in a TextView.

Conclusion

Android provides multiple options for accessing location information, from the traditional LocationManager to the more efficient FusedLocationProviderClient. By requesting the appropriate permissions and using one of these methods, you can access GPS and network-based location data in your Android applications. Make sure to handle runtime permissions properly and choose the best location service based on your app's requirements.





Advertisement