安卓自动更新,update支持http和https

1 篇文章 0 订阅
1 篇文章 0 订阅

最近做ICP认证用到https,发现更新的时候需要支持http和https两种方案,对以前UpdateManager做了修改,内容如下:
文章参考了以前网上的一个更新类

/**
 *@author AsionReachel
 *created at 2016/1/11 12:00
 */
public class UpdateManager {
   /* 下载中 */
   private static final int DOWNLOAD = 1;
   /* 下载结束 */
   private static final int DOWNLOAD_FINISH = 2;
   /*
    * 检测更新
    */
   private static final int UPDATE = 3;
   /* 保存解析的XML信息 */
   HashMap<String, String> mHashMap;
   /* 下载保存路径 */
   private String mSavePath;
   /* 记录进度条数量 */
   private int progress;
   /* 版本号 */
   private long servicecode;
   private long localcode;
   /* 是否取消更新 */
   private boolean cancelUpdate = false;
   private String versionCode = "";
   private Context mContext;
   /* 更新进度条 */
   private ProgressBar mProgress;
   private Dialog mDownloadDialog;
   private boolean isupdate = true;
   private HashMap<String, String> map;
   private String downloadpath, serviceCode, updateInfo;
   private boolean flag;
   private boolean isMustUpdate;

   private Handler mHandler = new Handler() {
      public void handleMessage(Message msg) {
         switch (msg.what) {
         // 正在下载
         case UPDATE:
            if (servicecode > localcode) {
               isupdate = false;
            }
            if (!isupdate) {
               // 显示提示对话框
               // showNoticeDialog();
            } else {
               Toast.makeText(mContext, "已是最新版本", Toast.LENGTH_LONG).show();
            }
            break;
         case DOWNLOAD:
            // 设置进度条位置
            mProgress.setProgress(progress);
            break;
         case DOWNLOAD_FINISH:
            // 安装文件
            installApk();
            break;
         default:
            break;
         }
      };
   };

   public UpdateManager(Context context, boolean flag, boolean isMustUpdate) {
      this.mContext = context;
      this.flag = flag;
      this.isMustUpdate = isMustUpdate;
   }

   /**
    * 检测软件更新
    */
   // public void checkUpdate()
   // {
   // isUpdate();
   // }

   /**
    * 检查软件是否有更新版本
    * 
    * @return
    */


   /**
    * 获取软件版本号
    * 
    * @param context
    * @return
    */
   private int getVersionCode(Context context) {
      int versionCode = 0;
      try {
         // 获取软件版本号,对应AndroidManifest.xmlandroid:versionCode
         versionCode = context.getPackageManager().getPackageInfo("com.szy.update", 0).versionCode;
      } catch (NameNotFoundException e) {
         e.printStackTrace();
      }
      return versionCode;
   }

   /**
    * 显示软件更新对话框
    */
   public void showNoticeDialog(final String downloadPath) {
      // 构造对话框
      Builder builder = new Builder(mContext);
      builder.setTitle("软件更新");
      if(isMustUpdate){
         builder.setMessage("检测到新版本,需更新后才能使用,是否立即更新?");
      }else{
      builder.setMessage("检测到新版本,是否立即更新?");
      }
      // 更新
      builder.setPositiveButton("立即更新", new OnClickListener() {
         @Override
         public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
            // 显示下载对话框
            showDownloadDialog(downloadPath);
         }
      });
      // 稍后更新
      if (!isMustUpdate) {
         builder.setNegativeButton("稍后更新", new OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
               dialog.dismiss();
               //点击稍后更新进入主界面,这里我先注释,需要再放开
//             if (flag) {
//                Intent intent = new Intent(mContext, MainActivity.class);
//                mContext.startActivity(intent);
//                ((LoadingActivity)mContext).finish();
//             }

            }
         });
      }
      Dialog noticeDialog = builder.create();
      noticeDialog.show();
   }

   
   
   /**
    * 显示软件下载对话框
    */
   private void showDownloadDialog(String downloadPath) {
      downloadpath = downloadPath;
      // 构造软件下载对话框
      Builder builder = new Builder(mContext);
      builder.setTitle("正在更新");
      builder.setMessage(updateInfo);
      // 给下载对话框增加进度条
      final LayoutInflater inflater = LayoutInflater.from(mContext);
      View v = inflater.inflate(R.layout.softupdate_progress, null);
      mProgress = (ProgressBar) v.findViewById(R.id.update_progress);
      builder.setView(v);
      // 取消更新
      builder.setNegativeButton("取消", new OnClickListener() {
         @Override
         public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
            // 设置取消状态,这里我直接用强转了,没有传activity进来了。
            cancelUpdate = true;
            if (isMustUpdate) {
               ((MainActivity)mContext).finish();
            } else {
               mContext.startActivity(new Intent(mContext, MainActivity.class));
               ((MainActivity)mContext).finish();
            }
            // System.exit(0);
         }
      });
      mDownloadDialog = builder.create();
      mDownloadDialog.setCanceledOnTouchOutside(false);
      mDownloadDialog.show();
      // 下载文件
      downloadApk();
   }

   /**
    * 下载apk文件
    */
   private void downloadApk() {
      // 启动新线程下载软件
      new downloadApkThread().start();
   }

   /**
    *下载文件线程    
    *@author AsionReachel
    *created at 2016/1/11 13:47
    */
   private class downloadApkThread extends Thread {
      @Override
      public void run() {
         try {
            // 判断SD卡是否存在,并且是否具有读写权限
            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
               //这里是一个日志开关打印日志,目前我先注释,需要了解的童鞋可以咨询
//             LogUtils.logiYq( downloadpath);
               // 获得存储卡的路径
               String sdpath = Environment.getExternalStorageDirectory() + "/";
               mSavePath = sdpath + "download";
               URL url = new URL(downloadpath);
               URLConnection conn=null ;
//             HttpURLConnection conn1 ;
//		这里判断请求头为http
               if(url.getProtocol().equals("http")){
                  conn=(HttpURLConnection)url.openConnection();
//		这里判断请求头为https
}else if(url.getProtocol().equals("https")){ // 创建连接 conn= (HttpsURLConnection) url.openConnection(); } conn.connect(); // 获取文件大小 int length = conn.getContentLength(); // 创建输入流 InputStream is = conn.getInputStream(); File file = new File(mSavePath); // 判断文件目录是否存在 if (!file.exists()) { file.mkdir(); } File apkFile = new File(mSavePath, "sp2p_gxy"); FileOutputStream fos = new FileOutputStream(apkFile); int count = 0; // 缓存 byte buf[] = new byte[1024]; // 写入到文件中 do { int numread = is.read(buf); count += numread; // 计算进度条位置 progress = (int) (((float) count / length) * 100); // 更新进度 mHandler.sendEmptyMessage(DOWNLOAD); if (numread <= 0) { // 下载完成 mHandler.sendEmptyMessage(DOWNLOAD_FINISH); break; } // 写入文件 fos.write(buf, 0, numread); } while (!cancelUpdate); fos.close(); is.close(); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // 取消下载对话框显示 mDownloadDialog.dismiss(); } }; /** * 安装APK文件 */ private void installApk() { File apkfile = new File(mSavePath, "sp2p_gxy"); if (!apkfile.exists()) { return; } // 通过Intent安装APK文件 Intent i = new Intent(Intent.ACTION_VIEW); i.setDataAndType(Uri.parse("file://" + apkfile.toString()), "application/vnd.android.package-archive"); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); mContext.startActivity(i); }}
 
git地址:https://github.com/AsionReachel/MySlidingView
csdn地址:http://download.csdn.net/detail/a343141826/9399193
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值