Скачать файл в Webview

Я использую веб-просмотр в приложении для Android. Я пытаюсь загрузить файл .pdf, однако при переходе по ссылке через приложение имя файла .pdf изменяется на "1rcPnhg9_rSes92BiQPotVjXuEAfFnyrf.pdf" и не сохраняется с исходным именем файла.

Как заставить веб-просмотр сохранить файл с оригинальным именем? На данный момент веб-просмотр сохраняет файл, используя идентификатор в качестве имени.

Используемая ссылка:https://drive.google.com/uc?export=download&id=1rcPnhg9_rSes92BiQPotVjXuEAfFnyrf

Веб-просмотр:

webView.setDownloadListener(new DownloadListener()
        {
            @Override
            public void onDownloadStart(String url, String userAgent,
                                        String contentDisposition, String mimeType,
                                        long contentLength) {
                DownloadManager.Request request = new DownloadManager.Request(
                        Uri.parse(url));
                request.setMimeType(mimeType);
                String cookies = CookieManager.getInstance().getCookie(url);
                request.addRequestHeader("cookie", cookies);
                request.addRequestHeader("User-Agent", userAgent);
                request.setDescription("Downloading File...");
                request.setTitle(URLUtil.guessFileName(url, contentDisposition, mimeType));
                request.allowScanningByMediaScanner();
                request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                request.setDestinationInExternalPublicDir(
                        Environment.DIRECTORY_DOWNLOADS, URLUtil.guessFileName(
                                url, contentDisposition, mimeType));
                DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
                dm.enqueue(request);
                Toast.makeText(getApplicationContext(), "Downloading File", Toast.LENGTH_LONG).show();
            }});

Разрешения в манифесте:

<uses-permission android:name = "android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name = "android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name = "android.permission.INTERNET" />
<uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name = "android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
<uses-permission android:name = "android.permission.ACCESS_DOWNLOAD_MANAGER"/>

URLUtil.guessFileName не запрашивает у документа имя файла, а пытается угадать имя файла только по URL-адресу. Если имя нужного файла отсутствует в URL-адресе, оно туда не попадет. Вам нужно будет указать имя файла из другого места.

drdaanger 15.03.2022 16:59
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
75
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Возможность использования DownloadManager

Для этого вы должны добавить событие onNavigating в свой WebView. Если пользователь нацелен на файл PDF, вы можете остановить процесс загрузки с помощью: ags.Cancel = true И этот момент, когда вы можете передать URL-адрес DownloadManager, который загрузит ваш файл.

Я понимаю, но как я мог поместить это в код? Извините, если это кажется слишком очевидным, я новичок в студии Android.

Maria Fernanda 15.03.2022 16:25

Я написал новый ответ с образцом

Seng Phrakonkham 15.03.2022 16:45

Спасибо за помощь :D

Maria Fernanda 15.03.2022 17:25

Вот простой код

webView.webViewClient = object : WebViewClient() {
        override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
            if (url.contains(".pdf")){
                downloadFile(url)
            }
            return false
        }
    }

    fun downloadFile(url: String) {
    Log.d(TAG, "downloadFile: url = $url")
    val manager = getSystemService(Activity.DOWNLOAD_SERVICE) as DownloadManager
    val uri =
        Uri.parse(url)
    val request = DownloadManager.Request(uri)
    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
    val reference: Long = manager.enqueue(request)
}
Ответ принят как подходящий

Вот тест с вашей ссылкой (на Котлине). Если вам нужен пример Java, пожалуйста, дайте мне знать:

private fun test() {
    webView = findViewById(R.id.webView)

    webView.webViewClient = object : WebViewClient() {
        override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
            Log.d(TAG, "shouldOverrideUrlLoading:url = ${url}")
            if (url.contains("=download")){
                Log.d(TAG, "shouldOverrideUrlLoading: ")
                downloadFile(url)
                webView.stopLoading()
            }
            return true
        }
    }
    val url = "https://drive.google.com/uc?export=download&id=1rcPnhg9_rSes92BiQPotVjXuEAfFnyrf"
    webView.loadUrl(url)
}

fun downloadFile(url: String) {
    Log.d(TAG, "downloadFile: url = $url")
    val manager = getSystemService(Activity.DOWNLOAD_SERVICE) as DownloadManager
    val uri =
        Uri.parse(url)
    val request = DownloadManager.Request(uri)
    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
    val reference: Long = manager.enqueue(request)
}

изображение о загрузке

Java-код:

    private void test() {

    webView = findViewById(R.id.webView);

    webView.setWebViewClient(new WebViewClient(){
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (url.contains("=download")){
                downloadFile(url);
            }

            return super.shouldOverrideUrlLoading(view, url);
        }
    });

    String url = "https://drive.google.com/uc?export=download&id=1rcPnhg9_rSes92BiQPotVjXuEAfFnyrf";
    webView.loadUrl(url);
}

private void downloadFile(String url) {
    DownloadManager manager = (DownloadManager) getSystemService(Activity.DOWNLOAD_SERVICE);
    Uri uri = Uri.parse(url);
    DownloadManager.Request request = new DownloadManager.Request(uri);
    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
    manager.enqueue(request);
}

Оооо волшебство! :D Я пытаюсь написать то же самое на Java, но пока не получается, не могли бы вы мне помочь?

Maria Fernanda 15.03.2022 17:24

Я пишу код Java. Что ты видишь? Ошибка или что-то другое?

Seng Phrakonkham 15.03.2022 17:29

Я сделал java-код. Я изменил свой ответ с ним

Seng Phrakonkham 15.03.2022 17:40

Появляется, не может разрешить символ забавы

Maria Fernanda 15.03.2022 17:40

Который из? В чем проблема?

Seng Phrakonkham 15.03.2022 17:41

Возможно, вам следует использовать функцию «Invalidate Caches» из меню «Файл» в Android Studio.

Seng Phrakonkham 15.03.2022 17:47

Ооо, это сработало как по волшебству. Большое спасибо за помощь и обучение. :D

Maria Fernanda 15.03.2022 19:06

добро пожаловать :)

Seng Phrakonkham 15.03.2022 21:36

Другие вопросы по теме