web-dev-qa-db-ja.com

ダウンロードしたファイルは自動的に削除されます

私のアプリでは、ユーザーがダウンロードできるファイルがいくつかあります。ファイルはダウンロードされます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);
9
Sagar

私もこの問題に遭遇しました。 DownloadIdleServiceのソースを見ると、ダウンロードがUIに表示されないように設定されている場合、「古くなった」と見なされて7日後に削除されるようです。これがjavadoc from DownloadIdleServiceです。

/**
 * 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#11

7
user3209486

答えとしては、コメントとしては大きすぎます。

しばらくの間ファイルが見つからない、または削除される理由はまだわかりません。これは少し奇妙です。しかし、私は同じようなことをしなければならず、このようなことを経験したことはありません。だから私はその場合に私がしたことを共有するかもしれませんが。

ダウンロードしたファイルは、外部ストレージに保存するのではなく、アプリケーションが保持する内部ストレージに保存することを好みました。たとえば、ダウンロードしたファイルを保存するために使用したファイルパスは次のようなものです...

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

したがって、あなたの場合、ダウンロードされたファイルが利用できないために、[ダウンロード]ボタンが表示されないことは問題ではないと思います。メディアスキャナーがファイルシステムでもファイルを見つけられなかった場合にも発生する可能性があります。だから、あなたはそれを試してみることを検討するかもしれません。

クリーンマスターまたはそのようないくつかのソフトウェアが時々ジャンクファイルをクリーンアップするかどうかはわかりませんが、それらが外部ストレージにあるかどうかはわかりません。あなたもそれらを調査することを検討するかもしれません。

1
Reaz Murshed

Android Qで始まる大きな問題があり、ここで setVisibleInDownloadsUi によって設定された値は無視され、デフォルトではfalseです。ファイルは1週間後に削除されます。次の方法でテストします。ファイルをダウンロードし、カレンダーの日付を2か月ずつ変更します。これをターミナルで呼び出します。

adb Shell cmd jobscheduler run -f com.Android.providers.downloads -100

DownloadIdleService からジョブを開始します。ここでは、古くて禁止されているファイルが削除されます。 LogManager(フィルターを設定しない)で、DownloadManagerがファイルを削除しようとしていることがわかります。

それを防ぐには、次のことができます。

  • Environment#getExternalStoragePublicDirectory(String) with Environment#DIRECTORY_DOWNLOADS)にファイルをダウンロードします-これは、Android Q表示されているため、削除しないでください
  • ダウンロード後にファイル名を変更する(たとえば、DownloadedReceiver内)
0