Android检查版本更新下载安装

 

Android版本更新升级所需

1.获取本地的VersionCode

public class APKVersionCodeUtils {
 
      /**
       *获取本地版本号
       *
      */
    public static int getVersionCode(Context mContext) {
        int versionCode = 0;
        try {
            //获取软件版本号,对应AndroidManifest.xml下android:versionCode
            versionCode = mContext.getPackageManager().
                    getPackageInfo(mContext.getPackageName(), 0).versionCode;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return versionCode;
    }
 
    /**
     * 获取版本号名称
     *
     * @param context 上下文
     * @return
     */
    public static String getVerName(Context context) {
        String verName = "";
        try {
            verName = context.getPackageManager().
                    getPackageInfo(context.getPackageName(), 0).versionName;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return verName;
    }
}
 

 2.网络请求后台接口,判断版本号是否低于接口返回的版本号需要更新 

public boolean isNeedUpdate(String version_service){
    boolean isNeed = false;
    try {
        String version_current = getVerName();//获取当前本地版本

        if (!TextUtils.isEmpty(version_service) && !TextUtils.isEmpty(version_current)) {
            String[] service = version_service.split("\\.");
            String[] current = version_current.split("\\.");
            //这里因为服务器和本地版本号的格式一样,所以随便哪个的长度都可以使用
            for (int i = 0; i < service.length; i++) {
                int s = Integer.parseInt(service[i]);
                int c = Integer.parseInt(current[i]);
                if(c>s){
                    isNeed = false;
                    break;
                }
                if (c < s) {
                    isNeed = true;
                    break;
                }
            }
        }
    }catch (Exception e){
        e.printStackTrace();
        LogUtils.e("比较版本号时出错");
    }
    return isNeed;
}

3.在我们的程序需要版本更新的时候 要用Alertdialog提示

public void loadNewVersionAlertDiaLog() {
 
    AlertDialog.Builder alert = new AlertDialog.Builder(ShowActivity.this);
    /**
    * 当后台的数据是分行处理时,接收数据后进行如下操作也能分行显示
     String data = updateContent.replace("\\n", "\n");//updateContent为后台返回更新提示数据
    */    alert.setTitle("说明");
    alert.setMessage("发现新版本,是否立即更新?");
    alert.setCancelable(false);//点击弹窗之外区域,弹框不消失
    alert.setPositiveButton("立即更新", new DialogInterface.OnClickListener() {        @Override
        public void onClick(DialogInterface dialog, int which) {
 
            startUpload(upurl); //传入后台返回的apk下载地址
 
        }
    });
    alert.setNegativeButton("暂不更新", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
 
        }
    });
    alert.create();
    alert.show();
}

4.从服务器下载新版apk

private void startUpload(String downloadUrl){
    progressDialog=new ProgressDialog(this);
    progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    progressDialog.setMessage("正在下载新版本。。。");
    progressDialog.setCancelable(false);//不能手动取消下载进度对话框

    final String fileSavePath=getSaveFilePath(downloadUrl);
    HTTPCaller.getInstance().downloadFile(downloadUrl,fileSavePath,null,new ProgressUIListener(){

        //下载开始
        @Override
        public void onUIProgressStart(long totalBytes) {
            progressDialog.setMax((int)totalBytes);
            progressDialog.show();
        }

        //更新进度
        @Override
        public void onUIProgressChanged(long numBytes, long totalBytes, float percent, float speed) {
            progressDialog.setProgress((int)numBytes);
        }

        //下载完成
        @Override
        public void onUIProgressFinish() {
            Toast.makeText(MainActivity.this,"下载完成",Toast.LENGTH_LONG).show();
            progressDialog.dismiss();
            openAPK(fileSavePath);
        }

    });
}
public static String getSaveFilePath(String fileUrl){
    String fileName=fileUrl.substring(fileUrl.lastIndexOf("/")+1,fileUrl.length());//获取文件名称
    String newFilePath= Environment.getExternalStorageDirectory() + "/Download/"+fileName;
    return newFilePath;
}

4-1.初始化HTTPCaller类

项目build中导入使用包:implementation 'com.ansen.http:okhttpencapsulation:1.0.1'

然后于自定义的application中进行初始化

HttpConfig httpConfig = new HttpConfig();
        httpConfig.setAgent(true);//有代理的情况能不能访问
        httpConfig.setDebug(true);//是否debug模式 如果是debug模式打印log
        httpConfig.setTagName("ansen");//打印log的tagname

        //可以添加一些公共字段 每个接口都会带上
//        httpConfig.addCommonField("pf", "android");
//        httpConfig.addCommonField("version_code", "" + Utils.getVersionCode(getApplicationContext()));

        //初始化HTTPCaller类
        HTTPCaller.getInstance().setHttpConfig(httpConfig);

 

5.安装apk,以及会遇到的权限问题

private void openAPK(String fileSavePath){

        File file=new File(fileSavePath);
        Intent intent = new Intent(Intent.ACTION_VIEW);
        Uri data;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//判断版本大于等于7.0
            // "cn.com.eyes3d.fileprovider"即是在清单文件中配置的authorities
            // 通过FileProvider创建一个content类型的Uri
            data = FileProvider.getUriForFile(this, "cn.com.eyes3d.fileprovider", file);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);// 给目标应用一个临时授权
        } else {
//            data = Uri.fromFile(file);
            data=  FileProvider.getUriForFile(this, "cn.com.eyes3d.fileprovider", file);
        }
        intent.setDataAndType(data, "application/vnd.android.package-archive");
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//安装完成后提示:完成 打开
        startActivity(intent);

    }

5-1.清单文件中添加provider

    <provider
         android:name="android.support.v4.content.FileProvider"
         android:authorities="cn.com.eyes3d.fileprovider"
         android:exported="false"
         android:grantUriPermissions="true">
         <meta-data
                 android:name="android.support.FILE_PROVIDER_PATHS"
                 android:resource="@xml/file_paths"/>
    </provider>

标红位置为包名,各位同时改成自己的就行

 

5-2.创建清单文件中的@xml/file_paths文件

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path name="name" path="Download"/>
</paths>

 

题外话

/**
 * 得到全局唯一UUID,即获取安卓唯一标识
 */
private String uuid;
public String getUUID(){
    SharedPreferences mShare = getSharedPreferences("uuid",MODE_PRIVATE);
    if(mShare != null){
        uuid = mShare.getString("uuid", "");
    }
    if(TextUtils.isEmpty(uuid)){
        uuid = UUID.randomUUID().toString();
        mShare.edit().putString("uuid",uuid).commit();
    }
    return uuid;
}

自此,版本更新下载安装也就写完了,特此记录以备所需,自励一下(´▽`)ノ !

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值