下载的文件会自动删除

Downloaded files get deleted automatically

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

现在,可能有一些特定于用户的原因会导致在一些设备上发生这种情况。但是考虑到用户数量庞大,看来我可能做错了。

为什么 system/download 管理员会自动删除文件?有没有办法通知系统或下载管理器不要删除某些文件?或者我应该只解决下载后重命名文件,以便取消它们与下载管理器的链接,并希望问题就这样解决了吗?

编辑:

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

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);

对于评论来说太大了,我只是把它作为一个答案。

我还不知道为什么文件会在一段时间内丢失或被删除 - 这有点奇怪。但是我不得不做类似的事情并且从未经历过这样的事情。所以我虽然可以分享我在那种情况下所做的事情。

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

/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);
                }
            });
    }
}

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

我不知道清理大师或类似的软件是否会不时清理垃圾文件是否在外部存储中。您也可以考虑调查这些。

我也遇到了这个问题。查看 DownloadIdleService 的来源,似乎如果下载设置为在 UI 中不可见,它们将在 7 天后被删除,因为它们被视为 "stale"。 这是来自 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

从 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 中)