У меня есть проблема, похожая на вашу.Проблема здесь в том, как WebView обрабатывает вложения (настоящая боль в заднице).Когда WebView посещает веб-страницу, которая в какой-то момент возвращает вложение, он говорит что-то вроде: «О, дерьмо, что я могу сделать с этой не-HTML штукой? ... Эй, вы! DownloadListener!какая-то ерунда о вложении ".Итак, DownloadListener вступает во владение, и здесь возникает проблема: он снова запрашивает тот же URL-адрес для загрузки вложения, поэтому для загрузки вложения при посещении страницы WebView выполняет 2 запроса: сама страница, а затем еще один, чтобы загрузитьвложение, а не просто скачать его.
А как это проблема?Хорошо, допустим, что в вашем abc.com/xyz.php есть какая-то логика вроде:
<?php
if(User::loggedIn()) {
header("Content-Disposition: attachment...");
//Some more logic for the download
}
?>
Второй запрос, выполняемый DownloadListener, сделает еще один запрос к abc.com/xyz.php, но этоесли он не будет содержать файлы cookie или информацию о сеансе, поэтому он не будет входить в логику загрузки.
Возможным решением будет перенаправление во временную копию или реальный путь к файлу, который не содержитсодержит любую логику, поэтому нет проблем.Конечно, вам также нужно определить прослушиватель Download с помощью WebView, например, вот так.
webView.setDownloadListener(new DownloadListener() {
@Override
public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimeType, long contentLength) {
final DownloadManager dm = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
Request request = new DownloadManager.Request(Uri.parse(url));
request.setMimeType(mimeType);
//Persist download notification in the status bar after the download completes (Android 3.0+)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
request.allowScanningByMediaScanner();
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
}
dm.enqueue(request);
}
});