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

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

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

 

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

<?xml version="1.0" encoding="utf-8"?>    

 

题外话

/** * 得到全局唯一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;}

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

更多相关文章

  1. Android笔记: Android版本号
  2. Android版本下载以及切换
  3. 【Unity3D】Unity3D与Android的交互通信(Android Studio3.0版本)
  4. Android 升级SDK管理器版本到20,安装Android 4.0以及更高版本
  5. Android Studio apk系统签名和版本描述的实现
  6. android 开发对gif解码(适配android 4.2、4.3、4.4版本)
  7. Android API与Android版本的关系
  8. 如何更新Android Studio版本
  9. Android SDK版本和ADT版本

随机推荐

  1. 负载均衡概念入门
  2. 【Rust日报】2020-09-20 Rust 和 Node.js
  3. 【Rust日报】2020-09-21 Rust宣布成立错
  4. 面试官:你分析过线程池源码吗?
  5. 面试官:你分析过mybatis工作原理吗?
  6. Java岗 面试考点精讲(网络篇03期)
  7. Java岗 面试考点精讲(基础篇01期)
  8. Spring全家桶—SpringCloud之Feign(Finch
  9. 分享一下如何利用 Python测试 完成验签操
  10. 与孩子一起读古诗,是为了什么?