Android Request Location Permission (Kotlin)

Edit AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>

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

    ...
</manifest>

NOTE: If you use library like Places SDK for Android, you don't need to declare the above permission as the library declares all permissions it uses in its manifest.

class HomeFragment: Fragment() {    companion object {        private const val REQUEST_LOCATION_PERMISSION = 1    }    // private val locationPermissions = arrayOf(ACCESS_FINE_LOCATION)    private val locationPermission = ACCESS_FINE_LOCATION    private fun findCurrentPlace() {        val placesClient = Places.createClient(context!!)        val placeFields = listOf(Place.Field.NAME)        val request = FindCurrentPlaceRequest.newInstance(placeFields)        if (checkLocationPermission()) {            val placeResponse = placesClient.findCurrentPlace(request)            placeResponse.addOnCompleteListener { task ->                if (task.isSuccessful) {                    val response = task.result                    response?.placeLikelihoods?.forEach {                        Timber.d("${it.place.name}, score=${it.likelihood}")                    }                }                else {                    Timber.e(task.exception, "placesClient.findCurrentPlace failed")                }            }        }        else {            requestLocationPermission()        }    }    private fun checkLocationPermission(): Boolean {        /*        locationPermissions.forEach {            if (ContextCompat.checkSelfPermission(context!!, it) != PackageManager.PERMISSION_GRANTED) {                return false            }        }        return true         */        return (ContextCompat.checkSelfPermission(context!!, locationPermission) == PackageManager.PERMISSION_GRANTED)    }    private fun requestLocationPermission() {        // optional implementation of shouldShowRequestPermissionRationale        if (ActivityCompat.shouldShowRequestPermissionRationale(activity!!, locationPermission)) {            AlertDialog.Builder(context!!)                .setMessage("Need location permission to get current place")                .setPositiveButton(android.R.string.ok) { _, _ ->                    // ActivityCompat.requestPermissions(activity!!, locationPermissions, REQUEST_LOCATION_PERMISSION)                    requestPermissions(arrayOf(locationPermission), REQUEST_LOCATION_PERMISSION)                }                .setNegativeButton(android.R.string.cancel, null)                .show()        }        else {            // ActivityCompat.requestPermissions(activity!!, locationPermissions, REQUEST_LOCATION_PERMISSION)            requestPermissions(arrayOf(locationPermission), REQUEST_LOCATION_PERMISSION)        }    }    override fun onRequestPermissionsResult(        requestCode: Int,        permissions: Array<out String>,        grantResults: IntArray    ) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults)        if (requestCode == REQUEST_LOCATION_PERMISSION) {            if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {                findCurrentPlace()            } else {                Timber.d("Location permission denied")                val isNeverAskAgain = !ActivityCompat.shouldShowRequestPermissionRationale(                        activity!!,                        locationPermission)                if (isNeverAskAgain) {                    Snackbar.make(list, "Location Permission required", Snackbar.LENGTH_LONG)                        .setAction("Settings") {                            Intent(ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:${activity!!.packageName}")).apply {                                addCategory(Intent.CATEGORY_DEFAULT)                                addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)                                startActivity(this)                            }                        }                        .show()                }                else {                    Timber.d("Location permission denied")                }            }        }    }}

NOTE: You might want to use EasyPermissions

❤️ Is this article helpful?

Buy me a coffee ☕ or support my work via PayPal to keep this space 🖖 and ad-free.

Do send some 💖 to @d_luaz or share this article.

✨ By Desmond Lua

A dream boy who enjoys making apps, travelling and making youtube videos. Follow me on @d_luaz

👶 Apps I built

Travelopy - discover travel places in Malaysia, Singapore, Taiwan, Japan.