Android -- WebView 支持文件下载的几种方式

1. 前言

最近在做 Android 混合项目的开发,涉及到 WebView 控件的文件下载功能,这里总结一下。

Android 中 Webview 控件默认是不支持文件下载的,需要设置其属性才支持。Webview 实现下载的方式主要有三种:

  1. 跳转到浏览器下载
  2. 使用系统的下载服务
  3. 自定义下载

本人能想到的只有三种,如有遗漏,还请赐教~~

记得添加 网络权限&文件读取权限,此处忽略不计,不懂请自行百度

2. WebView 设置下载监听器

Webview 默认是不支持文件下载的,需要给其设置下载监听器setDownloadListener

webView.setDownloadListener(new DownloadListener() {
   
      @Override
      public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
   
          //处理下载事件
      }
});
  • DownloadListener 里面只有一个方法 onDownloadStart,具体的参数含义可查看源码,里面注释的很详细。
  • 下载的URL 通过onDownloadStart方法参数传递,可以在这里处理下载事件。
  • 每当有文件需要下载时,该方法就会被回调。

3. WebView 下载文件

3.1 跳转到浏览器下载

这种方式最为简单粗暴,直接把下载任务抛给浏览器,剩下的就不用我们管了。

private void downloadByBrowser(String url) {
   
     Intent intent = new Intent(Intent.ACTION_VIEW);
     intent.addCategory(Intent.CATEGORY_BROWSABLE);
     intent.setData(Uri.parse(url));
     startActivity(intent);
}

缺点:
无法感知下载完成,所以就没有后续的处理,如 apk 下载完成后打开安装界面、文件下载完后打开文件 等。

3.2 使用系统的下载服务

DownloadManager 是系统提供的用于处理下载的服务,使用者只需提供 下载 URI 和 存储路径,并进行简单的设置。

DownloadManager 会在后台进行下载,并且在下载失败、网络切换以及系统重启后尝试重新下载。

添加下载任务:

/**
 * 使用系统的下载服务
 *
 * @param url                下载地址
 * @param contentDisposition attachment;filename=测试专用.wps;filename*=utf-8''测试专用.wps
 * @param mimeType           application/octet-stream
 */
private void downloadBySystem(String url, String contentDisposition, String mimeType) {
   
    LogUtil.d(TAG, "downloadBySystem:url=" + url + ",contentDisposition="
                + contentDisposition + ",mimeType=" + mimeType);
   // 指定下载地址
    DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
    // 允许媒体扫描,根据下载的文件类型被加入相册、音乐等媒体库
    request.allowScanningByMediaScanner();
    // 设置通知的显示类型,下载进行时和完成后显示通知
    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
    // 设置通知栏的标题,如果不设置,默认使用文件名
    // request.setTitle("This is title");
    // 设置通知栏的描述
    // request.setDescription("This is description");
    // 允许在计费流量下下载
    request.setAllowedOverMetered(false);
    // 允许该记录在下载管理界面可见
    request.setVisibleInDownloadsUi(false);
    // 允许漫游时下载
    request.setAllowedOverRoaming(true);
    // 允许下载的网路类型
    request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);
    // 设置下载文件保存的路径和文件名
    String fileName = URLUtil.guessFileName(url, contentDisposition, mimeType);
    LogUtil.d(TAG, "fileName:" + fileName);

    //storage/emulated/0/Android/data/项目名/files
	// request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName);
	// request.setDestinationInExternalPublicDir(ConstantPath.getCommonPath(mContext), fileName);

    //Android/data/项目名/files/storage/emulated/0/Android/data/项目名/files
	// request.setDestinationInExternalFilesDir(this, ConstantPath.getCommonPath(mContext), fileName);

    //另外可选一下方法,自定义下载路径
    Uri mDestinationUri = Uri.withAppendedPath(Uri.fromFile(
            new File(ConstantPath.getRootPath(ConstantPath.ANDROIDMOBILE))), fileName);
	// Uri mDestinationUri = Uri.withAppendedPath(Uri.fromFile(
	//                new File(ConstantPath.getCommonPath(mContext))), fileName);
    request.setDestinationUri(mDestinationUri);

    final DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
    // 添加一个下载任务
    long downloadId = downloadManager.enqueue(request);
    LogUtil.d(TAG, "downloadId:" + downloadId);
}

怎么知道文件下载成功呢?

系统在下载完成后会发送一条广播,里面有任务 ID,告诉调用者任务完成,通过 DownloadManager 获取到文件信息就可以进一步处理。

接收系统下载完成发出的广播:

private class DownloadCompleteReceiver extends BroadcastReceiver {
   
    @Override
     public void onReceive(Context context, Intent intent) {
   
         LogUtil.d(TAG + ",onReceive. intent:{}", intent != null ? intent.toUri(0) : null);
         if (intent != null) {
   
             if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.
  • 9
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Android WebView 中,AppCache(Application Cache)是一种用于离线应用的缓存机制,它允许网页应用在离线状态下加载和使用资源。AppCache 使用一个描述文件(通常是 `manifest.appcache`)来指定要缓存的文件列表。 当 WebView 加载包含 AppCache 的网页时,它会解析 manifest.appcache 文件,并按照其中指定的文件列表下载和缓存相关资源。manifest.appcache 文件是一个简单的文本文件,其内容由以下几个部分组成: 1. CACHE MANIFEST:指示这是一个 AppCache 文件。 2. CACHE:列出需要缓存的文件列表。每行表示一个文件的路径,可以是相对路径或绝对路径。这些文件将被下载并存储在本地缓存中。 3. NETWORK:列出不会被缓存的文件列表。这些文件将始终从网络加载。 4. FALLBACK:指定离线状态下的备用资源。当某个文件无法从缓存中加载时,会尝试从 FALLBACK 中指定的资源进行替代。 示例 manifest.appcache 文件内容如下: ``` CACHE MANIFEST # Version: 1.0.0 CACHE: index.html styles.css script.js NETWORK: api.example.com FALLBACK: offline.html /offline.html ``` 上述示例中,index.html、styles.css 和 script.js 会被缓存,api.example.com 不会被缓存(每次都从网络加载),而 offline.html 将作为离线状态下的替代资源。 需要注意的是,AppCache 在 Android 4.4(KitKat)之后被废弃,推荐使用 Service Worker 和其他离线技术来替代。因此,在开发新的应用时,建议考虑使用更现代的离线方案。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值