android okgo跳过https验证,okgo下载文件,apk安装适配android7.08.0
本文基于OKGO3.0.4版本编写
首先导入依赖
implementation 'com.lzy.net:okgo:3.0.4'
一.okgo跳过https验证
1.导入自定义SSLSocketClient类
public class SSLSocketClient {//获取这个SSLSocketFactorypublic static SSLSocketFactory getSSLSocketFactory() {try {SSLContext sslContext = SSLContext.getInstance("SSL");sslContext.init(null, getTrustManager(), new SecureRandom());return sslContext.getSocketFactory();} catch (Exception e) {throw new RuntimeException(e);}}//获取TrustManagerprivate static TrustManager[] getTrustManager() {TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {@Overridepublic void checkClientTrusted(X509Certificate[] chain, String authType) {}@Overridepublic void checkServerTrusted(X509Certificate[] chain, String authType) {}@Overridepublic X509Certificate[] getAcceptedIssuers() {return new X509Certificate[]{};}}};return trustAllCerts;}//获取HostnameVerifierpublic static HostnameVerifier getHostnameVerifier() {HostnameVerifier hostnameVerifier = new HostnameVerifier() {@Overridepublic boolean verify(String s, SSLSession sslSession) {return true;}};return hostnameVerifier;}
}
2.在Application里配置
OkHttpClient build = new OkHttpClient.Builder().sslSocketFactory(SSLSocketClient.getSSLSocketFactory()).hostnameVerifier(SSLSocketClient.getHostnameVerifier()).build();//初始化okgo并配置给httpclientOkGo.getInstance().init(this).setOkHttpClient(build);
至此https配置完毕了就
接下来就去请求文件吧
二:OKGO下载文件(本文下载的是一个apk文件)
final String destfiledir = Environment.getExternalStorageDirectory().getPath() + "/OAdownload";//下载路径final String destfilename = "OA.apk";//文件名OkGo
.tag("Download tips")//添加标记 用于取消单个请求 取消: OkGo.getInstance().cancelTag("Download tips");.<File>get("http://immobile.r93535.com:8086/LN/GetExtApp/extapp/ExtApp/A/1111/LatestVersion").execute(new FileCallback(destfiledir, destfilename) {@Overridepublic void onStart(Request<File, ? extends Request> request) {super.onStart(request);Log.e("gogogo", "正在加载中");}@Overridepublic void downloadProgress(Progress progress) {super.downloadProgress(progress);long totalSize = progress.totalSize;//总长度long currentSize = progress.currentSize;//本次下载的大小//进度条progressBar.setMax((int) totalSize);progressBar.setProgress((int) currentSize);textView.setText(String.valueOf(progress.fraction * 100 + "%")); //下载进度}@Overridepublic void onError(Response<File> response) {super.onError(response);Log.e("gogogo", "下载出错");}@Overridepublic void onSuccess(Response<File> response) {Log.e("gogogo", "下载成功");// 安装apkinstall(destfiledir + destfilename);}@Overridepublic void onFinish() {super.onFinish();Log.e("gogogo", "结束");}});
三:安装apk
开始安装apk:
File apkFile = new File(filePath);Intent intent = new Intent(Intent.ACTION_VIEW);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");startActivity(intent);
注意:在android 7.0之前这样写没有一点瑕疵,但是随着Android 7.0的到来引入“私有目录被限制访问”,“StrictMode API 政策”,为了进一步提高私有文件的安全性,Android不再由开发者放宽私有文件的访问权限,之前我们一直使用”file:///”绝对路径来传递文件地址的方式,在接收方访问时很容易触发SecurityException的异常。
因此,为了更好的适配Android 7.0,例如相机拍照这类涉及到文件地址传递的地方就用上了FileProvider,FileProvider也更好地进入了大家的视野。
不多bb,看代码!
1.首先在manifest里面配置provider(跟activity同级)
<providerandroid:name="android.support.v4.content.FileProvider"android:authorities="你的包名.fileprovider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths" /></provider>
2.在res文件下建立xml文件夹然后建立file_paths文件
<resources><paths><external-pathname="OA.apk"path="/OAdownload" /></paths>
</resources>
path就是文件路径,那么是文件名字 然后external-path就相当于Environment.getExternalStorageDirectory() 。
别的路径可以参考下图:
files-path | Context.getFilesDir() |
cache-path | Context.getCacheDir() |
external-path | Environment.getExternalStorageDirectory() |
external-files-path | Context.getExternalFilesDir(null) |
external-cache-path | Context.getExternalCacheDir() |
3.开始安装
private void install(String filePath) {Log.i("file", "开始执行安装: " + filePath);File apkFile = new File(filePath);Intent intent = new Intent(Intent.ACTION_VIEW);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {Log.w("file", "版本大于 N ,开始使用 fileProvider 进行安装");intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);Uri contentUri = FileProvider.getUriForFile(this, "com.example.duqianlong.okdownladdemo.fileprovider", apkFile);intent.setDataAndType(contentUri, "application/vnd.android.package-archive");} else {Log.w("file", "正常进行安装");intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");}startActivity(intent);}
至此差不多就大功告成了,当然权限是少不了的
4.添加权限(因为不是危险权限,所以不需要动态申请,添加到manifest里面就行)
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
读写权限&网络权限 是少不了的,当然这个就需要动态申请了,这个可以参考以前的博客
<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
自此全部完毕大功告成,可以测试啦!
由于动态图太大传不上来,同学们可以去Github下载下来自己测试
android okgo跳过https验证,okgo下载文件,apk安装适配android7.08.0相关推荐
- Android SDK Manager无法显示可供下载的未安装SDK解决方案
Android SDK Manager无法显示可供下载的未安装SDK解决方案 参考文章: (1)Android SDK Manager无法显示可供下载的未安装SDK解决方案 (2)https://ww ...
- java实现从http/https链接地址下载文件
需求: 现在需要从http地址下载文件改到从https地址下载 改造: 代码示例: TestDownLoadFile.java import org.junit.Test; import org.sl ...
- Visual Studio Installer卡在提取文件处并出现反复验证和下载文件的解决办法
先详细的描述一下问题,在安装Visual Studio 2019的时候出现Visual Studio Installer一直卡提取文件界面,并且在下载验证文件之后又重新下载文件的情况. 这种情况是由于 ...
- android签名的应用-- 禁止未经授权签名的apk安装
点击打开链接 最近项目有需求: 只有使用特定签名签的apk才可以安装,其他任何apk都不能安装(root版,使用adb push进去的除外).n多度娘.google之后最终实现,把实现代码罗列一下,以 ...
- Android使用开源项目Xutils实现多线程下载文件
#1.下载utils项目 https://github.com/wyouflf/xUtils #2布局文件里实现UI <LinearLayout xmlns:android="http ...
- Android 调用第三方浏览器打开网址或下载文件
/*** 调用第三方浏览器打开* @param context* @param url 要浏览的资源地址*/public static void openBrowser(Context context ...
- Android设置来电壁纸,来电壁纸秀下载-来电壁纸秀 安卓版v1.0.7-PC6安卓网
来电壁纸秀是一款特别炫酷的来电壁纸美化软件.来电壁纸秀app给大家准备了超级多的精美壁纸素材,来电壁纸秀不仅有无数的壁纸素材,而且来电壁纸秀app还有很多来电秀模板! 软件介绍 来电壁纸秀是一款来电秀 ...
- scp在命令行中带密码远程下载文件 sshpass安装
sshpass-Linux命令之非交互SSH密码验证 ssh登陆不能在命令行中指定密码.sshpass的出现,解决了这一问题.sshpass用于非交互SSH的密码验证,一般用在sh脚本中,无须再次输入 ...
- 天翼云盘免下载客户端直接用浏览器下载的方法与教程突破限制浏览器网页直接下载文件无需安装客户端
前言 如今的天翼云盘,各种限制也变得越来越多.今天教大家怎么免下载客户端下载分享的文件! 方法1(推荐) 首先用电脑浏览器,打开天翼云盘分享链接,然后登录自己的帐号.然后在分享链接页,按F12键,打开 ...
最新文章
- java什么时候用list_Java快问快答:用 ArrayList 还是 LinkedList?
- angular5 ng-content使用方法
- 分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_数据结构与算法学习笔记:图...
- Java集合之Vector源码分析
- django models 文件夹
- 课节5:图神经网络算法(二):图采样
- 是什么 通信中unit_Ubuntu Linux中的特权提升漏洞Dirty Sock分析(含PoC)
- 第十周Java学习总结
- python与c语言数据交互,python与c语言交互---学习012
- matlab的卡方临界值,Excel计算卡方分布,F分布
- inventor能画抄数图吗_画图与图纸转换 抄数
- 解放生产力 - Xcode 与 Simulator 技巧整理(持续更新中)
- H5Stream杂记-HTML中引入RTSP/RTMP源视频初学
- 使用HTML Purifier防止xss攻击
- python电影推荐系统_推荐系统的几种形式(python版)
- 安卓开发--运行你的APP
- 论做空工具体验对比,股票下跌可选择 期权?涡轮?CFD差价合约?牛熊交易获利
- lz4 安装 解压/压缩
- java递归20元买汽水,瓶盖递归 1块钱买一瓶水,三个瓶盖是换一瓶汽水,问20块钱能买 多少瓶汽水(不能借)...
- sql学生表,成绩表,课程表