转自:http://www.myexception.cn/web/445840.html
WebView控制调用相应的WEB页面进行展示。当碰到页面有下载链接的时候,点击上去是一点反应都没有的。原来是因为WebView默认没有开启文件下载的功能,如果要实现文件下载的功能,需要设置WebView的DownloadListener,通过实现自己的DownloadListener来实现文件的下载。具体操作如下:
1、设置WebView的DownloadListener:
webView.setDownloadListener(new MyWebViewDownLoadListener());
2、实现MyWebViewDownLoadListener这个类,具体可以如下这样:
private class MyWebViewDownLoadListener implements DownloadListener{ @Override public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) { Log.i("tag", "url="+url); Log.i("tag", "userAgent="+userAgent); Log.i("tag", "contentDisposition="+contentDisposition); Log.i("tag", "mimetype="+mimetype); Log.i("tag", "contentLength="+contentLength); Uri uri = Uri.parse(url); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); } }
这只是调用系统中已经内置的浏览器进行下载,还没有WebView本身进行的文件下载,不过,这也基本上满足我们的应用场景了。
我在项目中的运用
项目要求这样:
1,需要使用WebView加载一个网页;
2,网页中有文件下载的链接,点击后需要下载文件到SDcard;
3,然后自动打开文件;
下面是具体解决办法
第一步,对WebView进行一系列设置。
WebView webview=(WebView)layout.findViewById(R.id.webview); webview.getSettings().setJavaScriptEnabled(true); webview.setWebChromeClient(new MyWebChromeClient()); webview.requestFocus(); // webview.loadUrl("file:///android_asset/risktest.html"); webview.loadUrl(jcrs_sub.get(position).addr); // 设置web视图客户端 webview.setWebViewClient(new MyWebViewClient()); webview.setDownloadListener(new MyWebViewDownLoadListener()); //内部类 public class MyWebViewClient extends WebViewClient { // 如果页面中链接,如果希望点击链接继续在当前browser中响应, // 而不是新开Android的系统browser中响应该链接,必须覆盖 webview的WebViewClient对象。 public boolean shouldOverviewUrlLoading(WebView view, String url) { L.i("shouldOverviewUrlLoading"); view.loadUrl(url); return true; } public void onPageStarted(WebView view, String url, Bitmap favicon) { L.i("onPageStarted"); showProgress(); } public void onPageFinished(WebView view, String url) { L.i("onPageFinished"); closeProgress(); } public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { L.i("onReceivedError"); closeProgress(); } } // 如果不做任何处理,浏览网页,点击系统“Back”键,整个Browser会调用finish()而结束自身, // 如果希望浏览的网 页回退而不是推出浏览器,需要在当前Activity中处理并消费掉该Back事件。 public boolean onKeyDown(int keyCode, KeyEvent event) { // if((keyCode==KeyEvent.KEYCODE_BACK)&&webview.canGoBack()){ // webview.goBack(); // return true; // } return false; }
第二步,起线程开始下载文件。
//内部类 private class MyWebViewDownLoadListener implements DownloadListener { @Override public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) { if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ Toast t=Toast.makeText(mContext, "需要SD卡。", Toast.LENGTH_LONG); t.setGravity(Gravity.CENTER, 0, 0); t.show(); return; } DownloaderTask task=new DownloaderTask(); task.execute(url); } } //内部类 private class DownloaderTask extends AsyncTask<String, Void, String> { public DownloaderTask() { } @Override protected String doInBackground(String... params) { // TODO Auto-generated method stub String url=params[0]; // Log.i("tag", "url="+url); String fileName=url.substring(url.lastIndexOf("/")+1); fileName=URLDecoder.decode(fileName); Log.i("tag", "fileName="+fileName); File directory=Environment.getExternalStorageDirectory(); File file=new File(directory,fileName); if(file.exists()){ Log.i("tag", "The file has already exists."); return fileName; } try { HttpClient client = new DefaultHttpClient(); // client.getParams().setIntParameter("http.socket.timeout",3000);//设置超时 HttpGet get = new HttpGet(url); HttpResponse response = client.execute(get); if(HttpStatus.SC_OK==response.getStatusLine().getStatusCode()){ HttpEntity entity = response.getEntity(); InputStream input = entity.getContent(); writeToSDCard(fileName,input); input.close(); // entity.consumeContent(); return fileName; }else{ return null; } } catch (Exception e) { e.printStackTrace(); return null; } } @Override protected void onCancelled() { // TODO Auto-generated method stub super.onCancelled(); } @Override protected void onPostExecute(String result) { // TODO Auto-generated method stub super.onPostExecute(result); closeProgressDialog(); if(result==null){ Toast t=Toast.makeText(mContext, "连接错误!请稍后再试!", Toast.LENGTH_LONG); t.setGravity(Gravity.CENTER, 0, 0); t.show(); return; } Toast t=Toast.makeText(mContext, "已保存到SD卡。", Toast.LENGTH_LONG); t.setGravity(Gravity.CENTER, 0, 0); t.show(); File directory=Environment.getExternalStorageDirectory(); File file=new File(directory,result); Log.i("tag", "Path="+file.getAbsolutePath()); Intent intent = getFileIntent(file); startActivity(intent); } @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); showProgressDialog(); } @Override protected void onProgressUpdate(Void... values) { // TODO Auto-generated method stub super.onProgressUpdate(values); } }
第三步,实现一些工具方法。
private ProgressDialog mDialog; private void showProgressDialog(){ if(mDialog==null){ mDialog = new ProgressDialog(mContext); mDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);//设置风格为圆形进度条 mDialog.setMessage("正在加载 ,请等待..."); mDialog.setIndeterminate(false);//设置进度条是否为不明确 mDialog.setCancelable(true);//设置进度条是否可以按退回键取消 mDialog.setCanceledOnTouchOutside(false); mDialog.setOnDismissListener(new OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { // TODO Auto-generated method stub mDialog=null; } }); mDialog.show(); } } private void closeProgressDialog(){ if(mDialog!=null){ mDialog.dismiss(); mDialog=null; } } public Intent getFileIntent(File file){ // Uri uri = Uri.parse("http://m.ql18.com.cn/hpf10/1.pdf"); Uri uri = Uri.fromFile(file); String type = getMIMEType(file); Log.i("tag", "type="+type); Intent intent = new Intent("android.intent.action.VIEW"); intent.addCategory("android.intent.category.DEFAULT"); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setDataAndType(uri, type); return intent; } public void writeToSDCard(String fileName,InputStream input){ if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ File directory=Environment.getExternalStorageDirectory(); File file=new File(directory,fileName); // if(file.exists()){ // Log.i("tag", "The file has already exists."); // return; // } try { FileOutputStream fos = new FileOutputStream(file); byte[] b = new byte[2048]; int j = 0; while ((j = input.read(b)) != -1) { fos.write(b, 0, j); } fos.flush(); fos.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }else{ Log.i("tag", "NO SDCard."); } } private String getMIMEType(File f){ String type=""; String fName=f.getName(); /* 取得扩展名 */ String end=fName.substring(fName.lastIndexOf(".")+1,fName.length()).toLowerCase(); /* 依扩展名的类型决定MimeType */ if(end.equals("pdf")){ type = "application/pdf";// } else if(end.equals("m4a")||end.equals("mp3")||end.equals("mid")|| end.equals("xmf")||end.equals("ogg")||end.equals("wav")){ type = "audio/*"; } else if(end.equals("3gp")||end.equals("mp4")){ type = "video/*"; } else if(end.equals("jpg")||end.equals("gif")||end.equals("png")|| end.equals("jpeg")||end.equals("bmp")){ type = "image/*"; } else if(end.equals("apk")){ /* android.permission.INSTALL_PACKAGES */ type = "application/vnd.android.package-archive"; } // else if(end.equals("pptx")||end.equals("ppt")){ // type = "application/vnd.ms-powerpoint"; // }else if(end.equals("docx")||end.equals("doc")){ // type = "application/vnd.ms-word"; // }else if(end.equals("xlsx")||end.equals("xls")){ // type = "application/vnd.ms-excel"; // } else{ // /*如果无法直接打开,就跳出软件列表给用户选择 */ type="*/*"; } return type; }
over.
Android 之 远程图片获取和本地缓存
http://blog.csdn.net/xieqibao/article/details/6682128
Android应用自动更新功能的代码实现
http://blog.csdn.net/coolszy/article/details/7518345
Android实战技巧:多线程AsyncTask
http://blog.csdn.net/hitlion2008/article/details/7560878
Android实战技巧:消息循环与Looper
http://blog.csdn.net/hitlion2008/article/details/7561190
相关推荐
本文实例为大家分享了WebView实现文件下载功能的具体代码,供大家参考,具体内容如下 本节引言 本节给大家介绍的是WebView下载文件的知识点,当我们在使用普通浏览器的时候,比如UC, 当我们点击到一个可供下载链接...
本文实例讲述了Android编程使用WebView实现文件下载功能的两种方法。分享给大家供大家参考,具体如下: 在应用中,通常会使用到文件下载功能,一般我们都是写一个下载操作工具类,在异步任务中执行下载功能。 今天...
主要为大家详细介绍了Android WebView实现文件下载功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Android 基于x5Webview 浏览文件 office文档 已测试Android11 功能实现
在安卓开发过程中,会出现对接H5需要拍照及选择本地图片上传的需求。这个功能的实现需要调用安卓的相关操作,然后将获取到的图片路径传给H5。
用html写图片上传功能,在移动端点击选择文件没有效果,需要在WebChromeClient中增加openFileChooser方法.
用于实现WebView页面中的文件下载功能。
上传图片-通过webview实现选择和拍照向.net服务端上传图片.zip,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
如果需要在 App 里面内嵌 H5 页面,那么 H5 与 App 之间可以通过 Webview 的 PostMessage 功能实现实时的通讯,但是在小程序里面,虽然也提供了一个 webview 组件,但是,在进行 postMessage 通讯时,官方文档里面给...
uniapp实现上传文件功能,uniapp实现上传文件功能uniapp实现上传文件功能uniapp实现上传文件功能uniapp实现上传文件功能uniapp实现上传文件功能
h5中调用手机选择文件图片的代码是: *" capture="camera" id="imgFile" name="imgFile" type="file"> 用安卓的 webView 控件来显示h5网页 然后给webView 设置WebChromeClient WebChromeClient 主要处理解析,渲染...
WebView是Android中一个非常实用的组件,它和Safai、Chrome一样都是基于Webkit网页渲染引擎,可以通过加载HTML数据的方式便捷地展现软件的界面,下面通过本文给大家介绍Webview实现android简单的浏览器实例代码。...
功能是android webview 嵌入HTML5的页面,页面中有一个标签,iOS直接就支持,但android中不支持,网上的帖子说是因为android屏蔽了文件上传功能还是怎么的,没看明白,但是重写WebViewClient,WebChromeClient这两个...
目前小程序没有能实现此功能的 API 所以我这里通过使用 web-view 实现; 实现流程: 1. 在小程序后台配置业务域名 2. 在服务器写一个html,实现表单上传文件 3.后端php接收文件并存到一个服务器文件夹,把文件名存到...
主要介绍了Android编程实现使用webView打开本地html文件的方法,结合实例形式分析了Android中webview布局及打开HTML文件的功能实现技巧,需要的朋友可以参考下
在小程序的webview里实现微信支付功能。因为微信不允许在小程序的webview里直接调起微信支付。所以我们这节课就要涉及到小程序和webview的交互了。 老规矩先看效果。 因为这里涉及的东西比较多,录gif太多,没法...
安卓预览Office文档,TBS+AgentWeb+pdfjs(需后端配合)+系统能力