Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I download the file by using webview? (this case is weird)

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

    }
like image 942
Gleich Zi Libertia Avatar asked Jun 13 '13 18:06

Gleich Zi Libertia


2 Answers

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;
        }
    });
like image 153
Krylez Avatar answered Oct 17 '22 01:10

Krylez


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

    }
like image 36
George Mavrogenis Avatar answered Oct 17 '22 01:10

George Mavrogenis