来自 MainActivity 的 requestPermission 自动拒绝 Android 权限

标签 android

在 Android 应用程序的主要 Activity 中,我检查权限 (Manifest.permission.MANAGE_DOCUMENTS),检测到我没有权限,然后调用 requestPermisions。 然后在 onRequestPermissionResult 中,我几乎立即被拒绝了权限,没有显示任何对话框。

我已经在同一个应用程序的另一个 Activity 中确认相同的权限(再次通过 requestPermissions,这有效),所以我希望这个决定被存储(用于 session ,或其他),而且我从未选择拒绝许可。无论哪种方式,都不会显示权限对话框并自动拒绝权限。

到目前为止,我已经在 Android 7 和 6(API 24 和 23)的模拟器上对此进行了测试。

我试过:

我很困惑...

这是权限请求(见代码中的注释):

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/

相关文章:

android - Cordova/PhoneGap HTML5 地理围栏

java - 如何将月份缩写为 3 个字符?

android - WebView 中的 Flash 不适用于 Android 3.2

android - 如何获取 RecyclerView 项目的 ViewHolder

android - 带有 pthread 析构函数的 c++ thread_local 析构函数

android - 有没有办法在 Android 或 iOS 库中的 worklight connect 方法调用中指定超时?

android - 如何在我的短信应用android中获取未读消息

android - 如何在android中使用SystemSound.play(SystemSoundType.click)?

java - android 设备上 Intent.BATTERY_ACTION_CHANGED 时电池温度和电压的单位是什么?

android - 根据第一个 Activity 更改第二个 Activity 的标题