Publicado en Android

Pedir al usuario la activación del GPS en Android Kotlin


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

Autor:

Desarrollador freelance programador apasionado por el arte de programar, amante del auto aprendizaje y interesado por la tecnología en general.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios .