- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的应用程序将缓存文件写入(和读取)到 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/
当拥有 WRITE_EXTERNAL_STORAGE 权限时,我希望有权写入整个文件系统(例如 /sdcard、/storage/emulated/0 ,/storage/sdcard0,/mnt/s
我正在将我的 Android 应用程序的目标 SDK 版本升级到 23 (Android M),它具有新的运行时权限 (https://developer.android.com/training/p
我想要的只是能够在一个非常特定的文件夹(与我的应用程序相关)中为我的应用程序编写日志/异常报告,以便了解失败和异常,所以这是我正在使用的代码: File logFile = new File(Envi
正在关注 this discussion ,我已经签署了一个系统应用程序,我正在使用从制造商那里收到的特定设备的专有平台证书。我签名如下: java -jar out/host/linux-x86/f
据我所知,要将声音设置为铃声,应将其插入 MediaStore。在 MediaStore 中写入,需要 WRITE_EXTERNAL_STORAGE 权限。但是...有没有办法在不需要 WRITE_E
下面的代码输出是“Write granted”,但之后出现错误 '/storage/emulated/0/Download/test.txt: open failed: EACCES (Permiss
是否可以在不添加任何权限的情况下共享自己的应用程序屏幕截图? 这是我的其他应用程序代码,用于复制到缓存和共享 public void sendFile(File paramFile) {
我开始将 HERE Android Starter SDK 集成到我的应用程序中。根据文档(和运行时错误),初始化 MapEngine 需要权限 WRITE_EXTERNAL_STORAGE: Map
我有使用的应用程序 它在 Android 6.0 上自动授予,但我可以在设置中撤销它。想要检查它是否被授予以防用户撤销它,所以我这样做: int permissionCheck = ContextC
如 documentation 中所述,从 API 级别 19 开始,WRITE_EXTERNAL_STORAGE 权限不应该是必需的。因此,我已将其写入 list : 但是,当我运行使用 Goog
有没有一种方法可以使用 Intent.ACTION_SEND 来共享屏幕截图而不需要 android.permission.WRITE_EXTERNAL_STORAGE? 分享部分如下: In
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我有一个 android 应用程序需要以下权限才能运行。 ACCESS_FINE_LOCATION、ACCESS_WIFI_STATE、WRITE_EXTERNAL_STORAGE、RECORD_AU
安卓 6 我编写了下一个检查权限的代码,如果没有这样的权限,它会要求用户提供它们。 private void checkDiskPermission () { if (ActivityComp
我目前使用此方法有效地将图像文件转换为内容 uri... protected static Uri convertFileToContentUri(Context context, File file
我正在使用下载管理器下载文件并将其保存到外部存储,如下所示: DownloadManager.Request req = new DownloadManager.Request(uri); req.s
在 android 6 或更高版本中,当用户第一次打开应用时询问他一些权限如果他不允许则退出应用程序 我的应用程序必须有一些权限是读取和写入外部存储,如何实现这一点 我试过了 if (Build.VE
声明就够了吗?还是我也必须声明 ? Javadocs 省略了这一重要信息。 最佳答案 最好是显式地声明这两个权限,但仅声明 android.permission.WRITE_EXTERNAL_STOR
我使用 DownloadManager 下载照片并将其保存到外部图片目录: .setDestinationInExternalPublicDir(Environment.DIRECTORY_PICTU
AS 中有一个关于 android.permission.WRITE_EXTERNAL_STORAGE 的 lint 警告.警告说,当面向 Android 10 及更高版本时,该权限将不再提供写入权限
我是一名优秀的程序员,十分优秀!