我已将我的应用切换为目标API 27,现在无法授予WRITE_EXTERNAL_STORAGE
权限 - grantResult
始终为-1
。
我的应用需要此权限,因为它不使用应用私有外部存储空间(从API 19开始doesn't require WRITE_EXTERNAL_STORAGE
)。
我知道在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
声明。)
出现对话框,然后点击&#34;允许&#34;:
但是在onRequestPermissionsResult
回调内,我-1
WRITE_EXTERNAL_STORAGE
(被拒绝)0
(READ_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
,但我不确定。
答案 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"/>
并解决了问题。