Android:动态权限请求设计模式
我在android编程方面很新颖。 我想问一下关于startActivityForResult()
和ActivityCompat.requestPermissions()
函数及其设计。 我知道这些函数的结果是分别由另一个Activity函数( onActivityResult()
和onRequestPermissionsResult()
)处理的。 但我不明白为什么这样设计。
尤其是使用ActivityCompat.requestPermissions()
。 为什么我必须控制是否有权限( ContextCompat.checkSelfPermission()
),如果我没有要求它( ActivityCompat.requestPermissions()
)。 如果我得到这个许可,然后处理完全不同的function?
我希望有这样的想法:
askPermission(Context context, String permission, Runnable permissionGranted, Runnable permissionDenied)
如果我已经有权限,或者如果我从用户那里得到它,它将调用permissionGranted。 有了这个function,我将不得不关心,如果我有权限,或者我没有它。
现在,我必须distonguish如果我有权限,然后做同步任务,或者我没有它,然后在onRequestPermissionsResult()
,我经常做同样的,如果我已经有权限做的“异步”任务。
我的问题是:是否有一些原因,为什么这样设计的权限? 有没有一些function,我上面写了让我只是说如果我有什么做什么,如果我没有权限(以function的方式)做什么? 还是有一些设计模式,以便于处理权限和结果的启动活动?
感谢您的时间和一些解释,如果你知道为什么这个设计很好。
绝对不是一个好方法!
如果我们使用inheritance概念,我们可以稍微解决这个问题
我们可以使它像这样同步:
//Kotlin askForPermissions(permissionList, onPermissionsGranted = { //If permissions given }, onPermissionFailed = { //If permissions not given })
购买使用inheritance:
//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 internal fun askForPermissions(perms: Array , 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 ): Boolean { perms.forEach { if (checkSelfPermission(it) != PackageManager.PERMISSION_GRANTED) { return true } } return false } override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, 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() } } } }