webview下载操作的踩坑记录

背景记录

由于公司需要, 需要在在webview中执行下载操作, 而且下载完成之后还需要跳转到自动安装页面~~~~
接下来就是踩坑报告

1.webview执行下载操作

思路

经过查找资料发现webview有三种下载方式

  • 1,跳转到浏览器进行下载
  • 2,使用系统服务进行下载
  • 3,自定义下载任务进行下载

发现跳转到浏览器进行下载最简单,但是做完之后领导说这样不行,要在咱们app内部进行下载.于是就开始进行修改~~~~

在余下的两种方法中进行选择,发现还是使用系统服务进行下载比较简单
于是就开始调试

实现

根据看api和在网上查找资料之后发现webview有一个下载的监听

webView.setDownloadListener(new DownloadListener() {@Overridepublic void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {});
  • onDownloadStart参数
  • url 访问的下载链接
  • userAgent HTTP请求头部用来标识客户端信息的字符串
  • contentDisposition 保存文件提供一个默认的文件名
  • mimetype 资源的媒体类型
  • contentLength 资源的大小

不在多说,直接贴下载代码

webView.setDownloadListener(new DownloadListener() {@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)@Overridepublic void onDownloadStart(final String url, String userAgent, final String contentDisposition, final String mimetype, long contentLength) {/**android6.0之上需要适配动态权限获取6.0之下则不需要进行适配别忘了在AndroidManifest.xml中配置网络权限和外置存储读写权限这个地方我没有进行适配,如果直接复制的话需要自己手动添加权限获取
*/// 指定下载地址DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));// 允许媒体扫描,根据下载的文件类型被加入相册、音乐等媒体库request.allowScanningByMediaScanner();// 设置通知的显示类型,下载进行时和完成后显示通知request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);// 允许在计费流量下下载request.setAllowedOverMetered(false);// 允许该记录在下载管理界面可见request.setVisibleInDownloadsUi(true);// 允许漫游时下载request.setAllowedOverRoaming(true);// 允许下载的网路类型request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);// 设置下载文件保存的路径和文件名String fileName  = URLUtil.guessFileName(url, contentDisposition, mimetype);request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName);
//              另外可选一下方法,自定义下载路径
//              request.setDestinationUri()
//              request.setDestinationInExternalFilesDir()final DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);// 添加一个下载任务long downloadId = downloadManager.enqueue(request);}});

就这样就完成了在webview中实现下载

在这算是下载实现完成

下载完成之后自动安装

系统下载服务,在下载完成之后会发送一条广播,在广播中会有任务ID
我们就可以通过DownloadManager获取到具体的文件信息,进行apk的安装处理.

废话不多说直接上代码

我这里是新建Receiver进行监听,具体实现安装任务
也可以使用内部类的方法进行实现

public class DownloadReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {if (intent != null) {if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(intent.getAction())) {//获取downloadIdlong downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
//                Log.e("downloadId:{}", downloadId+"<><>");
//              获取下载管理器,文件的具体信息都在这个里面DownloadManager downloadManager = (DownloadManager) context.getSystemService(DOWNLOAD_SERVICE);//获取typeString type = downloadManager.getMimeTypeForDownloadedFile(downloadId);
//                Log.e("eForDownloadedFile:{}", type);if (TextUtils.isEmpty(type)) {type = "*/*";}//获取文件uri//android7获取的是content格式//android7之下获取的file:///格式Uri uri = downloadManager.getUriForDownloadedFile(downloadId);Log.e("UriForDownloadedFile:{}", uri.toString());if (uri != null) {//8.0之前适用//Intent handlerIntent = new Intent(Intent.ACTION_VIEW);//8.0之后适用,向下兼容Intent handlerIntent = new Intent(Intent.ACTION_INSTALL_PACKAGE);//适配android7之上的版本//如果不做适配则不会进行自动安装//需要对文件所对应的uri进行临时授权//如果低于android7的话则不用进行if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // 适配Android 7系统版本handlerIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件}handlerIntent.setDataAndType(uri, type);handlerIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(handlerIntent);}}}}
}

代码片段中注释很详细这就不进行详细介绍

需要的权限

android6之后需要动态获取权限,否则活报错

<!--读取写入权限--><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><!--android7之后安装文件权限--><uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>

provider处理

需要在res文件下新建xml文件夹,在xml文件夹下新建file_paths.xml
有其他的需要可以在进行添加

 <external-pathname="files_root"path="Android/data/" /><external-files-path name="external_files_path" path="Download" />

在AndroidManifest.xml中添加代码

<application......><providerandroid:name="android.support.v4.content.FileProvider"android:authorities="${applicationId}.fileprovider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths" /></provider></application>

到此坑踩了不少,中间也填了一些,如果还有什么bug发现的朋友们可以提出来看,一块进行修改

webview进行下载踩坑记录相关推荐

  1. OPPO WebView白屏踩坑记录

    排除Android原生错误:搜索日志Uncaught SyntaxError 出现Uncaught SyntaxError: Unexpected token - js 的错误,是前端js报错,可能是 ...

  2. linux命令行下载cuda,linux 命令行下安装特定版本的 cuda (踩坑记录)

    其实可直接看第 4 步的总结...... 实验室服务器 Ubuntu 16.04 系统下原本安装的 cuda 版本是 9.0,硬件条件是一张 1080 Ti 的 GPU,在使用 PyTorch 的过程 ...

  3. 为Jupyter notebook配置R kernel过程及踩坑记录

    为Jupyter notebook配置R kernel过程及踩坑记录 注意:本文为作者安装过程及折腾的过程,内容比较冗杂,如果读者想直接创建一个属于自己的子环境则参考: 如下文章: anaconda下 ...

  4. Python打包工具Pyintealler打包py文件为windows exe文件过程及踩坑记录+实战例子

    Python打包工具Pyintealler打包py文件为windows exe文件过程及踩坑记录+实战例子 目录 Python打包工具Pyintealler打包py文件为windows exe文件过程 ...

  5. TVM: Deep Learning模型的优化编译器(强烈推荐, 附踩坑记录)

    本文作者是阿莱克西斯,原载于知乎,雷锋网(公众号:雷锋网)获得授权转载. (前排提醒,本文的人文内容部分稍稍带有艺术加工,请保持一定的幽默感进行阅读) 关注我最近想法的同学应该知道我最近都在把玩 TV ...

  6. osx php7 imagick,[PHP] MacOS 自带php环境安装imagick扩展踩坑记录 | 码农部落

    前言 最近学习yii2,在搭建环境后,发现在访问contact页面时报错,如下: "Either GD PHP extension with FreeType support or Imag ...

  7. 【踩坑记录】Tensorflow在Windows下使用

    [踩坑记录]Tensorflow在Windows下使用 TensorFlow 是一个端到端开源机器学习平台 安装 pip3 install tensorflow 使用时报错如下 2021-04-21 ...

  8. Detectron2 win10踩坑记录

    Detectron2 win10踩坑记录 安装CUDA clone到本地 修改cocoeval.cpp第483行(不同版本行数不一样) 创建虚拟环境 安装pycocotools 安装VS2019或者生 ...

  9. sonar覆盖率怎么统计的_实战|Java 测试覆盖率 Jacoco插桩的不同形式总结和踩坑记录(上)...

    本文为霍格沃兹测试学院优秀学员关于 Jacoco 的小结和踩坑记录.测试开发进阶学习,文末加群. 一.概述 测试覆盖率是老生常谈的话题.因为我测试理论基础不是很好,这里就不提需求.覆盖率等内容,直奔主 ...

最新文章

  1. PCA(主成分分析)+LDA(线性判别分析)+区别
  2. 除了数据,生活中还有这些......
  3. python【力扣LeetCode算法题库】169 多数元素
  4. 迷宫收集星星 并查集解答
  5. 交换机配置软件_如何配置远程登陆交换机?最简单的解释方式,一看就懂
  6. CSS hr修改样式
  7. Swift中文教程(一)基础数据类型
  8. 学习MySQL,怎么能不会数据类型和schema优化!
  9. 腾讯竟然是这样存储你的数据的!!!
  10. Leetcode-213:打家劫舍 II
  11. 【网络文件共享】04、rsync基础
  12. 复杂网络代码_据报道称“浏览器内核有上千万行代码”,浏览器内核真的很复杂吗?...
  13. 拓端tecdat|R语言分布滞后线性和非线性模型(DLNM)分析空气污染(臭氧)、温度对死亡率时间序列数据的影响
  14. Markdown latex语法合集
  15. cnpm下载依赖包速度快的原理探究
  16. Java——Session使用
  17. Vue框架学习笔记一
  18. 5个APP自动化测试辅助定位工具,你用过几个?
  19. 第3章第1节:使用图片来活跃整张幻灯片版面的气氛 [PowerPoint精美幻灯片实战教程]
  20. 一起享受这场长沙互联网的饕餮盛宴

热门文章

  1. 全志科技A40i国产开发板——性能参数综合测试
  2. 通过API Key免登录访问Grafana
  3. Cocos Creator 基于 Spine 动画的 AVATAR 换装系统优化
  4. 迅雷 9 php,迅雷thunder://地址与普通url地址转换php
  5. 今日杂感-20220322
  6. 自动化测试处理textarea文本框
  7. 下载支付宝秘钥生成工具
  8. sdiv和srem问题解决
  9. 2021中国开源码力榜启动,寻找开源世界的超级玛丽
  10. 简单的实现app界面劫持和后台监控