【问题标题】:API 26+: WRITE_EXTERNAL_STORAGE permission is always deniedAPI 26+:WRITE_EXTERNAL_STORAGE 权限总是被拒绝
【发布时间】:2018-09-17 11:11:09
【问题描述】:

我已将我的应用切换到目标 API 27,现在无法授予它 WRITE_EXTERNAL_STORAGE 权限 -- grantResult 始终为 -1。

我的应用需要此权限,因为它不使用应用私有外部存储空间(doesn't requireWRITE_EXTERNAL_STORAGE 从 API 19 开始)。

我知道在 API 26 中有 behavior changes for permissions。然而这并不能解释我的问题。

我以标准方式请求READ_EXTERNAL_STORAGE 和WRITE_EXTERNAL_STORAGE 权限:

ActivityCompat.requestPermissions(activity, new String[] {
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE
    }, requestCode);

(两种权限都通过清单中的<uses-permission 声明)。

对话框出现,我点击“允许”:

但是在onRequestPermissionsResult 回调中,我得到了WRITE_EXTERNAL_STORAGE 的-1(拒绝)(和0(授予)READ_EXTERNAL_STORAGE)。

既然我已经请求并且大概都同意了,结果不应该是0吗?

我曾尝试单独请求WRITE_EXTERNAL_STORAGE,但在这种情况下,对话框根本不会出现。

更多细节:我刚刚检查了build/intermediates/manifests/full/debug 中的合并清单,并注意到WRITE_EXTERNAL_STORAGE 权限具有属性android:maxSdkVersion="18"(我的清单中没有这样的属性)。这可能是因为我的应用有 minApiVersion=21,但我不确定。

【问题讨论】:

  • "这两个权限都是通过 WRITE_EXTERNAL_STORAGE,您的症状符合我的预期。
  • @CommonsWare 是的,两者都在清单中。但是,我刚刚检查了build/intermediates/manifests/full/debug 中的合并清单,并注意到WRITE_EXTERNAL_STORAGE 权限具有属性android:maxSdkVersion="18"(我的清单中没有这样的属性)。这会导致问题吗?
  • 啊,这可能是问题所在。大概是某个库有这个,并且它正在被合并。尝试在你的 <uses-permission> 元素上添加 tools:remove="android:maxSdkVersion",看看是否可以解决它。
  • @CommonsWare 成功了!可能清单合并一直在添加maxSdkVersion=18,因为我的minSdkVersion 是21。这感觉违反直觉,值得向谷歌提交一个错误。我已使用有关合并清单的信息更新了问题。如果您将建议作为答案发布,我将很乐意接受。谢谢!
  • 很高兴听到它正在工作。下周我会在博客上说明这一点。

标签: android android-permissions android-8.0-oreo


【解决方案1】:

在某个地方,您正在选择android:maxSdkVersion="18" 属性。我的猜测是它来自图书馆。当您编辑自己的清单时,请检查 Android Studio 中的“合并清单”选项卡。它将详细说明是什么促成了各种元素和属性。

android:maxSdkVersion 具有在更高的 Android SDK 版本上删除您的 <uses-permission> 元素的效果,至少在运行时权限的工作方式方面是这样。

由于所有版本都需要此权限,因此在 <uses-permission> 元素上添加 tools:remove="android:maxSdkVersion" 应该会还原 android:maxSdkVersion="18" 并满足您的期望。

【讨论】:

  • 从未注意到 Android Studio 中实际上有一个“Merged Manifest”选项卡,这真的很棒。
  • 像@DenisKniazhev 一样有 100% 的确切问题,但这个解决方案有效!我也不知道有“合并清单”之类的东西。对于像我这样的人,当您打开“文本”选项卡旁边的“AndroidManifest.xml”文件时,可以找到“合并清单”选项卡,该选项卡位于清单的左下角(适用于 Android Studio 3.1.3)文件。
  • 解决办法是什么??
  • 如果您使用 HockeyApp 并且无法写入外部存储,这就是原因。你也可以tools:node="replace"
  • HockeyApp 让我开心
【解决方案2】:

我注意到清单中我的权限中有一个空格,它是<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE "/>,我将其更改为<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>,问题解决了。

【讨论】:

    猜你喜欢
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 2015-02-25
    • 2019-12-31
    相关资源
    最近更新 更多