Загрузка файла в Android WebView (без события загрузки или HTTPClient в коде) - PullRequest
2 голосов
/ 07 декабря 2011

Это скорее вопрос из любопытства, чем реальная проблема, которую нужно решить.Я сделал приложение для Android, которое содержит WebView.Я использовал метод URL override URL, чтобы в WebView была открыта любая нажатая ссылка.

Позже я решил, что файл будет загружен с сервера на пользовательское устройство.К сожалению, я раньше не видел метод setDownloadListener.Когда пользователь щелкает ссылку сейчас, загрузка не начинается.

Насколько я могу судить, мне нужно обновить приложение соответствующим кодом, например, прослушивателем загрузки или HttpClient, что нормально.

(рискуя казаться идиотом) Мне интересно, есть ли способ через действие с сервера, чтобы я мог заставить WebView загрузить файл без изменения кода?Я предполагаю, что функциональность отсутствует в WebView, поэтому, вероятно, WebView открывает браузер для загрузки файла.Просто подумал, может быть, я что-то упустил, чтобы заставить это работать.Я довольно новичок в этом.

Ответы [ 2 ]

3 голосов
/ 17 октября 2013

Вы должны иметь возможность запустить загрузку с DownloadManager в Android через веб-просмотр JavascripInterface.Я пытаюсь сделать это сам, но пока безуспешно.У меня, вероятно, есть проблемы с контекстом, в котором работают webview и DownloadManager.Я вернусь с некоторым кодом, если он будет работать :)

ОБНОВЛЕНИЕ:

Следующий код работает очень хорошо для меня.Вы можете использовать что-то вроде: (просто остерегайтесь, вы можете использовать только DownloadManager из Android 2.3 +)

myWebView.setWebViewClient(new WebViewClient() {
        @Override
        public void onReceivedError(WebView view, int errorCode,
            String description, String failingUrl) {
                Log.d("WEB_VIEW_TEST", "error code:" + errorCode + " - " + description);
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
                // handle different requests for different type of files
                // this example handles downloads requests for .apk and .mp3 files
                // everything else the webview can handle normally
                if (url.endsWith(".apk")) {
                    Uri source = Uri.parse(url);
                    // Make a new request pointing to the .apk url
                    DownloadManager.Request request = new DownloadManager.Request(source);
                    // appears the same in Notification bar while downloading
                    request.setDescription("Description for the DownloadManager Bar");
                    request.setTitle("YourApp.apk");
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                        request.allowScanningByMediaScanner();
                        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                    }
                    // save the file in the "Downloads" folder of SDCARD
                    request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "SmartPigs.apk");
                    // get download service and enqueue file
                    DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
                    manager.enqueue(request);
                }
                else if(url.endsWith(".mp3")) {
                    // if the link points to an .mp3 resource do something else
                }
                // if there is a link to anything else than .apk or .mp3 load the URL in the webview
                else view.loadUrl(url);
                return true;                
        }
    });

В приведенном выше коде я управляю ссылками на файлы .apk, файлы .mp3 и все остальныеобрабатывается веб-представлением (обычные HTML-страницы)

1 голос
/ 10 декабря 2011

Я думаю, что webview загрузит и отобразит только текстовое / html-содержимое и мультимедийные элементы. А остальное будет перенаправлено на клиент загрузки, который вы видите.

  • Herojit
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...