1
votes

Approche pour réduire l'écriture du même code ennuyeux lorsque vous travaillez avec des autorisations

Actuellement, j'écris une application de chat pour Android. À partir de 23 SDK et au-dessus, il a besoin de certaines autorisations que l'utilisateur doit autoriser, telles que extrêmement importantes (ma discussion utilisera un emplacement de création d'une discussion particulière) et juste de petites fonctionnalités telles que le téléchargement d'images sur le stockage Firebase (il a besoin du accès au stockage du téléphone, il a donc besoin d'une autorisation appropriée.)

J'ai l'interface suivante pour les rappels.

//calling from onCreate()
checkForPermission(
            this, android.Manifest.permission.READ_EXTERNAL_STORAGE,
            object : PermissionAskListener {
                override fun onPermissionGranted() {
                    showToast(getString(R.string.msg_permissions_granted), Toast.LENGTH_LONG)
                    uplodAnImageToFirebase()

                }

                override fun onPermissionRequest() {
                    ActivityCompat.requestPermissions(
                        this@MainActivity, arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE), readStorage
                    )
                }

                override fun onPermissionPreviouslyDenied() {
                    AlertDialog.Builder(this@MainActivity)
                        .setTitle(getString(R.string.title_permission_required))
                        .setMessage(getString(R.string.msg_permission_required))
                        .setCancelable(false)
                        .setPositiveButton(getString(R.string.action_allow)) { _, _ ->
                            ActivityCompat.requestPermissions(
                                this@MainActivity,
                                arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),
                                readStorage
                            )
                        }
                        .setNegativeButton(getString(R.string.action_cancel)) { dialog, _ ->
                            dialog.cancel()
                            showToast(getString(R.string.msg_we_cant_give_functionality), Toast.LENGTH_LONG)
                        }
                        .show()
                }

                override fun onPermissionDisabled() {
                    AlertDialog.Builder(this@MainActivity)
                        .setTitle(getString(R.string.title_permission_disabled))
                        .setMessage(getString(R.string.msg_please_enable_permission))
                        .setCancelable(false)
                        .setPositiveButton(
                            getString(R.string.action_go_to_settings)
                        ) { _, _ -> startActivity(Intent(Settings.ACTION_SETTINGS)) }
                        .setNegativeButton(getString(R.string.action_cancel)) { dialog, _ ->
                            dialog.cancel()
                            showToast(getString(R.string.msg_we_cant_give_functionality), Toast.LENGTH_LONG)
                        }
                        .show()
                }
            }
        )

Et, je l'utilise dans un code comme celui-ci:

object PermissionUtils {

 interface PermissionAskListener {


        fun onPermissionGranted()
        /*
            User has already granted this permission
            The app must had been launched earlier and the user must had "allowed" that permission
         */


        fun onPermissionRequest()
        /*
            The app is launched FIRST TIME..
            We don't need to show additional dialog, we just request for the permission..

         */


        fun onPermissionPreviouslyDenied()
        /*
            The app was launched earlier and the user simply "denied" the permission..
            The user had NOT clicked "DO NOT SHOW AGAIN"
            We need to show additional dialog in this case explaining how "allowing this permission" would be useful to the user
         */


        fun onPermissionDisabled()
        /*
            The app had launched earlier and the user "denied" the permission..
            AND ALSO had clicked "DO NOT ASK AGAIN"
            We need to show Toask/alertdialog/.. to indicate that the user had denied the permission by checking do not disturb too...
            So, you might want to take the user to setting>app>permission page where the user can allow the permission..


         */

    }

fun checkForPermission(activity: Activity, permission: String, permissionAskListener: PermissionAskListener) {
//code omitted, here's the logic of calls listener members 
 }
}

Comme vous pouvez le voir à partir du code, uniquement onPermissionGranted ( ) faire quelque chose de particulier, et soit onPermissionPreviouslyDenied () et onPermissionDisabled () en disant simplement à l'utilisateur des choses ennuyeuses et courantes, que je veux incapsuler à une classe qui créera des dialogues pour des choses très importantes (comme l'emplacement; si l'autorisation refusée, je comme pour fermer toute l'application), et soit simplement télécharger, ce qui ne fera que bloquer la fonctionnalité.

Je sais comment faire de telles demandes d'autorisation et d'autres choses du même genre. Je ne sais pas comment créer ces classes avec les boîtes de dialogue - créez une énumération que je passe chaque fois que j'appelle la méthode onDisabled / onPreviouslyDenied à partir de l'activité, ou crée Builder pour elle, ou crée Factory ... si vous TL; DR cas, alors juste réponse: "Comment réduire le même code dans mon cas?"


2 commentaires

Il existe un nombre apparemment infini de bibliothèques pour essayer de réduire une partie de ce passe-partout .


Merci, je vais maintenant jeter un oeil


3 Réponses :


0
votes

Comme CommonsWare l'a suggéré dans les commentaires, il existe (voici des bibliothèques pour essayer de réduire une partie de ce passe-partout ) beaucoup de bonnes bibliothèques. J'ai choisi une bibliothèque NoPermission . Peut-être, cela ressemble à une publicité, mais je suis sûr que ce n'est pas la pire bibliothèque. Passez une bonne journée !!!


0 commentaires

1
votes

Une autre solution serait de créer une classe BaseActivity et de placer vos autres activités dans la sous-classe d'application BaseActivity .

Quelque chose comme ..

class BaseActivity: AppCompatActivity {
    override fun onCreate() {
        super.onCreate()
        checkForPermissions() // do your permission check code 
    }
}

class MainActivity: BaseActivity {
    override fun onCreate() {
        super.onCreate() // calls BaseAcivitiy's onCreate, which triggers the checkForPermissions
    }
}


1 commentaires

Approche intéressante, je ne devinerais pas cela. Merci d'avoir élargi mes perspectives!)



0
votes

Je suggère d'utiliser la bibliothèque suivante: https://github.com/Karumi/Dexter

D'autre part, pour éviter les doublons de code, vous pouvez déplacer vers une classe séparée le code lié à l'assistant de dialogue.

Par exemple: https://github.com/jpgpuyo/MVPvsMVVM/blob/one_dialog/app/src/main/java/upday/mvpvsmvvm/dialoghelper/DialogHelper.java


3 commentaires

Merci pour votre aide, vous êtes génial: vous n'êtes pas passé, vous m'avez aidé. Mais cette bibliothèque ne contient rien d'inhabituel. Et DialogHelper aussi. Mais, dans tous les cas, comment peux-tu savoir ce que je sais?) En tout cas, reste gentil comme tu l'es maintenant, jpgpuyo!)


@DanielJorn À propos de la bibliothèque, cela aide à réduire le code standard, cela permet de placer votre logique d'autorisations là où vous le souhaitez et cela permet d'éviter d'éventuels problèmes. À propos de DialogHelper, ce n'est qu'un petit exemple, mais imaginez si vous commencez à placer AlertDialog le long de tout le code et que vous devez ensuite changer le style de toutes les boîtes de dialogue d'alerte dans l'ensemble de l'application. Si vous mettez les choses au même endroit, vous économisez du temps et de l'argent :) Je suis d'accord avec vous, il n'y a rien de caché dans la bibliothèque ou dans l'assistant de dialogue, juste un wrappers, mais ce qui est habituel, c'est que lorsque vous n'utilisez pas de wrappers, vous avoir des problèmes :)


Bien dit) Merci)