如何使用 DownloadManager 将下载的文件存储到应用程序分配的文件目录中?

Posted

技术标签:

【中文标题】如何使用 DownloadManager 将下载的文件存储到应用程序分配的文件目录中?【英文标题】:How store Downloaded file using DownloadManager to app's files directory allocated? 【发布时间】:2019-04-13 07:08:30 【问题描述】:

我正在尝试使用 DownloadManager 将下载的文件存储到 android 分配的 app/s 文件目录中。为此我使用以下代码

downloadManager=(DownloadManager)getSystemService(Context.DOWNLOAD_SERVICE);
    Uri uri = Uri.parse(link);
    DownloadManager.Request request= new DownloadManager.Request(uri);
    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
    request.setVisibleInDownloadsUi(false);
    request.setTitle(fileName);

    File file = ctx.getFilesDir();
    Uri myPath=Uri.fromFile(file);
    request.setDestinationUri(myPath);

    Long reference= downloadManager.enqueue(request);
    Toast.makeText(DownloadActivity.this,"Downloading Started",Toast.LENGTH_LONG).show();

通过使用此代码,我收到以下错误

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.puranepaper.PuranePaper, PID: 18263
java.lang.SecurityException: Unsupported path /data/data/com.puranepaper.PuranePaper/files
    at android.os.Parcel.readException(Parcel.java:2005)
    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183)
    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
    at android.content.ContentProviderProxy.insert(ContentProviderNative.java:476)
    at android.content.ContentResolver.insert(ContentResolver.java:1552)
    at android.app.DownloadManager.enqueue(DownloadManager.java:1163)
    at com.puranepaper.PuranePaper.DownloadActivity$1.onClick(DownloadActivity.java:92)
    at android.view.View.performClick(View.java:6310)
    at android.view.View$PerformClick.run(View.java:24970)
    at android.os.Handler.handleCallback(Handler.java:790)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:171)
    at android.app.ActivityThread.main(ActivityThread.java:6654)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)

如何删除“不支持的路径”错误以及我在此代码中做错了什么

【问题讨论】:

【参考方案1】:

以“file://”开始 myPath

request.setDestinationUri("file://" + myPath);

这对我有用:

public void downloadFile(String address, String destination)   
        ///// Baja el archivo a la carpeta indicada.
        Uri uri = Uri.parse(address);
        String Nombre = address.substring(address.lastIndexOf('/') + 1);

        DownloadManager.Request request = new DownloadManager.Request(uri);
        // request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI); // Solo WiFi.
           request.setDestinationUri(Uri.parse("file://" + Environment.getExternalStorageDirectory() + destination  + "/"  + Nombre));
        // Bajada.
        DownloadManager downloadmanager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
        downloadmanager.enqueue(request);
    

downloadFile("http://example.com/myfile.jpg", "/mydirectory")

【讨论】:

解释你的解决方案。只放代码而不做任何解释是一种糟糕的风格。【参考方案2】:

其他应用(包括下载管理器)无法访问您应用的内存。

this question 的重复。

【讨论】:

以上是关于如何使用 DownloadManager 将下载的文件存储到应用程序分配的文件目录中?的主要内容,如果未能解决你的问题,请参考以下文章

从 DownloadManager 打开下载的文件时如何修复 CursorIndexOutOfBoundsException? [复制]

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

在不使用 DownloadManager 的情况下更新 Android“下载”文件夹

Downloadmanager实现app实现的升级下载使用

使用 DownloadManager 从 S3 下载 apk 文件

Android中的文件下载——DownLoadManager