APP内置更新版本
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
美帝 框架,让创造变得如此简单!