Android 一个简单的App版本更新功能的实现,页面可自定义(一)

先放GitHub项目地址

项目下载地址链接

再放效果图

![更新页面提示]()

![简易下载页面]()

由于高版本安卓系统权限原因无法直接安装apk,此处已经解决了Android7.0和Android8.0以上App不能安装的问题,并兼容Android7.0以下,如果不考虑安装问题,则可忽略这段话
实现步骤
  1. 因为我这里下载的apk位置是放在SD卡中,所以先要动态获取存储权限
  2. 获取后台版本号作对比
  3. 下载和安装的页面主要在DownloadApk类中进行,此处没有做断点续传功能,后期完善可加上
  4. 为了界面美观,这里我自定义了一个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();
      }
  1. 下载操作在子线程中进行
new Thread() {
            @Override
            public void run() {
                try {
                    File file = getFileFromServer(url);
                    //安装APK
                    installApk(file, mContext);
                    progressDismiss(); //结束掉进度条对话框
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }.start();
  1. 下载还是用原生的HttpURLConnection来做,每次循环下载1024个字节,每隔一秒钟计算一下下载进度提示主线程去更新ui(注:这里的下载量用long表示,int可能会超出范围)
  2. 下载完之后安装兼容了几个版本,避免无法安装
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();
        }
  1. 有问题请指正,之后会进一步完善
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值