WebView setDownloadListener() 下载文件

使用 Android 自带的浏览器,当点击到一个可供下载链接的时候,就会进行下载,WebView 作为一个浏览器般的组件,当然也是支持下载

但本章节我们讨论的深入一点,除了下载外,还设置下载后的文件放哪,以什么文件名 保存,当然也可以调用其它内置的浏览器来进行下载

当单击一个下载链接要让 WebView 当作文件下载简单,就是调用 setDownloadListener() 方法设置下载监听器,然后重写 onDownloadStart() 方法

WebView 调用其它浏览器下载文件

  1. 为 WebView 设置 setDownloadListener
  2. 然后重写 DownloadListener 的 onDownloadStart() 方法
  3. 在方法里里面实现 Intent,调用 startActivity() 对应的 Activity

如果手机存在多个浏览器的话,会打开一个对话框供用户选择其中一个浏览器进行下载


  1. 创建一个 空的 Android 项目 cn.twle.android.WebViewDownload

  2. 修改 AndroidManifest.xml 添加网络权限

    <uses-permission android:name="android.permission.INTERNET" />
    
  3. 修改 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>
    
  4. 修改 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);
                }
            });
        }
    }
    

自己写线程下载文件

调用其它浏览器下载文件只会将文件存放到指定目录,如果我们想放到其它的目录,或者想自定义文件名等,则可以自己实现一个线程来下载文件


  1. 创建一个 空的 Android 项目 cn.twle.android.WebViewDownCustom

  2. 修改 AndroidManifest.xml 添加网络权限

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    
  3. 修改 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>
    
  4. 创建一个下载的 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();
                    }
                }
            }
        }
    }
    
  5. 修改 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();
                }
            });
        }
    }
    

Android 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.