9

I want to download the file (such as .mp3) from the website by using webview but the problem is Whenever I tap on the link, it will open the browser (Default one) Which is appear for a sec before It close. and no file were downloaded.

Here's my code,

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.webkit.WebChromeClient;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.DownloadListener;
import android.widget.Button;
import android.widget.TextView;

public class Main extends Activity {
WebView webview;
Button bt_search;
TextView txt_search;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    webview = (WebView) findViewById(R.id.webView);
    webview.setWebChromeClient(new WebChromeClient());
    webview.getSettings().setJavaScriptEnabled(true);
    webview.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);
        }
    });
    txt_search = (TextView) findViewById(R.id.song);
    webview.loadUrl("http://www.google.com");
    bt_search = (Button) findViewById(R.id.findit);
    bt_search.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            String keyword = txt_search.getText().toString().trim();
            if (!keyword.equals("")) {
                webview.loadUrl("MP3 Sites" + keyword + ".html");
     }
    }
});
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

    }
Cœur
  • 37,241
  • 25
  • 195
  • 267
  • You may also use this `Webview` subclass where file downloads are handled automatically: https://github.com/delight-im/Android-AdvancedWebView – caw Jan 08 '15 at 01:52

2 Answers2

10

Implement a WebViewClient to use with your WebView. In it, override the shouldOverrideUrlLoading method, where you should check if it's an mp3 file, and then pass that URL to the DownloadManager or whatever you're using to actually download the file. Here's a rough idea:

    // This will handle downloading. It requires Gingerbread, though
    final DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);

    // This is where downloaded files will be written, using the package name isn't required
    // but it's a good way to communicate who owns the directory
    final File destinationDir = new File (Environment.getExternalStorageDirectory(), getPackageName());
    if (!destinationDir.exists()) {
        destinationDir.mkdir(); // Don't forget to make the directory if it's not there
    }
    webView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading (WebView view, String url) {
            boolean shouldOverride = false;
            // We only want to handle requests for mp3 files, everything else the webview
            // can handle normally
            if (url.endsWith(".mp3")) {
                shouldOverride = true;
                Uri source = Uri.parse(url);

                // Make a new request pointing to the mp3 url
                DownloadManager.Request request = new DownloadManager.Request(source);
                // Use the same file name for the destination
                File destinationFile = new File (destinationDir, source.getLastPathSegment());
                request.setDestinationUri(Uri.fromFile(destinationFile));
                // Add it to the manager
                manager.enqueue(request);
            }
            return shouldOverride;
        }
    });
Krylez
  • 17,414
  • 4
  • 32
  • 41
  • Thank you so much for the answer, But If you mind, Please give me an example of that method. I'm literally newbie in Java. – Gleich Zi Libertia Jun 14 '13 at 15:22
  • 1
    @Krylez it's downloding file but i have one issue that in my testpdf.php contain pdf file and when i runt url like http://www.tttt.co/testpdf.php file then it's not download pdf file but it download testpdf.php file so cany help me i want to download pdf file – CoronaPintu Oct 03 '13 at 08:59
3
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);        

    }