API 26+:WRITE_EXTERNAL_STORAGE权限始终被拒绝

时间:2018-04-07 16:23:47

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

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

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

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

我以标准方式请求READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE权限:

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

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

出现对话框,然后点击&#34;允许&#34;:

enter image description here

但是在onRequestPermissionsResult回调内,我-1 WRITE_EXTERNAL_STORAGE(被拒绝)0READ_EXTERNAL_STORAGE(授予)0

因为我已经请求并且可能同时授予两者,所以结果不应该是WRITE_EXTERNAL_STORAGE吗?

我曾尝试单独请求build/intermediates/manifests/full/debug,但在这种情况下,对话框根本不会出现。

还有一个细节:我刚刚检查了WRITE_EXTERNAL_STORAGE中的合并清单,发现android:maxSdkVersion="18"权限的属性为minApiVersion=21(我的清单中没有此类属性)。这可能会发生,因为我的应用有>>> asin(1/2) 0.523598775598299 >>> asin(Rational(1, 2)) pi/6 ,但我不确定。

2 个答案:

答案 0 :(得分:29)

在某个地方,您正在获取android:maxSdkVersion="18"属性。我的猜测是它来自一个图书馆。检查&#34; Merged Manifest&#34;当您编辑自己的清单时,Android Studio中的选项卡。它将详细介绍各种元素和属性的贡献。

android:maxSdkVersion可以删除更高Android SDK版本上的<uses-permission>元素,至少在运行时权限的工作方式方面如此。

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

答案 1 :(得分:0)

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