赞
踩
APP热修复,请参考 APP热修复 该章节
第一步:复制工具类 UtilApp.java:
- package com.gsls.appinstall;
-
- import android.app.Activity;
- import android.content.Intent;
- import android.net.Uri;
- import android.os.Build;
- import android.os.Environment;
-
- import androidx.core.content.FileProvider;
-
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.InputStream;
- import java.net.HttpURLConnection;
- import java.net.URL;
-
- public class UtilApp {
-
- /**
- * @param downloadUrl
- * @param savePath
- * @下载APK新版本
- */
- public static void downloadApp(final String downloadUrl, final String savePath) {
-
- new Thread() {
- public void run() {
- File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + savePath);//记得加扩展名
- file.getParentFile().mkdir();
- try {
- file.createNewFile();
- URL url2 = new URL(downloadUrl);
- HttpURLConnection conn = (HttpURLConnection) url2.openConnection();
- conn.connect();
- if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
- InputStream ips = conn.getInputStream();
- FileOutputStream fops = new FileOutputStream(file);
-
- byte[] buf = new byte[1024];
- int read = ips.read(buf);
- while (read != -1) {
- fops.write(buf, 0, read);
- fops.flush();
- read = ips.read(buf);
- }
- fops.close();
- ips.close();
- conn.disconnect();
- }
- } catch (Exception e) {
- }
- }
- }.start();
-
- }
-
- /**
- * 安装新的Apk
- * @param activity
- * @param apkPath 安装的apk路径
- */
- public static void installNewApk(Activity activity, String apkPath) {
- File apkfile = new File(apkPath);
- if (!apkfile.exists()) {
- return;
- }
- Intent intent = new Intent(Intent.ACTION_VIEW);
- intent.addCategory(Intent.CATEGORY_DEFAULT);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- //兼容android7.0以上版本
- Uri uri = Uri.fromFile(apkfile);
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
- //通过FileProvider创建一个content类型的Uri
- uri = FileProvider.getUriForFile(activity, "com.zuanuniverse.universe.fileprovider", apkfile);
- // 给目标应用一个临时授权
- intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
- }
- intent.setDataAndType(uri, "application/vnd.android.package-archive");
- activity.startActivity(intent);
- }
-
- }
第二步:使用案列
- public class MainActivity extends AppCompatActivity {
-
- String url = "https://res.wx.qq.com/open/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android3b8804.apk";
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
-
- findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- //下载 url 上的 apk 并放在 手机根目录中 GT 文件夹下
- UtilApp.downloadApp(url, "GT/最新版APP.apk");
- }
- });
-
- findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- //安装 手机根目录中 GT 文件夹下的 最新版APP.apk
- UtilApp.installNewApk(MainActivity.this, "0/**具体app路径**/GT/最新版APP.apk");
- }
- });
-
- }
-
- }
第三步:添加权限与xml
添加的权限:
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 写入手机权限 -->
- <uses-permission android:name="android.permission.INTERNET" /> <!-- 网络权限 -->
- <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 读取手机权限 -->
添加数据共享
- <application>
- ...
- <!--数据共享-->
- <provider
- android:name="androidx.core.content.FileProvider"
- android:authorities="自己包名.fileprovider"
- android:grantUriPermissions="true"
- android:exported="false">
- <meta-data
- android:name="android.support.FILE_PROVIDER_PATHS"
- android:resource="@xml/file_paths" />
- </provider>
- ...
- </<application>
创建xml目录并创建 file_paths.xml.xml 文件
- <paths>
- <external-path path="." name="external_storage_root" />
- </paths>
总结:简洁明了,非常实用。
本章节源码网址:https://github.com/1079374315/AppInstall
APP热修复,请参考 APP热修复 该章节
点个关注点个赞呗(〃'▽'〃),关注博主最新发布库:GitHub - 1079374315/GT
美帝 框架,让创造变得如此简单!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。