【问题标题】:Downloaded files get deleted automatically下载的文件会被自动删除
【发布时间】:2018-03-12 03:01:40
【问题描述】:

在我的应用中,用户可以下载一些文件。 通过 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);

【问题讨论】:

  • 您将这些文件保存在哪里?这些文件在您的应用程序中有何用途?是的,你能分享一下你用来下载和保存文件的代码段吗?
  • @ReazMurshed 我用我用来下载文件的代码编辑了我的问题。这些文件是可以在应用中播放的 mp3 曲目。
  • 那么当您尝试播放损坏的文件时,您是否显示“找不到文件”或类似的内容??
  • 不。我试着写评论,但评论太大了。我后来发表了我的想法作为答案。
  • 嗨@Wayne,选择的答案帮助我调试问题;为了解决这个问题,我最终下载了文件并简单地重命名了它,从而阻止了 Android 操作系统跟踪文件的使用情况。

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


【解决方案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);
                }
            });
    }
}

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

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

【讨论】:

  • 感谢 Reaz,但我与媒体扫描仪无关。事实上,我还有一个 .nomedia 文件,我的文件会在其中下载,因此媒体扫描仪会故意忽略它。我将研究清洁大师之类的清洁应用程序。当然,其中一个著名的应用程序一定是这里的罪魁祸首。
【解决方案2】:

我也遇到过这个问题。查看DownloadIdleService 的来源,似乎如果下载设置为在 UI 中不可见,则它们会在 7 天后被删除,因为它们被认为是“陈旧的”。 这是来自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

【讨论】:

  • 有什么办法可以阻止这些删除吗?
  • 最好的办法是使用临时文件名下载并在下载完成后重命名。
【解决方案3】:

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

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

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

为了防止这种情况发生,您可以:

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

【讨论】:

  • 我正要为这个问题生气,很多用户一直在抱怨这个问题。您已经准确描述了我的问题所在。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-26
  • 2012-08-18
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
相关资源
最近更新 更多