下载的文件会自动删除

时间:2017-09-30 10:23:00

标签: android android-file android-download-manager

在我的应用中,有一些用户可以下载的文件。文件通过android下载管理器下载。但是,几周以来,数百名用户一直在抱怨他们的文件每8-12天自动删除一次,甚至没有他们卸载应用程序。 (可能会有更多用户不愿意抱怨同样的问题。)

现在,可能存在许多用户特定的原因,为什么会在少数设备上发生这种情况。但考虑到大量的用户,似乎我可能做错了什么。

为什么系统/下载管理器会自动删除文件?有没有办法通知系统或下载管理器不删除某些文件?或者我应该在下载后重新命名文件,以便将它们与下载管理器取消链接,并希望问题能够解决?

编辑:

以下是我用来下载文件的代码:

DownloadManager.Request request = new DownloadManager.Request(Uri.parse(trackLink));
request.setTitle(trackTitle);
request.setDestinationInExternalPublicDir("Tracks", trackTitle + ".mp3");
request.setVisibleInDownloadsUi(false);
DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
manager.enqueue(request);

3 个答案:

答案 0 :(得分:5)

我也遇到过这个问题。查看DownloadIdleService的来源,如果下载设置为在用户界面中不可见,则会在7天之后将其删除,因为他们已经考虑过#34;陈旧"。 这是来自DownloadIdleService的javadoc:

/**
 * Remove stale downloads that third-party apps probably forgot about. We
 * only consider non-visible downloads that haven't been touched in over a
 * week.
 */

https://android.googlesource.com/platform/packages/providers/DownloadProvider/+/master/src/com/android/providers/downloads/DownloadIdleService.java#110

答案 1 :(得分:2)

从Android Q开始,存在一个更大的问题,其中setVisibleInDownloadsUi设置的值将被忽略,默认情况下为false。这些文件将在一周后被删除。您可以通过以下方式进行测试:下载文件,在日历中更改日期(例如2个月),在终端中调用:

adb shell cmd jobscheduler运行-f com.android.providers.downloads -100

它从DownloadIdleService开始工作,其中删除了旧文件和禁止文件。您可以在logcat(未设置过滤器)中看到DownloadManager尝试删除您的文件。

为此,您可以:

  • 将文件下载到 Environment#getExternalStoragePublicDirectory(String) with Environment#DIRECTORY_DOWNLOADS) -这是从Android Q开始的唯一可见下载路径且不应删除的路径
  • 下载后更改文件名(例如在DownloadedReceiver中)

答案 2 :(得分:1)

评论太大了我只是把它作为答案。

我还没有任何线索,为什么文件丢失或在一段时间内被删除 - 这有点奇怪。但我必须做类似的事情,从来没有经历过这样的事情。所以我虽然可能会分享我在那种情况下所做的事情。

我更喜欢将下载的文件保存在应用程序所在的内部存储中,而不是将其保存在外部存储中。例如,我用来保存下载文件的文件路径类似于......

/data/data/" + "com.example.myapplication" + "/musicfiles/

所以我下载后立即告诉媒体扫描程序有关新文件的信息,以便用户可以立即使用。因此,当我使用AsyncTask下载文件时,我必须在成功下载后以onPostExecute方式运行扫描程序。

protected void onPostExecute() {

    if(downloadCompletedSuccessfully) {

        MediaScannerConnection.scanFile(context,
            new String[]{file.toString()}, null,
            new MediaScannerConnection.OnScanCompletedListener() {
                public void onScanCompleted(String path, Uri uri) {
                    Log.i("ExternalStorage", "Scanned " + path + ":");
                    Log.i("ExternalStorage", "-> uri=" + uri);
                }
            });
    }
}

因此,在您的情况下,我认为由于下载的文件不可用,可能不会出现“下载”按钮不可见的问题。如果媒体扫描程序也无法在文件系统中找到该文件,则可能会发生这种情况。所以你可以考虑尝试一下。

我不知道干净的主人或某些软件是否会偶尔清除垃圾文件,如果它们在外部存储器中。您也可以考虑调查这些。