Android:动态权限请求设计模式

时间:2018-02-05 08:46:15

标签: android design-patterns permissions android-permissions

我是android编程的新手。我想问一下startActivityForResult()ActivityCompat.requestPermissions()函数及其设计。我理解这些函数的结果由另一个Activity函数(分别为onActivityResult()onRequestPermissionsResult())处理。但我不明白为什么这样设计。

特别是ActivityCompat.requestPermissions()。为什么我必须控制我是否有权限(ContextCompat.checkSelfPermission()),如果我没有请求(ActivityCompat.requestPermissions())。如果我获得此许可,则处理完全不同的功能?

我希望有些想法:

askPermission(Context context, String permission, Runnable permissionGranted, Runnable permissionDenied)

如果我已经获得了许可,或者我是从用户那里获得的,那么会调用permissionGranted。有了这个功能,我必须要关心,如果我有权限或我没有。

现在,如果我获得许可,然后做同步任务,或者我没有它,那么我必须做好准备,然后做异步" onRequestPermissionsResult()中的任务,我经常这样做,就像我已经获得许可一样。

我的问题是:有什么理由,为什么权限是这样设计的?我上面写的是否有一些功能允许我只是说如果我有什么可以做什么,如果我没有获得许可(以功能方式)怎么办?或者是否有一些设计模式可以轻松处理权限并启动结果活动?

感谢您的时间和一些解释,如果您知道为什么这个设计很好。

1 个答案:

答案 0 :(得分:0)

绝对不是一个好方法!

如果我们使用继承概念,我们可以稍微解决这个问题

我们可以像这样同步:

//Kotlin
askForPermissions(permissionList, onPermissionsGranted = {
           //If permissions given
        }, onPermissionFailed = {
           //If permissions not given
        })

使用继承购买:

//Kotlin
open class PermissionActivity : AppCompatActivity() {
    private val PERM_REQ_CODE = 1457
    private lateinit var onPermissionsGranted: () -> Unit;
    private lateinit var onPermissionFailed: () -> Unit;
    private lateinit var perms: Array<String>

    internal fun askForPermissions(perms: Array<String>, onPermissionsGranted: () -> Unit, onPermissionFailed: () -> Unit) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (checkIfOneNotHasPermission(perms)) {
                //Dont have permissions
                this.perms = perms
                this.onPermissionsGranted = onPermissionsGranted
                this.onPermissionFailed = onPermissionFailed
                requestPermissions(perms, PERM_REQ_CODE)
            }
        } else {
            onPermissionsGranted.invoke()
        }
    }

    @RequiresApi(Build.VERSION_CODES.M)
    private fun checkIfOneNotHasPermission(perms: Array<String>): Boolean {
        perms.forEach {
            if (checkSelfPermission(it) != PackageManager.PERMISSION_GRANTED) {
                return true
            }
        }
        return false
    }

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        when (requestCode) {
            PERM_REQ_CODE -> {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    if (checkIfOneNotHasPermission(perms)) {
                        onPermissionFailed.invoke()
                    } else {
                        onPermissionsGranted.invoke()
                    }
                } else {
                    onPermissionsGranted.invoke()
                }
            }
            else -> {
                onPermissionFailed.invoke()
            }
        }
    }
}