gpt4 book ai didi

android - 为什么我需要在 Android Lollipop 上使用 getExternalCacheDir() 的 WRITE_EXTERNAL_STORAGE 权限?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:38:24 27 4
gpt4 key购买 nike

我的应用程序将缓存文件写入(和读取)到 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 刷新)。我不再在模拟器中看到这个 - 当然系统图像已经更新了几次。

最佳答案

我们在 Nexus 5 上的 API 21 (Lollipop) 上看到了相同的行为:

java.io.FileNotFoundException: /storage/emulated/0/Android/data/[package name]/cache/http/journal.tmp: open failed: EACCES (Permission denied)
at libcore.io.IoBridge.open(IoBridge.java:456)
at java.io.FileOutputStream.<init>(FileOutputStream.java:87)
at java.io.FileOutputStream.<init>(FileOutputStream.java:72)
at com.android.okhttp.internal.DiskLruCache.rebuildJournal(DiskLruCache.java:346)
at com.android.okhttp.internal.DiskLruCache.open(DiskLruCache.java:239)
at com.android.okhttp.HttpResponseCache.<init>(HttpResponseCache.java:140)
at android.net.http.HttpResponseCache.install(HttpResponseCache.java:199)
...
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1011)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4518)
at android.app.ActivityThread.access$1500(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1339)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Method.java)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
at libcore.io.Posix.open(Posix.java)
at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
at libcore.io.IoBridge.open(IoBridge.java:442)
at java.io.FileOutputStream.<init>(FileOutputStream.java:87)
at java.io.FileOutputStream.<init>(FileOutputStream.java:72)
at com.android.okhttp.internal.DiskLruCache.rebuildJournal(DiskLruCache.java:346)
at com.android.okhttp.internal.DiskLruCache.open(DiskLruCache.java:239)
at com.android.okhttp.HttpResponseCache.<init>(HttpResponseCache.java:140)
at android.net.http.HttpResponseCache.install(HttpResponseCache.java:199)
...
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1011)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4518)
at android.app.ActivityThread.access$1500(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1339)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Method.java)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

在 Google 将 Android 5.0 推送到 AOSP 之前,我们无法确定它是错误还是故意(但未记录)更改,但无论如何我都提出了这个错误: https://code.google.com/p/android/issues/detail?id=81357

添加 WRITE_EXTERNAL_STORAGE 权限可防止抛出上述异常,但需要最终用户许可才能升级现有应用程序。由于我们的应用不使用此权限并且我们不想添加它,因此我们将退回到对除 KitKat 设备之外的所有设备使用内部缓存。

顺便说一句,我发现这是 KitKat 中引入的更改的有趣背景:http://www.doubleencore.com/2014/03/android-external-storage/

关于android - 为什么我需要在 Android Lollipop 上使用 getExternalCacheDir() 的 WRITE_EXTERNAL_STORAGE 权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27016647/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com