Apunte para solicitar al usuario la ativación del GPS en el caso que lo tenga desactivado, no se puede activar directamente como se hacia con versiones anteriores de Android, por eso Google ha implementado que debemos solicitar al usuario la activación manual de ubicación.

Al realizar esos apuntos coincide que estoy actualizando una de mis apps, para recordar donde uno a estacionado, para luego poder recuperar su posición y así evitar perderse, la app se llama Find my parking location
La actualización es en la sección de acceso a la ubicación del usuario mediante el GPS, controlar si el usuario tiene el GPS activo, si no lo tiene mostrar el mensaje corrospondiente, despues de comprobar la activación del GPS se le solicita el permiso de poder obtener la posición actual.
Para ello he encontrado por internet una simple recopilación de utilidades, que la he simplicado y adaptado a mi necesidad
LocationUtils
class LocationUtils(private val context: Context) { companion object { const val PRIORITY_HIGH_ACCURACY_REQ = 0x600 fun openDetailAppSettings(context: Context) { val packageName = context.packageName val intent = Intent() intent.action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS val uri: Uri = Uri.fromParts("package", packageName, null) intent.data = uri context.startActivity(intent) } } private val settingsClient: SettingsClient = LocationServices.getSettingsClient(context) private val locationSettingsRequest: LocationSettingsRequest? private var locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager init { locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager val locationRequest = LocationRequest.create() locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY /*val locationRequest = LocationRequest.create() locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY locationRequest.interval = 10000 locationRequest.fastestInterval = 5000*/ val builder = LocationSettingsRequest.Builder().addLocationRequest(locationRequest) locationSettingsRequest = builder.build() builder.setAlwaysShow(true) } /** * Call this for show dialog system when GPS is off, and recive status location */ fun requestLocationStatus(OnGpsListener: OnLocationOnListener?) { if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { OnGpsListener?.locationStatus(true) } else { settingsClient .checkLocationSettings(locationSettingsRequest) .addOnSuccessListener(context as Activity) { // GPS enabled already OnGpsListener?.locationStatus(true) } .addOnFailureListener(context) { e -> when ((e as ApiException).statusCode) { LocationSettingsStatusCodes.RESOLUTION_REQUIRED -> try { val rae = e as ResolvableApiException rae.startResolutionForResult(context, PRIORITY_HIGH_ACCURACY_REQ) } catch (sie: IntentSender.SendIntentException) { Log.i(TAG, "PendingIntent unable to execute request.") } LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE -> { Log.e(TAG, "Enable location services from settings.") } } } } } interface OnLocationOnListener { fun locationStatus(isLocationOn: Boolean) } }
La clase tiene los siguientes métodos
- openDetailAppSettings: Sirve para mostrar la pantalla de la app dentro de configuración, si se da el caso que el usuario deniegue los permisos solicitados
- requestLocationStatus: para pedir al usuario que active la ubicación en su dispositivo, devolverá el estado de activación mediante un listener o bien
Obtener el estado de GPS o pedir activación
Con el método requestLocationStatus si el usuario tiene desactivado la ubicación (GPS) se le solicitará mediante un diálogo de sistema, si lo tuviera activado se recibira con locationStatus
LocationUtils(this).requestLocationStatus(object : LocationUtils.OnLocationOnListener { override fun locationStatus(isLocationOn: Boolean) { //isLocationOn para obtener su estado } })
Controlar la respuesta del diálogo de ubicación
Al mostrarse el diálogo de ubicación, el usuario puede decidir si activar el GPS o cancelar, para interceptar la acción se hará a través de onActivityResult, comprobando el LocationUtils.PRIORITY_HIGH_ACCURACY_REQ si es RESULT_OK o RESULT_CANCELED
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) Log.d(TAG, "onActivityResult() called with: requestCode = [$requestCode], resultCode = [$resultCode], data = [$data]") if (requestCode == LocationUtils.PRIORITY_HIGH_ACCURACY_REQ) { when (resultCode) { Activity.RESULT_OK -> { //GPS activado por el usuario } Activity.RESULT_CANCELED -> { //GPS desactivado, cancelado por el usuario } } } }
Recursos
Utilidades de este repositorio
Documentación oficial de Android Cómo cambiar la configuración de la ubicación