我如何使用webview下载文件? (这种情况很奇怪)

我想使用webview从网站下载文件(如.mp3),但问题是每当我点击链接,它会打开浏览器(默认之一),这是在一秒之前它出现closures。 没有下载文件。

这是我的代码,

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

Solutions Collecting From Web of "我如何使用webview下载文件? (这种情况很奇怪)"

实现一个WebViewClient与您的WebView一起使用。 在这里,重写shouldOverrideUrlLoading方法,在这里你应该检查它是否是一个mp3文件,然后将该URL传递给DownloadManager或者用于实际下载文件的任何内容。 这里有一个大概的想法:

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