1、配置 build.gradle添加依赖
implementation 'com.zhy:okhttputils:2.6.2'
2、初始化(可以在application中初始化)
OkHttpClient.Builder builder = new OkHttpClient.Builder() .connectTimeout(15000L, TimeUnit.SECONDS) .writeTimeout(15000L, TimeUnit.SECONDS) .readTimeout(15000L, TimeUnit.SECONDS); OkHttpUtils.initClient(builder.build());
3、下载文件
注:updateInfo.getUrl() -----文件的下载地址
apkSavePath------文件下载存放的目录(需要先创建)
apkName------文件名
OkHttpUtils.get().url(updateInfo.getUrl()).build().execute(new FileCallBack(apkSavePath, apkName) { @Override public void onError(Call call, Exception e, int id) { } @Override public void inProgress(float progress, long total, int id) { super.inProgress(progress, total, id); } @Override public void onResponse(File response, int id) { try { // 没有挂载SD卡,无法下载文件 if (apkFilePath == null || apkFilePath.equals("")) { ToastUtil.showShort(HomeActivity.this, "无法下载安装文件,请检查SD卡是否挂载"); } else { File apkFile = new File(apkFilePath); // 是否存在安装包 if (apkFile.exists() && apkFile.isFile()) { // 下载成功后,安装apk installApk(apkFile); } } } catch (JSONException e) { updateDialog.dismiss(); ToastUtil.showShort(HomeActivity.this, "下载更新包失败"); } } });
4、自动安装apk文件
private void installApk(File apkFile) { Intent install = new Intent(Intent.ACTION_VIEW); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判读版本是否在7.0以上 Uri apkUri = FileProvider.getUriForFile(getApplicationContext(), BuildConfig.APPLICATION_ID+".provider",apkFile); install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件 install.setDataAndType(apkUri, "application/vnd.android.package-archive"); } else { install.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive"); install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); } startActivity(install); }
5、配置provider
(1)清单配置文件中添加:
<!-- FileProvider配置访问路径,适配7.0及其以上 --> <provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.provider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/> </provider>
(2)res/xml下添加 provider_paths.xml文件
<?xml version="1.0" encoding="utf-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android"> <paths> <external-path path="" name="download"/> </paths> </resources>