Завантажте файл всередині WebView


79

У моєму додатку Android є веб-перегляд. Коли користувач переходить до веб-перегляду та натискає посилання для завантаження файлу, нічого не відбувається.

URL = "my url";
mWebView = (WebView) findViewById(R.id.webview);
mWebView.setWebViewClient(new HelloWebViewClient());
mWebView.getSettings().setDefaultZoom(ZoomDensity.FAR);
mWebView.loadUrl(URL);
Log.v("TheURL", URL);

Як увімкнути завантаження всередині веб-перегляду? Якщо я вимкнув веб-перегляд і ввімкнув намір завантажувати URL-адресу в браузер із програми, тоді завантаження працює безперешкодно.

String url = "my url";
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);

Хтось може мені допомогти? Сторінка завантажується без проблем, але посилання на файл зображення на сторінці HTML не працює ...


Ви можете використовувати цей Webviewпідклас, який автоматично обробляє завантаження тощо: github.com/delight-im/Android-AdvancedWebView
caw

Відповіді:


112

Ти намагався?

mWebView.setDownloadListener(new DownloadListener() {
    public void onDownloadStart(String url, String userAgent,
                String contentDisposition, String mimetype,
                long contentLength) {
        Intent i = new Intent(Intent.ACTION_VIEW);
        i.setData(Uri.parse(url));
        startActivity(i);
    }
});

Приклад посилання: Завантаження файлу веб-перегляду - Дякую @ c49


Цей код працює, але якщо користувач пройшов автентифікацію в WebView, його просять ввійти ще раз після запуску браузера Android, після чого відбувається завантаження. Я намагаюся знайти спосіб уникнути цього, тому завантаження відбувається без необхідності входити знову.
CloudMeta

Спробуйте це посилання для будь-якого завантаження androidtrainningcenter.blogspot.in/2013/11/…
Tofeeq Ahmad

@ioSamurai Чи знайшли ви спосіб завантаження файлів, для яких потрібна автентифікація користувача. webView.setDownloadListener()відмінно працює, коли не потрібна авторизація користувача. Але коли я завантажую файл із диска Google або з інших джерел, що вимагає автентифікації користувача, файл завантажується, але даних немає. @ user370305 ви також можете допомогти.
Sp4Rx

Ви можете перевірити власні вкладки Chrome, які вирішать більшість проблем. @Rohit
Sp4Rx


56

Спробуйте це. Переглянувши багато публікацій та форумів, я знайшов це.

mWebView.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.allowScanningByMediaScanner();
            request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); //Notify client once download is completed!
            request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "Name of your downloadble file goes here, example: Mathematics II ");
            DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
            dm.enqueue(request);
            Toast.makeText(getApplicationContext(), "Downloading File", //To notify the Client that the file is being downloaded
                    Toast.LENGTH_LONG).show();

        }
    });

Не забудьте дати цей дозвіл! Це дуже важливо! Додайте це у свій файл Manifest (файл AndroidManifest.xml)

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />        <!-- for your file, say a pdf to work -->

Сподіваюся, це допомагає. На ура :)


11
Дякуємо, це спрацювало !, за використання оригінального імені файлу ми можемо використовувати:final String filename= URLUtil.guessFileName(url, contentDisposition, mimetype);
Jawaad

9
@SaiZ ваш приклад містить код про невикористаний намір, я думаю, вам слід його видалити.
jc

@jc я видалив невикористаний код, дякую за повідомлення;)
MatPag

2
Це ідеальна відповідь, що це запустить завантаження безпосередньо з веб-перегляду, що насправді очікується ... Дякую
Ghanshyam Bagul

@Jawaad ​​Не могли б ви пояснити, куди мені покласти цей рідний код Android? Я працюю з Xamarin.forms, який компілюється на рідну мову, і я зазвичай не наважуюся торкатися рідного коду, але тут це обов’язково . TYIA.
s3c

20
    mwebView.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();
}});

поясніть, будь ласка, що ви написали. просто коду недостатньо
Савен

1
Встановлення файлів cookie врятувало мені день! Дякую!
francisco_ssb

це повинна бути прийнята відповідь, працює. спасибі друже
Сурья Reddy

Я завантажую документ із Digi-locker за допомогою веб-перегляду, але завантаження не вдається, використовуючи той самий фрагмент коду. формат файлу - pdf. хто-небудь може мені допомогти.
Ashish Patel

15

Спробуйте скористатися менеджером завантажень, який допоможе завантажити все, що завгодно, і заощадить ваш час.

Перевірте їх до опцій:

Варіант 1 ->

 mWebView.setDownloadListener(new DownloadListener() {
        public void onDownloadStart(String url, String userAgent,
                String contentDisposition, String mimetype,
                long contentLength) {
 Request request = new Request(
                            Uri.parse(url));
                    request.allowScanningByMediaScanner();
                    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                    request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "download"); 
                    DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
                    dm.enqueue(request);        

        }
    });

Варіант 2 ->

if(mWebview.getUrl().contains(".mp3") {
 Request request = new Request(
                        Uri.parse(url));
                request.allowScanningByMediaScanner();
                request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "download"); 
// You can change the name of the downloads, by changing "download" to everything you want, such as the mWebview title...
                DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
                dm.enqueue(request);        

    }

1

Якщо ви не хочете використовувати менеджер завантажень, ви можете використовувати цей код

webView.setDownloadListener(new DownloadListener() {

            @Override
            public void onDownloadStart(String url, String userAgent, String contentDisposition
                    , String mimetype, long contentLength) {

                String fileName = URLUtil.guessFileName(url, contentDisposition, mimetype);

                try {
                    String address = Environment.getExternalStorageDirectory().getAbsolutePath() + "/"
                            + Environment.DIRECTORY_DOWNLOADS + "/" +
                            fileName;
                    File file = new File(address);
                    boolean a = file.createNewFile();

                    URL link = new URL(url);
                    downloadFile(link, address);

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

 public void downloadFile(URL url, String outputFileName) throws IOException {

        try (InputStream in = url.openStream();
             ReadableByteChannel rbc = Channels.newChannel(in);
             FileOutputStream fos = new FileOutputStream(outputFileName)) {
            fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
        }
           // do your work here

    }

Це призведе до завантаження файлів у папку завантажень у сховищі телефону. Ви можете використовувати потоки, якщо хочете завантажити їх у фоновому режимі (використовуйте thread.alive () і клас таймера, щоб знати, чи завантаження завершено чи ні). Це корисно, коли ми завантажуємо невеликі файли, оскільки ви можете виконати наступне завдання відразу після завантаження.


0
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();
            }});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.