我是android编程的新手。我想问一下startActivityForResult()
和ActivityCompat.requestPermissions()
函数及其设计。我理解这些函数的结果由另一个Activity函数(分别为onActivityResult()
和onRequestPermissionsResult()
)处理。但我不明白为什么这样设计。
特别是ActivityCompat.requestPermissions()
。为什么我必须控制我是否有权限(ContextCompat.checkSelfPermission()
),如果我没有请求(ActivityCompat.requestPermissions()
)。如果我获得此许可,则处理完全不同的功能?
我希望有些想法:
askPermission(Context context, String permission, Runnable permissionGranted, Runnable permissionDenied)
如果我已经获得了许可,或者我是从用户那里获得的,那么会调用permissionGranted。有了这个功能,我必须要关心,如果我有权限或我没有。
现在,如果我获得许可,然后做同步任务,或者我没有它,那么我必须做好准备,然后做异步" onRequestPermissionsResult()
中的任务,我经常这样做,就像我已经获得许可一样。
我的问题是:有什么理由,为什么权限是这样设计的?我上面写的是否有一些功能允许我只是说如果我有什么可以做什么,如果我没有获得许可(以功能方式)怎么办?或者是否有一些设计模式可以轻松处理权限并启动结果活动?
感谢您的时间和一些解释,如果您知道为什么这个设计很好。
答案 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()
}
}
}
}