6

次の問題があります: DownloadManager でファイルをダウンロードするたびに、ファイルが 2 回ダウンロードされます (「filename.extension」と「filename-1.extension」の形式で保存されます)。これが私のコードです:

public void download() {
        Request request = new Request(Uri.parse(_wrapper.getURL()));
        request.setTitle(getFileName(_wrapper.getURL()));
        request.setVisibleInDownloadsUi(false);
        request.setDestinationInExternalFilesDir(_context, null, "/" + getFileName(_wrapper.getURL()));

        _downloadID = _downloadManager.enqueue(request);
    }



    public BroadcastReceiver getDownloadFinishedBroadcastReceiver() {
        BroadcastReceiver receiver = new BroadcastReceiver() {

            @Override
            public void onReceive(Context pContext, Intent pIntent) {
                String action = pIntent.getAction();
                if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
                    Query query = new Query();
                    query.setFilterById(_downloadID);
                    Cursor cursor = _downloadManager.query(query);
                    if (cursor.moveToFirst()) {
                        File file = new File(ScruloidConstants.APPLICATION_DIRECTORY);
                        int status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));
                        if (status == DownloadManager.STATUS_SUCCESSFUL) {
                            String path = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));
                            _wrapper.setFilePath(path);
                            _wrapper.setLastDownloaded(new Date());
                            if (_listener != null) {
                                _listener.onDownloadProjectTaskFinished(new TaskResult<ProjectWrapper>(_wrapper));
                            }
                        }
                        else if (status == DownloadManager.STATUS_FAILED) {
                            int reason = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_REASON));
                            DownloadFailedException ex = new DownloadFailedException(reason);
                            if (_listener != null) {
                                _listener.onDownloadProjectTaskFinished(new TaskResult<ProjectWrapper>(ex));
                            }
                        }
                    }
                }
            }
        };
        return receiver;
    }

ProjectWrapper _wrapperデータを保持する単純なクラスであり、そこではロジックは実行されません。_listenerコールバック メソッドに小さなトースト メッセージを表示するだけです。アプリをデバッグして、download()メソッドが 1 回だけ呼び出されるようにしました。エラーを見つけるのを手伝ってくれることを願っています。

4

2 に答える 2

2

残念ながら、DownloadManagerはバグが多く、すべてのデバイスで正しく機能するとは限りません。あなたの問題はここに報告されます:https ://code.google.com/p/android/issues/detail?id = 18462

于 2013-03-01T09:29:44.430 に答える
0

API 21 を搭載したモバイル デバイスでも同じエラーが発生しました。リクエストの送信先を設定するために使用されたファイル名が、既にダウンロードされた最後のファイルの 1 つと同じかどうか、またはそのダウンロードされたプレビューの部分文字列

if (!mLastMediaDownloadedId.any { it.contains(outputFile.name) }) {
                mLastMediaDownloadedId.add(outputFile.name)
                val url =
                    AppConstants.AWS_MEDIA_BUCKET_PATH + scoutObjectType.endPoint() + "$scoutObjectId.png"

                val request = DownloadManager.Request(Uri.parse(url))
                    .setDestinationUri(Uri.fromFile(outputFile))
                    .setTitle("Downlading media")
                    .setDescription("Downloading image medias")
                    .setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE)
                    .setAllowedOverRoaming(true)
                    .setAllowedOverMetered(true)

                val downloadId = it.enqueue(request)
                downloadIds.add(downloadId)
                downloadId
}

「outputFile」はダウンロードするファイル名自体です。この場合、これは「filename.extension」にする必要があります。

PS: Kotlin コードで申し訳ありませんが、回避策自体を適切に表現する必要があります。

于 2019-10-29T17:09:39.810 に答える