【发布时间】: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