在 Android 应用程序的主要 Activity 中,我检查权限 (Manifest.permission.MANAGE_DOCUMENTS
),检测到我没有权限,然后调用 requestPermisions
。
然后在 onRequestPermissionResult
中,我几乎立即被拒绝了权限,没有显示任何对话框。
我已经在同一个应用程序的另一个 Activity 中确认相同的权限(再次通过 requestPermissions
,这有效),所以我希望这个决定被存储(用于 session ,或其他),而且我从未选择拒绝许可。无论哪种方式,都不会显示权限对话框并自动拒绝权限。
到目前为止,我已经在 Android 7 和 6(API 24 和 23)的模拟器上对此进行了测试。
我试过:
- 清除应用的数据缓存并删除设备,使其焕然一新
- 绝对不是这个Getting permission denied on Android M
- 在看到这个 onRequestPermissionsResult returns immediately with denied permission 后对拼写进行了三重检查我正在调用 super 方法
- 一堆关于堆栈溢出的其他建议
我很困惑...
这是权限请求(见代码中的注释):
private fun askForPermissionOrSendRequest(view: View, permission: String) {
if (checkSelfPermission(permission) == PackageManager.PERMISSION_DENIED) {
if (shouldShowRequestPermissionRationale(permission)) {
cachedView = view
val explanationDialog = AlertDialog.Builder(this).setMessage("We need permissions to read your storage in order to show your profile image.").setOnDismissListener {
requestPermissions(
arrayOf(permission),
BSMainActivity.permissionRequestSendProfilePic
)
}.create()
explanationDialog.show()
} else {
cachedView = view
// this branch is always hit - the permission seems to be missing every time
requestPermissions(
arrayOf(permission),
BSMainActivity.permissionRequestSendProfilePic
)
}
} else {
sendRequest(view)
}
}
我立即进入结果处理程序,而没有出现询问我权限的对话框。我可能会也可能不会在同一个应用程序的另一个(子) Activity 中确认相同的权限(似乎没有什么区别)。
override fun onRequestPermissionsResult(requestCode: Int,
permissions: Array<String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
when (requestCode) {
BSMainActivity.permissionRequestSendProfilePic -> {
// This gets hit, MANAGE_DOCUMENTS was denied
if (permissions.contains(Manifest.permission.MANAGE_DOCUMENTS) && grantResults[permissions.indexOf(Manifest.permission.MANAGE_DOCUMENTS)] == PackageManager.PERMISSION_DENIED) {
Log.w(logName, "Permission to open image was denied while sending a tag request: %s %s".format(
permissions.joinToString(",", "[", "]"),
grantResults.joinToString(",", "[", "]")
))
}
// send request regardless of the result for now
sendRequest(cachedView)
}
}
}
在我的 list 中我有以下内容:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="me.monomon.bs">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS"/>
最佳答案
只有 dangerous permissions可以在运行时请求并且 MANAGE_DOCUMENTS
不是危险的权限。
根据 MANAGE_DOCUMENTS documentation :
This permission should only be requested by the platform document management app. This permission cannot be granted to third-party apps.
关于来自 MainActivity 的 requestPermission 自动拒绝 Android 权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39926690/