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 ...

Jay Mayu
quelle
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

user370305
quelle
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 :)

Sai Z.
quelle
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();
}});
Kulasekar
quelle
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);        

    }
George Mavrogenis
quelle