Desde MarshMallow Android introdujo permisos de tiempo de ejecución, podemos otorgar los permisos mientras usamos la aplicación, en lugar de mientras la instalamos. En general, si desea utilizar una cámara o realizar una llamada desde su aplicación, solicitará el permiso del usuario. Se proporcionan algunas funciones predefinidas para preguntar y saber si el usuario ha otorgado los permisos o no.
Supongamos que necesitamos los permisos de usuario, le pediremos permiso utilizando la siguiente función
Kotlin
requestPermissions(arrayOf(Manifest.permission.READ_PHONE_STATE), Manifest.permission.WRITE_EXTERNAL_STORAGE ABConstants.REQUEST_CODE_FOR_PERMISSIONS)
Aquí, estamos solicitando permisos arrayOf al usuario y una vez que el usuario está autorizado/denegado, obtendremos el resultado como una devolución de llamada como se muestra a continuación.
Kotlin
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) }
En esta devolución de llamada podemos verificar si el usuario ha otorgado los permisos o no. Si no se proporciona, nuevamente tenemos que preguntarle llevando al usuario a la página de configuración. El usuario puede otorgar solo un permiso y no permanecer, entonces es muy difícil de manejar y necesitamos escribir mucho código lógico para eso. Para simplificar este tipo de problemas, usamos la biblioteca Dexter. Simplemente agregue esta biblioteca en Gradle como se muestra a continuación.
implementation 'com.karumi:dexter:6.2.2'
¿Cómo funciona ?
1. En la actividad, agregue una variable global y verifique la función ThePermissions.
Kotlin
class MainActivity : AppCompatActivity() { lateinit var dexter : DexterBuilder override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) checkThePermissions() } }
2. Implementemos la función aquí como a continuación
Kotlin
private fun getPermission() { dexter = Dexter.withContext(this) .withPermissions( android.Manifest.permission.CAMERA, android.Manifest.permission.WRITE_EXTERNAL_STORAGE, android.Manifest.permission.READ_PHONE_STATE ).withListener(object : MultiplePermissionsListener { override fun onPermissionsChecked(report: MultiplePermissionsReport) { report.let { if (report.areAllPermissionsGranted()) { Toast.makeText(this@MainActivity, "Permissions Granted", Toast.LENGTH_SHORT).show() } else { AlertDialog.Builder(this@MainActivity, R.style.Theme_AppCompat_Dialog).apply { setMessage("please allow the required permissions") .setCancelable(false) .setPositiveButton("Settings") { _, _ -> val reqIntent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) .apply { val uri = Uri.fromParts("package", packageName, null) data = uri } resultLauncher.launch(reqIntent) } // setNegativeButton(R.string.cancel) { dialog, _ -> dialog.cancel() } val alert = this.create() alert.show() } } } } override fun onPermissionRationaleShouldBeShown(permissions: List<PermissionRequest?>?, token: PermissionToken?) { token?.continuePermissionRequest() } }).withErrorListener{ Toast.makeText(this, it.name, Toast.LENGTH_SHORT).show() } dexter.check() }
3. Entendamos el código
En el primer parámetro, estamos pasando contexto de actividad y en el segundo parámetro, estamos pasando una lista de permisos como arrayOf. En el tercer parámetro, tenemos que implementar MultiplePermissionsListener que tiene una función onPermissionsChecked, en esta función obtenemos el informe sobre los permisos que se otorgan o no. Si se otorgan todos los permisos, mostraremos que se otorga el mensaje del brindis; de lo contrario, debemos mostrar el cuadro de diálogo que tiene un botón de configuración. Cuando el usuario haga clic en el botón de configuración, accederemos a la página de configuración de la aplicación, donde el usuario puede permitir/denegar manualmente los permisos. Cuando el usuario regresa de la página de configuración, debemos saber si lo concedió o no. Para eso, tenemos que usar startActivityForResult y aquí estamos agregando un código como el siguiente
Kotlin
resultLauncher.launch(reqIntent)
Obtenemos la devolución de llamada OnActivityResult como a continuación
Kotlin
private var resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> dexter.check() }
La función dexter.check() verifica los permisos nuevamente, si se otorgan todos los permisos, mostraremos que se otorga el mensaje de brindis; de lo contrario, se realizará el mismo proceso nuevamente.
Publicación traducida automáticamente
Artículo escrito por satheeshguduri y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA