WebView setDownloadListener() 下载文件
使用 Android 自带的浏览器,当点击到一个可供下载链接的时候,就会进行下载,WebView 作为一个浏览器般的组件,当然也是支持下载
但本章节我们讨论的深入一点,除了下载外,还设置下载后的文件放哪,以什么文件名 保存,当然也可以调用其它内置的浏览器来进行下载
当单击一个下载链接要让 WebView
当作文件下载简单,就是调用 setDownloadListener()
方法设置下载监听器,然后重写 onDownloadStart()
方法
WebView 调用其它浏览器下载文件
- 为 WebView 设置
setDownloadListener
- 然后重写 DownloadListener 的
onDownloadStart()
方法 - 在方法里里面实现 Intent,调用
startActivity()
对应的Activity
如果手机存在多个浏览器的话,会打开一个对话框供用户选择其中一个浏览器进行下载
-
创建一个 空的 Android 项目
cn.twle.android.WebViewDownload
-
修改
AndroidManifest.xml
添加网络权限<uses-permission android:name="android.permission.INTERNET" />
-
修改
activity_main.xml
添加一个WebView
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:padding="5dp" android:layout_width="match_parent" android:layout_height="match_parent"> <WebView android:id="@+id/ms_webview" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout>
-
修改
MainActivity.java
package cn.twle.android.webviewdownload; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.webkit.DownloadListener; import android.webkit.WebView; public class MainActivity extends AppCompatActivity { private WebView ms_webview; private static final String SITE_URL = "https://www.twle.cn/static/i/android/demo_c.html"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ms_webview = (WebView) findViewById(R.id.ms_webview); ms_webview.loadUrl(SITE_URL); ms_webview.setDownloadListener(new DownloadListener(){ @Override public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) { Uri uri = Uri.parse(url); Intent intent = new Intent(Intent.ACTION_VIEW,uri); startActivity(intent); } }); } }
自己写线程下载文件
调用其它浏览器下载文件只会将文件存放到指定目录,如果我们想放到其它的目录,或者想自定义文件名等,则可以自己实现一个线程来下载文件
-
创建一个 空的 Android 项目
cn.twle.android.WebViewDownCustom
-
修改
AndroidManifest.xml
添加网络权限<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
-
修改
activity_main.xml
添加一个WebView
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:padding="5dp" android:layout_width="match_parent" android:layout_height="match_parent"> <WebView android:id="@+id/ms_webview" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout>
-
创建一个下载的 Task
DownLoadThread.java
package cn.twle.android.webviewdowncustom; import android.os.Environment; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; public class DownLoadThread implements Runnable { private String dlUrl; public DownLoadThread(String dlUrl) { this.dlUrl = dlUrl; } @Override public void run() { InputStream in = null; FileOutputStream fout = null; try { URL httpUrl = new URL(dlUrl); HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection(); conn.setDoInput(true); in = conn.getInputStream(); File downloadFile, sdFile; if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { downloadFile = Environment.getExternalStorageDirectory(); sdFile = new File(downloadFile, "memei_1.zip"); fout = new FileOutputStream(sdFile); }else{ } byte[] buffer = new byte[1024]; int len; while ((len = in.read(buffer)) != -1) { fout.write(buffer, 0, len); } } catch (Exception e) { e.printStackTrace(); } finally { if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } if (fout != null) { try { fout.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
-
修改
MainActivity.java
package cn.twle.android.webviewdowncustom; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.webkit.DownloadListener; import android.webkit.WebView; import android.webkit.WebViewClient; public class MainActivity extends AppCompatActivity { private WebView ms_webview; private static final String SITE_URL = "https://www.twle.cn/static/i/android/demo_d.html"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ms_webview = (WebView) findViewById(R.id.ms_webview); ms_webview.loadUrl(SITE_URL); ms_webview.setWebViewClient(new WebViewClient() { //设置在 WebView 点击打开的新网页在当前界面显示,而不跳转到新的浏览器中 @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } }); ms_webview.setDownloadListener(new DownloadListener(){ @Override public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) { new Thread(new DownLoadThread(url)).start(); } }); } }