先放GitHub项目地址
再放效果图
![更新页面提示]()
![简易下载页面]()
由于高版本安卓系统权限原因无法直接安装apk,此处已经解决了Android7.0和Android8.0以上App不能安装的问题,并兼容Android7.0以下,如果不考虑安装问题,则可忽略这段话
实现步骤
- 因为我这里下载的apk位置是放在SD卡中,所以先要动态获取存储权限
- 获取后台版本号作对比
- 下载和安装的页面主要在DownloadApk类中进行,此处没有做断点续传功能,后期完善可加上
- 为了界面美观,这里我自定义了一个dialog,代码在GitHub项目中都可看见
public void downLoadApk(final Context mContext, final String url) {
//进度条
mProgressDialog = new Dialog(mContext, R.style.FullHeightDialog);
mProgressDialog.setContentView(R.layout.loading_dialog);
mProgressDialog.setCanceledOnTouchOutside(false);
mProgress = mProgressDialog.findViewById(R.id.progressBar);
mTvProgressCount = mProgressDialog.findViewById(R.id.tv_progress_count);
ImageView ivDismiss = mProgressDialog.findViewById(R.id.iv_dismiss);
ivDismiss.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext, "后台下载中...", Toast.LENGTH_SHORT);
progressDismiss();
}
});
mProgress.setMax(100);
mProgressDialog.show();
}
- 下载操作在子线程中进行
new Thread() {
@Override
public void run() {
try {
File file = getFileFromServer(url);
//安装APK
installApk(file, mContext);
progressDismiss(); //结束掉进度条对话框
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
- 下载还是用原生的HttpURLConnection来做,每次循环下载1024个字节,每隔一秒钟计算一下下载进度提示主线程去更新ui(注:这里的下载量用long表示,int可能会超出范围)
- 下载完之后安装兼容了几个版本,避免无法安装
try {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
// Android7.0及以上版本
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
//Uri contentUri = FileProvider.getUriForFile(mContext, "应用包名" + ".fileProvider", file);//参数二:应用包名+".fileProvider"(和步骤一中的Manifest文件中的provider节点下的authorities对应)
Uri contentUri = FileProvider.getUriForFile(mContext, mContext.getApplicationContext().getPackageName() + ".fileprovider", file);
intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
} else {
// Android7.0以下版本
intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
mContext.startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
//progressDismiss();
}
- 有问题请指正,之后会进一步完善