Android应用程序无法写入下载目录:java.io.FileNotFoundException(权限被拒绝)



我有一个旧的应用程序,它使用以下行将APK下载到设备下载目录中:

File downloadsDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
File outputFile = new File(downloadsDirectory, "appname.apk");
FileOutputStream fileOutputStream = new FileOutputStream(outputFile);
// ...

我不确定这些线路是否有效,但据客户说确实有效。所以,现在我一直在维护这个应用程序,我必须想办法让它重新工作。通过上面的行,我得到以下错误消息:

E/my.appname.services.UpdateService: downloading of latest release failed
my.appname.exceptions.NetworkException: java.io.FileNotFoundException: /storage/emulated/0/Download/appname.apk (Permission denied)
at my.appname.services.UpdateRepository.download(UpdateRepository.java:89)
at my.appname.services.UpdateService.onUpdateFound(UpdateService.java:78)
at my.appname.services.UpdateService.checkForUpdates(UpdateService.java:61)
at my.appname.services.UpdateService.onHandleIntent(UpdateService.java:48)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:68)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.os.HandlerThread.run(HandlerThread.java:65)
Caused by: java.io.FileNotFoundException: /storage/emulated/0/Download/appname.apk (Permission denied)
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(FileOutputStream.java:287)
at java.io.FileOutputStream.<init>(FileOutputStream.java:223)
at java.io.FileOutputStream.<init>(FileOutputStream.java:171)
at my.appname.services.UpdateRepository.download(UpdateRepository.java:81)
at my.appname.services.UpdateService.onUpdateFound(UpdateService.java:78) 
at my.appname.services.UpdateService.checkForUpdates(UpdateService.java:61) 
at my.appname.services.UpdateService.onHandleIntent(UpdateService.java:48) 
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:68) 
at android.os.Handler.dispatchMessage(Handler.java:105) 
at android.os.Looper.loop(Looper.java:164) 
at android.os.HandlerThread.run(HandlerThread.java:65) 

考虑到该应用程序很旧,我立即怀疑有一些权限丢失,而且清单中确实没有android.permission.WRITE_EXTERNAL_STORAGEandroid.permission.READ_EXTERNAL_STORAGE实体。但即使添加了这些,我仍然会收到相同的错误消息。

有什么想法吗?访问下载目录可能还缺少什么

作为上面的评论,我将引用它作为答案

如果您在Android 6.0棉花糖(API 23(和以上版本上运行应请求运行时权限

如果您的目标是Android 10或更高版本,请记住在您的清单中添加requestLegacyExternalStorage=true,暂时选择退出作用域存储

参考本

最新更新