使用DownloadManager类从WebView下载文件

点击webview上的链接,这是一个链接到文件的链接,在这种情况下是.mp4。 此代码将转到默认Web浏览器并请求可以查看此文件类型的应用程序。

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

我想要的是当我点击该文件链接时,它会创建一个对话框,要求天气下载或查看该文件。 如果单击下载,我想使用DownloadManager类来处理它并在后台下载该文件并在完成时发出警报。 如果点击查看,我想创建一个意图,要求可以查看此文件的应用程序,而无需访问Web浏览器。

  private class MyWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, final String url) { if (url.endsWith(".mp4")) { AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setMessage(R.string.dialog_title) .setCancelable(false) .setPositiveButton(R.string.dialog_download, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); request.setDescription("Some descrition"); request.setTitle("Some title"); // in order for this if to run, you must use the android 3.2 to compile your app request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "name-of-the-file.ext"); // get download service and enqueue file DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); manager.enqueue(request); } }) .setNegativeButton(R.string.dialog_play, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { WebView myWebView = (WebView) findViewById(R.id.webview); myWebView.setDownloadListener(new DownloadListener() { public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setDataAndType(Uri.parse(url), "video/mp4"); startActivity(intent); } }); } }); AlertDialog alert = builder.create(); alert.show(); } return false; } } 

现在我得到了这个代码,提示用户下载或播放用户点击的mp4文件。 但是,当我点击播放或下载它是有效的,直到我第二次点击链接,如果有人可以纠正这个问题,上面的代码有什么问题。 谢谢。

我是Android开发和java的新手,如果有人能指导我完成这项工作,它将帮助我更快地学习。 对我的英语也很抱歉……

您的问题的解决方案依赖于拦截您的webview尝试加载的URL。 创建WebViewClient并覆盖shouldOverrideUrlLoading方法:

 public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.endsWith(".mp3")) { //or whatever other extension //Prompt user for action (save or view) } return false; } 

然后,根据用户选择的内容,启动AsyncTask进行下载以处理下载文件,或启动查看意图。