看过网上很多apk升级的,但是不怎么适合自已,所以决定自已写一个,步骤如下:
第一步:
implementation 'com.squareup.okhttp3:okhttp:4.2.2'
第二步:新建下载apk工具类
public class ApkHttpUtil {
private static ApkHttpUtil httpNet;
public static ApkHttpUtil getInstance(){
if (httpNet == null){
httpNet = new ApkHttpUtil();
}
return httpNet;
}
public static void httpDownLoadApk(String url, okhttp3.Callback callback) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.build();
Call call = client.newCall(request);
call.enqueue(callback);
}
}
第三步:下载apk文件
public class DownApk {
private static DownApk downApk;
public static DownApk getInstance(){
if (downApk == null){
downApk = new DownApk();
}
return downApk;
}
//下载进度
private static ProgressDialog progressDialog;
/**
* loginactivity 更新
* @param url
* @param context
*/
public static void downFile(final String url, final Context context) {
progressDialog = new ProgressDialog(context); //进度条,在下载的时候实时更新进度,提高用户友好度
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setTitle("正在下载apk");
progressDialog.setMessage("请等待安装...");
progressDialog.setProgress(0);
progressDialog.setCancelable(false);//点击返回键,禁止退出
progressDialog.show();
ApkHttpUtil.getInstance().httpDownLoadApk(url, new Callback() {
@Override
public void onFailure(Call call, IOException e) {
//下载失败
downFial(context);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//下载。。。
InputStream is = null;//输入流
FileOutputStream fos = null;//输出流
try {
is = response.body().byteStream();//获取输入流
long total = response.body().contentLength();//获取文件大小
setMax(total, context);//为progressDialog设置大小
File file = null;
if (is != null) {
file = new File(Environment.getExternalStorageDirectory(), "hyzx.apk");// 设置路径
fos = new FileOutputStream(file);
byte[] buf = new byte[1024];
int ch = -1;
int process = 0;
while ((ch = is.read(buf)) != -1) {
fos.write(buf, 0, ch);
process += ch;
downLoading(process, context);
}
}
fos.flush();
if (fos != null) {
fos.close();
}
sleep(1000);
downSuccess(context, file);
} catch (Exception e) {
downFial(context);
} finally {
try {
if (is != null)
is.close();
} catch (IOException e) {
}
try {
if (fos != null)
fos.close();
} catch (IOException e) {
}
}
}
});
}
private static void downFial(final Context context) {
((LoginActivity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
progressDialog.cancel();
Toast.makeText(context, "更新失败", Toast.LENGTH_LONG).show();
}
});
}
private static void setMax(final long total, Context context) {
((LoginActivity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
progressDialog.setMax((int) total);
}
});
}
/**
* 进度条实时更新
*
* @param i
*/
private static void downLoading(final int i, Context context) {
((LoginActivity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
progressDialog.setProgress(i);
}
});
}
private static void downSuccess(final Context context, final File file) {
//安装
((LoginActivity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
}
try {
sleep(1000);
installApk(file, context);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
private static void installApk(File file, Context context) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
if (Build.VERSION.SDK_INT > 23) {
Uri apkUri = FileProvider.getUriForFile(context, "com.energy.app.fileprovider", file);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
} else {
intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
}
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
}
第四步:检查更新
private final int PERMISSION_REQUEST_CODE = 1;
private final String[] permissionManifest = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
//动态申请权限
if (Build.VERSION.SDK_INT >= 23) {
if (!permissionCheck()) {
ActivityCompat.requestPermissions(LoginActivity.this, permissionManifest, PERMISSION_REQUEST_CODE);
return;
}
checkUpdates(); //检查更新 你的更新代码
}
@SuppressLint("WrongConstant")
private boolean permissionCheck() {
int permissionCheck = PackageManager.PERMISSION_GRANTED;
String permission;
for (int i = 0; i < permissionManifest.length; i++) {
permission = permissionManifest[i];
if (PermissionChecker.checkSelfPermission(LoginActivity.this, permission) != PackageManager.PERMISSION_GRANTED) {
permissionCheck = PackageManager.PERMISSION_DENIED;
}
}
if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
return false;
} else {
return true;
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == PERMISSION_REQUEST_CODE) {
checkUpdates();
} else {
Toast.makeText(LoginActivity.this, "缺少必要的权限", Toast.LENGTH_LONG).show();
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
第五步:调用apk下载
DownApk.downFile(apkFile,Activity.this);
这篇博客介绍了如何自定义实现Android应用的APK升级过程,包括新建下载工具类、下载APK文件、检查更新及调用安装流程的详细步骤。
1874

被折叠的 条评论
为什么被折叠?



