es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El diálogo de solicitud de permiso de ubicación en Android no aparece la tercera vez después de no permitir.

Tengo esta actividad sencilla que muestra el diálogo de permisos de ubicación y, según la interacción con los botones positivo o negativo del diálogo de permisos, se borra la actividad. Como usuario, cuando cierro el diálogo por segunda vez y vuelvo a abrir la aplicación, el diálogo ya no se muestra y la actividad se cierra de inmediato. Me gustaría mostrar el diálogo de permisos cada vez si el permiso no fue concedido.

override fun onResume() {
    super.onResume()
    setupPermission()
}

private fun setupPermission() {
    val permission = PermissionChecker.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)

    if (permission != PackageManager.PERMISSION_GRANTED) {
        permissionsResultCallback.launch(Manifest.permission.ACCESS_FINE_LOCATION)
    } else {
        Log.d("dawg", "ya concedido")
        finish()
    }
}

private val permissionsResultCallback = registerForActivityResult(
    ActivityResultContracts.RequestPermission()) { granted ->
        when (granted) {
            true -> {
                Log.d("dawg", "concedido ahora mediante diálogo")
                finish()
            }
            false -> {
                Log.d("dawg", "denegado mediante diálogo")
                finish()
            }
        }
}
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para mostrar el cuadro de diálogo de permisos cada vez si el permiso no se ha concedido, puedes modificar la función setupPermission() de la siguiente manera:

    private fun setupPermission() {
        val permission = PermissionChecker.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
    
        if (permission != PackageManager.PERMISSION_GRANTED) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) {
                // el usuario ha desestimado el diálogo antes, mostrarlo de nuevo
                permissionsResultCallback.launch(Manifest.permission.ACCESS_FINE_LOCATION)
            } else {
                // el usuario aún no ha visto el diálogo, mostrarlo
                ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), REQUEST_CODE_LOCATION_PERMISSION)
            }
        } else {
            Log.d("dawg", "ya concedido")
            finish()
        }
    }
    

    Este código verifica si se ha concedido o no el permiso. Si no se ha concedido y el usuario ha desestimado el diálogo antes, muestra el cuadro de diálogo de permisos nuevamente utilizando el método permissionsResultCallback.launch(). Si el usuario aún no ha visto el diálogo, lo muestra utilizando el método ActivityCompat.requestPermissions().

    Puedes definir la constante REQUEST_CODE_LOCATION_PERMISSION antes del método onCreate():

    val REQUEST_CODE_LOCATION_PERMISSION = 100
    

    Además, asegúrate de manejar el resultado del permiso en el método onRequestPermissionsResult():

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<string>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (requestCode == REQUEST_CODE_LOCATION_PERMISSION) {
            if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Log.d("dawg", "concedido ahora a través del diálogo")
                finish()
            } else {
                Log.d("dawg", "denegado a través del diálogo")
                finish()
            }
        }
    }
    

    Este código maneja el resultado del cuadro de diálogo de permisos. Si se concedió el permiso, finaliza la actividad. Si se denegó, también finaliza la actividad.

    Con estas modificaciones, el cuadro de diálogo de permisos se mostrará cada vez si el permiso aún no se ha concedido, incluso si el usuario lo desestimó antes.

Comments are closed.