最近在做一个较简单的项目:通过一个webview来显示一个网页的App

  这个网页有下载的功能,关于这一功能需要用到两个知识点:

  1、webview监听网页的下载链接。(webview默认情况下是没有开启,在这个情况下,你会发现,在浏览器上可以正常下载的网页里的某个点击。在你的webview里面,点击是没有反应的);

  2、使用系统的DownloadManager进行下载。

提前说下,在这两个小知识点遇到的坑:

  1、第一个坑,就是前面说的,需要Webview开启下载监听,否则,你会发现,点击下载,没有反应。

  

extends Activity implements DownloadListener //这里某个类实现这个下载监听
@Override
public void onDownloadStart(String url, String userAgent,
String contentDisposition, String mimetype, long contentLength) {
startDownload(url);
}

  2、第二个坑,已经开启下载监听,但是依旧点击没有反应。并且,这个网站在pc浏览器上,点击相应的下载链接,能够下载。这会儿就陷入巨坑,紧接着要抓狂了。不断的查看是不是自己少写了什么。不过包括看了API也就这两行代码。最后在Android的浏览器上面发现也不能够下载,这会儿我就理直气壮得找网页开发端,告诉他们,你们的网页不能够下载。他们的解决办法就是将这个下载链接新开一个页签。结果神奇得可以了。安卓浏览器能够正常得下载网页相应的链接,我的webview也就能够监听到网页下载点击事件。

  能够监听到下载点击事件,那么接下来就是使用这个监听到的url进行下载。起初我想到的是像远程更新APP一样的方案:通过一个IO,将文件下载到指定的文件路径,然后通过Intent进行安装。显然这样可以,不过过于麻烦,因为系统提供了DownloadManager比较简单。代码如下:

  

private void startDownload(String url) {
dm = (DownloadManager) this.getSystemService(Context.DOWNLOAD_SERVICE);
DownloadManager.Request request = new DownloadManager.Request(
Uri.parse(url));
request.setMimeType("application/vnd.android.package-archive");
request.setVisibleInDownloadsUi(true);
request.setDestinationInExternalFilesDir(this,
Environment.DIRECTORY_DOWNLOADS, "fileName");
enqueue = dm.enqueue(request);
}

  3、第三个坑就是,插入了这段代码后,貌似可以下载了。为什么说貌似呢,因为手机顶部已经能够看到这个下载的标志,但是没有多久就消失了。并且下拉看不到已下载的项目,此时,就无从点击安装下载的app。经过抓狂,以及最后的沉着冷静,最后发现,只要添加上一段代码就可以了。

private void startDownload(String url) {
dm = (DownloadManager) this.getSystemService(Context.DOWNLOAD_SERVICE);
DownloadManager.Request request = new DownloadManager.Request(
Uri.parse(url));
request.setMimeType("application/vnd.android.package-archive");
request.setVisibleInDownloadsUi(true);
request.setDestinationInExternalFilesDir(this,
Environment.DIRECTORY_DOWNLOADS,"fileName");
    //添加下面这段代码    //添加下面这段代码
    request.setNotificationVisibility(Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
     enqueue = dm.enqueue(request); }

此时就能够在下拉,看到所下载的项目,点击,对下载的app进行安装。

至此实现了:

  1、webview监听网页的下载链接。

  2、使用系统的DownloadManager进行下载。

WebView使用_WebView监听网页下载_DownloadManager使用的更多相关文章

  1. plus webview关闭事件监听

    plus.webview.currentWebview().addEventListener("close",function(){ },false);

  2. js监听网页页面滑动滚动事件,实现导航栏自动显示或隐藏

    /** * 页面滑动滚动事件 * @param e *///0为隐藏,1为显示var s = 1;function scrollFunc(e) { // e存在就用e不存在就用windon.event ...

  3. webview长按事件js监听

    做app开发时,用到了webview,需要监听webview的长按事件,使用原生的js处理监听如下: ; //定时器 //开始按 function gtouchstart() { timeOutEve ...

  4. iOS-WKWebview 带有进度条加载的ViewController【KVO监听Webview加载进度】

    前言 为什么要说 WKWebview,在之前做电子书笔记时已经提过 WKWebview 在iOS8之后已完全替代 Webview,原因就不多说了,主要还是内存过大: 封装 封装一个基于 UIViewC ...

  5. WebView使用详解(二)——WebViewClient与常用事件监听

      登录|注册     关闭 启舰 当乌龟有了梦想……       目录视图 摘要视图 订阅 异步赠书:Kotlin领衔10本好书      免费直播:AI时代,机器学习如何入门?      程序员8 ...

  6. 背水一战 Windows 10 (66) - 控件(WebView): 监听和处理 WebView 的事件

    [源码下载] 背水一战 Windows 10 (66) - 控件(WebView): 监听和处理 WebView 的事件 作者:webabcd 介绍背水一战 Windows 10 之 控件(WebVi ...

  7. 从网页监听Android设备的返回键

    最近搞Android项目的时候,遇到一个比较蛋疼的需求,需要从Client App调用系统浏览器打开一个页面,进行杂七杂八的一些交互之后,返回到App.如何打开浏览器和如何返回App这里就不说了,有兴 ...

  8. Android监听WebView滑动到底部

    MainActivity如下: package cn.testwebview; import android.app.Activity; import android.graphics.Bitmap; ...

  9. 微信浏览器返回刷新,监听微信浏览器返回事件,网页防复制,移动端禁止图片长按和vivo手机点击img标签放大图片

    以下代码都经过iphone7,华为MT7 ,谷歌浏览器,微信开发者工具,PC端微信验证.如有bug,还请在评论区留言. demo链接:https://pan.baidu.com/s/1c35mbjM ...

随机推荐

  1. Django的rest_framework认证组件之全局设置源码解析

    前言: 在我的上一篇博客我介绍了一下单独为某条url设置认证,但是如果我们想对所有的url设置认证,该怎么做呢?我们这篇博客就是给大家介绍一下在Rest_framework中如何实现全局的设置认证组件 ...

  2. EntityFramework 基础提供程序在 Open 上失败

    最近项目开始上线,所以抽时间学习了一下EF.虽然项目中一直在用,但是因为一些原因,一直是知其然不知其所以然,紧紧只限于会用而已.这两天自己搭建了一个MVC的EF框架,虽然也有参考网上各种资料,但是依然 ...

  3. 写jsp文件时需要注意的一些小细节

    ①jsp文件的最开始的部分: <%@ page language="java" contentType="text/html; charset=UTF-8" ...

  4. 48- java Arrays.sort和collections.sort()再次总结

    今天又碰到一个新BUG,记下来. 一直报空指针异常,我就很奇怪了,怎么就空指针了呢,我输出时,也能输出东西呀. 原来Arrays.sort() 和 Collections.sort() 都是对整个数组 ...

  5. setsockopt设置socket状态

    setsockopt设置socket状态 1.closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:BOOL bReuseaddr=TRUE;setsoc ...

  6. Delphi过程和函数中变量的作用域

    变量的作用域是指变量能被某一子程序识别的范围. 全局变量和局部变量.全局变量是指在程序的type区定义的变量,而局部变量是在过程或函数的定义部分声明的变量.全局变量在整个程序中都有意义,局部变量只在它 ...

  7. web服务器原理(作业四)

      Web服务器简介:Web服务器是指驻留于因特网上某种类型计算机的程序.当web浏览器(客户端)连到服务器上并请求文件时,服务器将处理该请求并将文件发送到该浏览器上,附带的信息会告诉浏览器如何查看该 ...

  8. gdb调试多进程多线程程序

    一.调试的指令 1.list命令 list linenum 显示程序第linenum行的周围的程序 list function 显示程序名为function的函数的源程序 list 显示当前行后面的源 ...

  9. zookeeper配置文件共享中心

    最近频繁的系统上线,每次打包都要把配置文件替换为正式环境的配置文件,虽然说就是复制粘贴的事,架不住文件杂乱,而且多. 期初的想法是有没有办法将配置文件与系统隔离开来,这样在更新时候,就只需要更新代码部 ...

  10. Android开发 - 设置DialogFragment全屏显示

    默认的DialogFragment并不是全屏,但有些需求需要我们将对话框设置为全屏(内容全屏),Android并没有提供直接的API,通过其它不同的方法设置全屏在不同的机型上总有一些诡异的问题,经过测 ...