DownloadManager无法使用Pie下载到三星的外部存储上

时间:2019-04-09 11:57:46

标签: android android-download-manager android-external-storage android-9.0-pie samsung-galaxy

在Android 9(Pie)上的Samsung Galaxy S9和S9 +上,使用Android DownloadManager将文件下载到外部存储失败。

下载适用于装有Android 8的三星设备或装有Android 9(例如Pixel 2)的其他设备

我已在清单中添加了以下权限:

 "android.permission.WRITE_EXTERNAL_STORAGE", 
 "android.permission.READ_EXTERNAL_STORAGE",
 "android.permission.INTERNET"

我还已在运行时请求READ / WRITE_EXTERNAL_STORAGE权限。

文件路径为: /storage/4295-DDD5/Android/data/com.example.myapplication/files/filename.file 并且此文件路径存在,我已经使用AndroidStudio的设备文件资源管理器

创建了它

创建下载的方法:

public void downloadFile(String url, String filePath) {
   DownloadManager mDownloadManager = 
   (DownloadManager)context.getSystemService(Context.DOWNLOAD_SERVICE);

   DownloadManager.Request request = new 
   DownloadManager.Request(Uri.parse(url));

   request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | 
   DownloadManager.Request.NETWORK_WIFI);

   request.setVisibleInDownloadsUi(true);

   request.setDestinationUri(Uri.parse("file://" + filePath));

   mDownloadManager.enqueue(request);
}

预期结果是将指定文件从url下载到filePath,而不是在日志中出现以下错误:

D/DownloadManager: [8616] Starting com.example.myapplication
W/DownloadManager: [8616] Stop requested with status FILE_ERROR: Failed to generate filename: java.io.IOException: Permission denied
D/DownloadManager: [8616] Finished with status WAITING_TO_RETRY
V/DownloadManager: MIME Type = application/octet-stream
I/DownloadManager: Download 8616 finished with status WAITING_TO_RETRY
I/DownloadManager: Notification Clear Download 1:com.example.myapplication

3 个答案:

答案 0 :(得分:1)

Oagar,过去对我有帮助的是阅读https://commonsware.com/blog/archive.html

上所有8篇“外部存储的死亡”博客文章

我认为根本原因在于:

  

文件路径为:/storage/4295-DDD5/Android/data/com.example.myapplication/files/filename.file并且此文件路径存在,我已经使用AndroidStudio的设备文件资源管理器创建了它

仅仅因为已经创建了该目录并且看到它并不意味着您的应用程序能够写入该目录。 因此,请尝试在您知道的地方写东西,以确保可以写文件。

希望这会对您有所帮助。

答案 1 :(得分:0)

我设法通过使用setDestinationInExternalFilesDir(使用null  作为第二个参数)。

这应该将文件存储在与请求完全相同的位置,但是实际的实现似乎在Samsung设备上有效。另外,我也不需要任何许可(*_EXTERNAL_STORAGE)。

答案 2 :(得分:0)

在您的android清单中添加以下行:

<application
    ...
    android:usesCleartextTraffic="true"/>

official doc中的更多信息)