Datei in WebView herunterladen


78

Ich habe eine Webansicht in meiner Android-Anwendung. Wenn der Benutzer zur Webansicht geht und auf einen Link klickt, um eine Datei herunterzuladen, geschieht nichts.

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);

Wie aktiviere ich den Download in einer Webansicht? Wenn ich die Webansicht deaktiviere und die Absicht aktiviere, die URL aus der Anwendung in den Browser zu laden, funktioniert der Download nahtlos.

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

Kann mir hier jemand helfen? Die Seite wird ohne Probleme geladen, aber der Link zu einer Bilddatei auf der HTML-Seite funktioniert nicht ...


Sie können diese WebviewUnterklasse verwenden, die Downloads usw. automatisch verarbeitet: github.com/delight-im/Android-AdvancedWebView
caw

Antworten:


110

Hast du es versucht?

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);
    }
});

Beispiellink: Download der Webview-Datei - Danke @ c49


Dieser Code funktioniert, aber wenn der Benutzer in WebView authentifiziert wurde, wird er aufgefordert, sich nach dem Start des Android-Browsers erneut anzumelden. Danach erfolgt der Download. Ich versuche einen Weg zu finden, dies zu vermeiden, sodass der Download erfolgt, ohne dass sie sich erneut anmelden müssen.
CloudMeta

Versuchen Sie diesen Link für jede Art von Download androidtrainningcenter.blogspot.in/2013/11/…
Tofeeq Ahmad

@ioSamurai Haben Sie eine Möglichkeit gefunden, Dateien herunterzuladen, für die eine Benutzerauthentifizierung erforderlich ist? webView.setDownloadListener()funktioniert einwandfrei, wenn keine Benutzerauthentifizierung erforderlich ist. Wenn ich jedoch eine Datei von Google Drive oder anderen Quellen herunterlade, für die eine Benutzerauthentifizierung erforderlich ist, wird eine Datei heruntergeladen, es sind jedoch keine Daten vorhanden. @ user370305 können Sie auch helfen.
Sp4Rx

Sie können die benutzerdefinierten Chrome-Registerkarten überprüfen , um die meisten Probleme zu lösen. @ Rhit
Sp4Rx


54

Probieren Sie es aus. Nachdem ich viele Beiträge und Foren durchgesehen hatte, fand ich dies.

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();

        }
    });

Vergessen Sie nicht, diese Erlaubnis zu geben! Dies ist sehr wichtig! Fügen Sie dies in Ihre Manifest-Datei ein (Die Datei AndroidManifest.xml).

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

Hoffe das hilft. Prost :)


11
Danke, es hat funktioniert!, Für die Verwendung des ursprünglichen Dateinamens können wir verwenden:final String filename= URLUtil.guessFileName(url, contentDisposition, mimetype);
Jawaad

9
@SaiZ Ihr Beispiel enthält Code über eine nicht verwendete Absicht. Ich denke, Sie sollten ihn entfernen.
JC

@jc Ich habe den nicht verwendeten Code entfernt, danke für die Meldung;)
MatPag

2
Dies ist die perfekte Antwort, um den Download direkt aus der Webansicht zu starten, was tatsächlich erwartet wird ... Danke
Ghanshyam Bagul

@Jawaad ​​Könnten Sie bitte erklären, wo ich diesen nativen Android-Code ablegen soll? Ich arbeite mit Xamarin.forms, das zu nativ kompiliert wird, und ich wage es normalerweise nicht, nativen Code zu berühren, aber hier ist es ein Muss . TYIA.
s3c

18
    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();
}});

Bitte erklären Sie, was Sie geschrieben haben. Nur Code ist nicht genug
Saveen

Das Setzen von Cookies hat mir den Tag gerettet! Vielen Dank!
francisco_ssb

Diese Antwort sollte akzeptiert werden, funktioniert. Danke Kumpel
Surya Reddy

Ich lade ein Dokument von Digi-locker über die Webansicht herunter, aber der Download mit demselben Code-Snippet ist nicht erfolgreich. Das Dateiformat ist pdf. kann mir jemand helfen.
Ashish Patel

15

Versuchen Sie es mit dem Download-Manager, mit dem Sie alles herunterladen können, was Sie möchten, und sparen Sie Zeit.

Überprüfen Sie diese auf Optionen:

Option 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);        

        }
    });

Option 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);        

    }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.