Tengo una actividad que requiere permiso de cámara.
esta actividad se puede llamar desde varios lugares configurables por el usuario en la aplicación.
El diálogo de justificación y el diálogo de permiso deben mostrarse antes de que se abra la actividad.
ahora mismo estoy tratando de manejar estos diálogos en algún tipo de función de extensión.
fun handlePermissions(context: Context, required_permissions: Array<String>, activity: FragmentActivity?, fragment: Fragment?): Boolean { var isGranted = allPermissionsGranted(context, required_permissions) if (!isGranted) { //null here is where I used to pass my listener which was the calling fragment previously that implemented an interface val dialog = DialogPermissionFragment(null, DialogPermissionFragment.PermissionType.QR) activity?.supportFragmentManager?.let { dialog.show(it, "") } //get result from dialog? how? //if accepted launch actual permission request fragment?.registerForActivityResult(ActivityResultContracts.RequestPermission()) { success -> isGranted = success }?.launch(android.Manifest.permission.CAMERA) } return isGranted }Pero tengo problemas para recuperar los resultados del diálogo de justificación/explicación.
Mi investigación hasta ahora me llevó a quizás usar una función de orden superior, para pasar una variable de función al fragmento de diálogo que devuelve un valor booleano a la función auxiliar. Pero no estoy absolutamente seguro de si eso es lo correcto.
Pensé que usar mi propio código sería más limpio y menos costoso, ¿podría lograr esto más fácilmente al usar un marco como eazy-permissions? (Dexter sigue siendo recomendable ya que ya no está en desarrollo)
¿Es eso algo viable que estoy tratando de lograr aquí?
Un enfoque que he implementado y parece viable de usar es este:
Ayudante de PermissionsHelper de clase
class PermissionsHelper(private val activity: Activity) { fun requestPermissionsFromDevice( arrayPermissions: Array<String>, permissionsResultInterface: PermissionsResultInterface ) { setPermissionResultInterface(permissionsResultInterface) getMyPermissionRequestActivity().launch(arrayPermissions) } fun checkPermissionsFromDevice(permission: String): Boolean { return ContextCompat.checkSelfPermission(activity, permission) == PackageManager.PERMISSION_GRANTED } } Class PermissionsResultInterface para que la clase auxiliar pueda comunicarse con la actividad.
interface PermissionsResultInterface { fun onPermissionFinishResult(permissions: MutableMap<String, Boolean>) }Uso con este enfoque para eliminar todos los archivos del directorio de la aplicación:
private fun clearFiles(firstCall: Boolean = false) { if (verifyStoragePermissions(firstCall)) { val dir = File(getExternalFilesDir(null).toString()) removeFileOrDirectory(dir) Toast.makeText( applicationContext, resources.getString(R.string.done), Toast.LENGTH_SHORT ).show() } } private fun verifyStoragePermissions(firstCall: Boolean = false): Boolean { val arrayListPermissions = arrayOf( android.Manifest.permission.READ_EXTERNAL_STORAGE, android.Manifest.permission.WRITE_EXTERNAL_STORAGE ) for (permission in arrayListPermissions) { if (!PermissionsHelper(this).checkPermissionsFromDevice(permission)) { if (firstCall) PermissionsHelper(this) .requestPermissionsFromDevice(arrayListPermissions, this) else PermissionsDialogs(this).showPermissionsErrorDialog() return false } } return true } override fun onPermissionFinishResult(permissions: MutableMap<String, Boolean>) { clearFiles() }Con este enfoque, puede llamar al ayudante de permisos y usar la interfaz de resultados, después de cada una de las respuestas del usuario, decidir si aún necesita hacer una llamada para obtener permisos o mostrarle un cuadro de diálogo.
Si necesitas ayuda no dudes en contactarme.