很少去研究 Webview 的具体使用,之前在项目中遇到,通过点击 H5 中的按钮来进行下载 Apk 。刚收到这个需求想到的第一个想法就是调用 JS 来实现。之后实际运用前去看了看 WebView 的 API 发现了  WebView 下有一个 setDownloadListener 方法。它主要就是负责当你需要在使用 webview 时下载资源用的。具体的下载 APK 方法:

一个 Downloader 下载工具:

import android.app.DownloadManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.support.v4.content.FileProvider;
import android.widget.Toast;import java.io.File;/*** Created by 49829 on 2017/8/28.*/public class Downloader {//下载器private DownloadManager downloadManager;//上下文private Context mContext;//下载的IDprivate long downloadId;public Downloader(Context context) {this.mContext = context;}//下载apkpublic void downloadAPK(String url, String name) {//创建下载任务DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));//移动网络情况下是否允许漫游request.setAllowedOverRoaming(false);//在通知栏中显示,默认就是显示的request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);request.setTitle("雪豹外汇");request.setDescription("正在下载...");request.setVisibleInDownloadsUi(true);//设置下载的路径request.setDestinationInExternalPublicDir(Environment.getExternalStorageDirectory().getAbsolutePath(), name);//获取DownloadManagerdownloadManager = (DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE);//将下载请求加入下载队列,加入下载队列后会给该任务返回一个long型的id,通过该id可以取消任务,重启任务、获取下载的文件等等downloadId = downloadManager.enqueue(request);//注册广播接收者,监听下载状态mContext.registerReceiver(receiver,new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));}//广播监听下载的各个状态private BroadcastReceiver receiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {checkStatus();}};//检查下载状态private void checkStatus() {DownloadManager.Query query = new DownloadManager.Query();//通过下载的id查找query.setFilterById(downloadId);Cursor c = downloadManager.query(query);if (c.moveToFirst()) {int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));switch (status) {//下载暂停case DownloadManager.STATUS_PAUSED:break;//下载延迟case DownloadManager.STATUS_PENDING:break;//正在下载case DownloadManager.STATUS_RUNNING:break;//下载完成case DownloadManager.STATUS_SUCCESSFUL://下载完成安装APKinstallAPK();break;//下载失败case DownloadManager.STATUS_FAILED:Toast.makeText(mContext, "下载失败", Toast.LENGTH_SHORT).show();break;}}}//下载到本地后执行安装private void installAPK() {Intent intent = new Intent();File apkFile = queryDownloadedApk();Uri uri;if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//7.0启动姿势<pre name="code" class="html">    //com.xxx.xxx.fileprovider为上述manifest中provider所配置相同;apkFile为问题1中的外部存储apk文件</pre>uri = FileProvider.getUriForFile(mContext, "com.zz.fileprovider", apkFile);intent.setAction(Intent.ACTION_INSTALL_PACKAGE);intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//7.0以后,系统要求授予临时uri读取权限,安装完毕以后,系统会自动收回权限,次过程没有用户交互} else {//7.0以下启动姿势uri = Uri.fromFile(apkFile);intent.setAction(Intent.ACTION_VIEW);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);}intent.setDataAndType(uri, "application/vnd.android.package-archive");mContext.startActivity(intent);}public File queryDownloadedApk() {File targetApkFile = null;if (downloadId != -1) {DownloadManager.Query query = new DownloadManager.Query();query.setFilterById(downloadId);query.setFilterByStatus(DownloadManager.STATUS_SUCCESSFUL);Cursor cur = downloadManager.query(query);if (cur != null) {if (cur.moveToFirst()) {String uriString = cur.getString(cur.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));if (!uriString.isEmpty()) {targetApkFile = new File(Uri.parse(uriString).getPath());}}cur.close();}}return targetApkFile;}}

直接在 WebView  的下载监听中使用:

   webView.setDownloadListener(new DownloadListener() {@Overridepublic void onDownloadStart(final String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {runOnUiThread(new Runnable() {@Overridepublic void run() {//使用前先判断是否有读取、写入内存卡权限if (ContextCompat.checkSelfPermission(RechargeActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(RechargeActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_WRITE_EXTERNAL_STORAGE2);} else {downloadAPK.downloadAPK(url,"***.apk");//DownLoader 需要在oncreate 中初始化}}});}});

Android 通过 WebView 请求下载 APK相关推荐

  1. Android 利用系统下载管理器下载apk

    1.定义一个下载工具类 public class DownloadManagerUtil {private Context mContext;public DownloadManagerUtil(Co ...

  2. Android—在WebView中下载Blob协议文件

    之前有个需求是要下载Blob协议的gif,让我苦恼了好久.平时下载http协议的文件时直接获取输入流即可,但是Java无法获得Blob协议的文件流,无法直接处理.不过JavaScript处理Blob协 ...

  3. Android 拦截WebView请求,并加入或修改参数(GET)

    WebView提供了方法shouldInterceptRequest mWebView.setWebViewClient(new WebViewClient() {@Nullable@Override ...

  4. java 下载apk并安装-代码实例

    public class MainActivity extends Activity {private File apkFile;@Overrideprotected void onCreate(Bu ...

  5. Android开发之下载Apk安装的方法兼容Android7.0和8.0及以上

    具体查看代码: 首先在清单文件配置三个权限读写权限和请求安装权限(兼容Android8.0手机)如下: <!--安装apk权限--><uses-permission android: ...

  6. Android——下载apk文件,并在通知栏显示下载进度

    如何下载apk文件?这里介绍两种方式:一通过异步任务读取文件,二利用系统方法DownloadManager进行下载. 通过异步任务下载apk 文件 public String downloadAsAp ...

  7. android服务下载apk,Android 一个简单的版本更新下载apk小示例

    一.简介: 1.运用 okhttp + notification 通知栏带进度的下载apk,下载完毕后并自动安装,如果用户取消可在通知栏点击安装,点击一次通知栏移除,同时支持自动静默下载(后台默默下载 ...

  8. 使用Android自带的DownloadManager下载ApK并安装

    一.在 AndroidManifest.xml 中的准备 进行网络请求,需要申请<uses-permission android:name="android.permission.IN ...

  9. WebView跳转系统浏览器下载apk

    若url为下载apk的链接时,形如https://resource.xxx.net/download/resource/123.apk 在WebView的shouldOverrideUrlLoadin ...

最新文章

  1. MapReduce编程系列 — 5:单表关联
  2. Oracle的PL/SQL编程前奏之基础技能实战一(匿名子程序)
  3. BERT源码分析(PART I)
  4. linux定时备份mysql数据并同步到其他服务器
  5. haproxy配置参数详解
  6. iis6 开启options方法_《王者荣耀》暗夜危机什么时候开启 暗夜危机开启时间
  7. 语句 查询每个人每个科目的最高分_转行数据分析师专栏(SQL篇)-05多表查询...
  8. Ethercat解析(十一)之分布时钟
  9. MySQL高级知识(九)——慢查询日志
  10. 杨澜对话华为周跃峰:发展数字经济,存储技术是关键
  11. .Net 如何限制用户登录(转)
  12. win10 使用点滴
  13. 计算机操作系统详细学习笔记(三):存储管理
  14. 域名解析信息易语言代码
  15. 激活Navicat premium12时出现“Rsa public key not find“报错时的解决方法
  16. 面向金融的R语言_L3
  17. 独立电子商务网站运营成本
  18. JavaScript BOM和DOM部分
  19. IOS端微信小程序API播放视频无效,应该这样做
  20. mysql qps tps 监控_Mysql库TPS,QPS实时监控脚本

热门文章

  1. Mac port 安装postgres92 + postgres92-server
  2. 问题解决:shared_ptr Assertion px != 0 failed 及debug经验分享
  3. linux gtestgmock安装
  4. 请你帮我一起转到全中国
  5. ARP Cache Poisoning Attack Lab(SEED实验)
  6. Sec-scan漏洞扫描系统
  7. docker 导致宿主机重启的解决方法
  8. python爬虫详解(三)——爬取世界常用密码并保存到字典内
  9. QT窗口嵌入桌面内部(在桌面图标之上):可以实现自定义桌面
  10. 基于JAVA实现的农夫过河问题