【发布时间】:2015-01-16 23:01:48
【问题描述】:
我的应用程序将缓存文件写入(和读取)到 getExternalCacheDir() 位置。在 Android Lollipop (API 21) 之前,我一直在成功使用此权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" />
存在 maxSdkVersion 是因为在 API v18 之后不需要此权限: http://developer.android.com/reference/android/Manifest.permission.html#WRITE_EXTERNAL_STORAGE
但在 Android Lollipop (5.0) 上,我获得了这样的访问权限(我的日志输出显示使用的实际路径):
11-19 13:01:59.257 4462-4541/com.murrayc.galaxyzoo.app E/android-galaxyzoo﹕ createCacheFile(): IOException for filename=/storage/emulated/0/Android/data/com.murrayc.galaxyzoo.app/cache/52
java.io.IOException: open failed: EACCES (Permission denied)
at java.io.File.createNewFile(File.java:941)
at com.murrayc.galaxyzoo.app.provider.ItemsContentProvider.createCacheFile(ItemsContentProvider.java:528)
我在模拟器和我的 Nexus 4 上都看到了这一点。是发生了什么变化,还是我一直做错了什么?我只想访问我自己的应用程序的缓存。
更新:我现在只能在我的设备上看到这个(运行标准 Android 5.1.1 的 Nexus 4,自从我第一次遇到这个问题以来,它甚至有一个全新的 Android 刷新)。我不再在模拟器中看到这个 - 当然系统图像已经更新了好几次。
【问题讨论】:
-
如果你不添加这个 android:maxSdkVersion="18" 属性那么它可以工作吗?
-
是的。我必须始终请求 WRITE_EXTERNAL_STORAGE 才能完成这项工作。我想知道是否有办法说 20 需要它,如果 21 真的需要它(棒棒糖)。
-
是的,根据文档从 API 级别 19 开始,读取/写入 getExternalFilesDir(String) 和 getExternalCacheDir() 返回的应用程序特定目录中的文件不需要此权限,因此我们不需要此权限19 或以上的 API 但没有此权限,结论无效。
-
嗨@murrayc,当我将我的应用程序定位到Masmallow 时,我打算使用
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" />。我在 Masmallow 中测试过,效果很好。你还在 KitKat & Lollipop 中看到这个问题吗? -
是的,我仍然在 Lollipop 中看到这个问题。 Lollipop 没有任何改变。它似乎在 Marshmallow 中修复了,但 Lollipop 就在那里,我们必须处理它。
标签: android android-file android-permissions