下载管理器双重下载

6
我有以下问题:每次使用DownloadManager下载文件时,文件都会下载两次(以“文件名.扩展名”和“文件名-1.扩展名”的方式保存)。这是我的代码:
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 在回调方法上显示一个小的 Toast 消息。我对我的应用程序进行了调试,确保 download() 方法只被调用一次。希望您能帮助我找到错误。


这种情况在所有设备上都发生吗?你是在真实设备上测试还是在模拟器上测试? - Ovidiu Latcu
我正在模拟器上进行测试。不幸的是,我现在没有测试真实设备的可能性。 - BananaBuster
我认为这可能是问题所在... - Ovidiu Latcu
所以你的意思是说代码本身在真实设备上可以正常运行?如果是这样,我会尽快在真实设备上测试它。 - BananaBuster
2
是的,这可能是问题所在。我曾经遇到过类似的问题,只有在模拟器上才能重现,而在真实设备上却可以正常工作。 - Ovidiu Latcu
我在真实设备上测试了它,就像你所说的那样,在那里运行良好。感谢您的支持。 - BananaBuster
2个回答

2

0

我在使用API 21的移动设备上遇到了同样的错误,我已经想出了一个解决方法,在创建请求之前进行验证,如果用于设置请求目标的文件名与最后下载的文件之一相等,或者是任何先前下载的文件名的子字符串,则进行验证。

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"为要下载的文件名,您需要填入您的文件名和扩展名

PS: 对于 Kotlin 代码表示抱歉,但它应该是解决方法的良好表示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接