WebView下载文件并显示进度

1.activity

package com.sam.more.activitys.webview;

import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.webkit.DownloadListener;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.EditText;

import com.sam.more.R;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;

public class WebViewDownloadActivity extends AppCompatActivity implements DownloadCallback {

    @BindView(R.id.webv_download)
    WebView webvDownload;
    @BindView(R.id.et_url)
    EditText etUrl;
    @BindView(R.id.btn_download)
    Button btnDownload;

    Context context;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web_view_download);
        ButterKnife.bind(this);
        context = this;
        initView();
    }

    private void initView() {
        webvDownload.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
        });

        webvDownload.setDownloadListener(new DownloadListener() {
            @Override
            public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
                new Thread(new DownLoadThread(url, WebViewDownloadActivity.this)).start();
            }
        });
    }

    @OnClick({R.id.btn_download})
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_download:
                webvDownload.loadUrl(etUrl.getText().toString().trim());
                break;
        }
    }

    @Override
    public void percentage(final String percentage) {
        Message message = new Message();
        message.obj = percentage;
        mHandler.sendMessage(message);
    }

    private Handler mHandler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message message) {
            if (message.obj.toString().equals("100%")) {
                btnDownload.setText("下载完成");
                mHandler.removeCallbacksAndMessages(null);
                return false;
            }
            btnDownload.setText(message.obj.toString());
            return true;
        }
    });
}

2.layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".activitys.webview.WebViewDownloadActivity">

    <EditText
        android:id="@+id/et_url"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="http://csdn-app.csdn.net/csdn.apk" />

    <Button
        android:id="@+id/btn_download"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="下载" />

    <WebView
        android:id="@+id/webv_download"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

3.thread

package com.sam.more.activitys.webview;

import android.os.Environment;
import android.util.Log;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.DecimalFormat;

/**
 * Author: Sam
 * Date: 2021-03-13 11:32
 * Description:
 */

public class DownLoadThread implements Runnable {

    private String dlUrl;
    private DownloadCallback callback;

    DownLoadThread(String dlUrl, DownloadCallback callback) {
        this.dlUrl = dlUrl;
        this.callback = callback;
    }

    @Override
    public void run() {
        InputStream in = null;
        FileOutputStream fout = null;
        int contentLength, downedFileLength = 0;//文件总大小,已下载大小
        DecimalFormat df = new DecimalFormat("0%");
        try {
            URL httpUrl = new URL(dlUrl);
            HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();
            contentLength = conn.getContentLength();
            Log.e("文件总大小", contentLength + "");
            in = conn.getInputStream();
            File downloadFile, sdFile;
            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                Log.e("sam", "SD卡可写");
                downloadFile = Environment.getExternalStorageDirectory();
                sdFile = new File(downloadFile, "csdn_client.apk");
                fout = new FileOutputStream(sdFile);
            } else {
                Log.e("sam", "SD卡不存在或者不可读写");
            }
            byte[] buffer = new byte[1024];
            int len;
            while ((len = in.read(buffer)) != -1) {
                if (fout != null) {
                    fout.write(buffer, 0, len);
                    downedFileLength += len;
                    callback.percentage(df.format((float) downedFileLength / contentLength));
                }
            }
        } 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();
                }
            }
        }
    }
}

4.callback

package com.sam.more.activitys.webview;

/**
 * Author: Sam
 * Date: 2021-03-13 13:22
 * Description:
 */

public interface DownloadCallback {

    void percentage(String percentage);
}

到这就已经OK啦,如果对您有一点点帮助,还请给个赞,谢谢!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ASIHTTPRequest对CFNetwork API进行了封装,并且使用起来非常简单,用Objective-C编写,可以很好的应用在Mac OS X系统和iOS平台的应用程序中。ASIHTTPRequest适用于基本的HTTP请求,和基于REST的服务之间的交互。 ASIHTTPRequest功能很强大,主要特色如下: l 通过简单的接口,即可完成向服务端提交数据和从服务端获取数据的工作 l 下载的数据,可存储到内存中或直接存储到磁盘中 l 能上传本地文件到服务端 l 可以方便的访问和操作请求和返回的Http头信息 l 可以获取到上传或下载进度信息,为应用程序提供更好的体验 l 支持上传或下载队列,并且可获取队列的进度信息 l 支持基本、摘要和NTLM身份认证,在同一会话中授权凭证会自动维持,并且可以存储在Keychain(Mac和iOS操作系统的密码管理系统)中 l 支持Cookie l 当应用(iOS 4+)在后台运行时,请求可以继续运行 l 支持GZIP压缩数据 l 内置的ASIDownloadCache类,可以缓存请求返回的数据,这样即使没有网络也可以返回已经缓存的数据结果 l ASIWebPageRequest –可以下载完整的网页,包括包含的网页、样式表、脚本等资源文件,并显示在UIWebView /WebView中。任意大小的页面都可以无限期缓存,这样即使没有网络也可以离线浏览 l 支持客户端证书 l 支持通过代理发起Http请求 l 支持带宽限制。在iOS平台,可以根据当前网络情况来自动决定是否限制带宽,例如当使用WWAN(GPRS/Edge/3G)网络时限制,而当使用WIFI时不做任何限制 l 支持断点续传 l 支持同步和异步请求
Android 中,你可以通过使用 `WebChromeClient` 和 `ProgressBar` 实现 WebView 的加载进度条。这里是一个简单的示例: 1. 首先,在你的布局文件中添加一个 `ProgressBar` 组件: ```xml <ProgressBar android:id="@+id/progressBar" android:layout_width="match_parent" android:layout_height="wrap_content" android:indeterminate="false" android:max="100" android:progress="0" android:visibility="invisible" /> ``` 在这个示例中,我们设置了 `ProgressBar` 的最大值为 100,初始进度为 0,不显示动画,并且默认是不可见的。 2. 在你的 Activity 类中,设置 WebView 的 WebChromeClient,并实现 `onProgressChanged()` 方法来更新进度条的进度。 ```java WebView myWebView = findViewById(R.id.webview); ProgressBar progressBar = findViewById(R.id.progressBar); myWebView.setWebChromeClient(new WebChromeClient() { @Override public void onProgressChanged(WebView view, int newProgress) { super.onProgressChanged(view, newProgress); // 更新进度条的进度 progressBar.setProgress(newProgress); // 如果进度条已经满了,隐藏进度条 if (newProgress == 100) { progressBar.setVisibility(View.INVISIBLE); } else { progressBar.setVisibility(View.VISIBLE); } } }); myWebView.loadUrl("https://www.example.com"); ``` 在这个示例中,我们设置了 WebView 的 `WebChromeClient`,并重写了 `onProgressChanged()` 方法。在每次加载进度发生变化时,我们通过 `setProgress()` 方法更新进度条的进度,并根据进度是否为 100 来显示或隐藏进度条。 注意:如果你的应用程序使用了 Material Design,你可以使用 `ProgressBar` 的 `indeterminateDrawable` 属性来设置进度条的样式。你可以使用 `@drawable/progress_indeterminate_material` 来使用 Material Design 风格的进度条。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值