根据网上的然后小改
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ProgressBar;

public class UpdateManager {  
   private Context mContext;  
   private final String updateMsg = "亲,有新版本,要更新吗!";            //下载消息提示  
   private Dialog noticeDialog;                                        //下载提示对话框  
   private Dialog downloadDialog;                                      //下载进度对话框  
   private ProgressBar mProgressBar;                                   //进度条  
   private Boolean interceptFlag = false;                              //标记用户是否在下载过程中取消下载  
   private Thread downloadApkThread = null;                            //下载线程  
   private final String apkUrl = "http://www.xxx/xxx.apk";       //apk的URL地址  
   private final String savePath = "/sdcard/UpdateDemo/";              //下载的apk存放的路径  
   private final String saveFileName = savePath + "xxx.apk";   //下载的apk文件  
   private int progress = 0;                                           //下载进度  
   private final int DOWNLOAD_ING = 1;                                 //标记正在下载  
   private final int DOWNLOAD_OVER = 2;                                //标记下载完成  
   private final String TAG="版本更新";  
   //日志打印标签  
   private Handler mhandler = new Handler() {                          //更新UI的handler  
 
       @Override  
       public void handleMessage(Message msg) {  
           super.handleMessage(msg);  
           switch (msg.what) {  
           case DOWNLOAD_ING:  
               // 更新进度条  
               mProgressBar.setProgress(progress);  
               break;  
           case DOWNLOAD_OVER:  
               downloadDialog.dismiss();  
               installApk();  
               //安装  
               break;  
           default:  
               break;  
           }  
       }  
 
   };  
     
   /* 
    * 构造方法 
    */  
   public UpdateManager(Context context) {  
       this.mContext = context;  
   }  
 
   /* 
    * 检查是否有需要更新,具体比较版本xml 
    */  
   public void checkUpdate() {  
       // 到服务器检查软件是否有新版本  
       //如果有则  
       showNoticeDialog();  
   }  
 
   /* 
    * 显示版本更新对话框 
    */  
   private void showNoticeDialog() {  
       AlertDialog.Builder builder = new Builder(mContext);  
       builder.setTitle("版本更新");  
       builder.setMessage(updateMsg);  
       builder.setPositiveButton("更新", new OnClickListener() {  
 
           public void onClick(DialogInterface dialog, int which) {  
               noticeDialog.dismiss();  
               showDownloadDialog();  
           }  
       });  
       builder.setNegativeButton("以后再说", new OnClickListener() {  
 
           public void onClick(DialogInterface dialog, int which) {  
               noticeDialog.dismiss();  
           }  
       });  
       noticeDialog = builder.create();  
       noticeDialog.show();  
 
   }  
 
   /* 
    * 弹出下载进度对话框 
    */  
   private void showDownloadDialog() {  
       AlertDialog.Builder builder = new Builder(mContext);  
       builder.setTitle("软件更新");  
       final LayoutInflater inflater = LayoutInflater.from(mContext);  
       View v = inflater.inflate(R.layout.progress, null);  
       mProgressBar = (ProgressBar) v.findViewById(R.id.updateProgress);  
       builder.setView(v);  
       builder.setNegativeButton("取消", new OnClickListener() {  
 
           public void onClick(DialogInterface dialog, int which) {  
               downloadDialog.dismiss();  
               interceptFlag = true;  
           }  
       });  
       downloadDialog = builder.create();  
       downloadDialog.show();  
       downloadLatestVersionApk();  
 
   }  
     
   /* 
    * 下载最新的apk文件 
    */  
   private void downloadLatestVersionApk() {  
       downloadApkThread = new Thread(downloadApkRunnable);  
       downloadApkThread.start();  
   }  
     
   //匿名内部类,apk文件下载线程  
   private Runnable downloadApkRunnable = new Runnable() {  
 
       public void run() {  
           try {  
               URL url = new URL(apkUrl);  
               HttpURLConnection conn = (HttpURLConnection) url  
                       .openConnection();  
               conn.setConnectTimeout(5*1000);
               conn.connect();  
               int length = conn.getContentLength();  
               Log.e(TAG, "总字节数:"+length);  
               InputStream is = conn.getInputStream();  
               File file = new File(savePath);  
               if (!file.exists()) {  
                   file.mkdir();  
               }  
               File apkFile = new File(saveFileName);  
               FileOutputStream out = new FileOutputStream(apkFile);  
               int count = 0;  
               int readnum = 0;  
               byte[] buffer = new byte[1024];  
               do {  
                   readnum = is.read(buffer);  
                   count += readnum;  
                   progress = (int) (((float) count / length) * 100);  
                   Log.e(TAG, "下载进度"+progress);  
                   mhandler.sendEmptyMessage(DOWNLOAD_ING);  
                   if (readnum <= 0) {  
                       // 下载结束  
                       mhandler.sendEmptyMessage(DOWNLOAD_OVER);  
                       break;  
                   }  
                   out.write(buffer,0,readnum);  
               } while (!interceptFlag);  
               is.close();  
               out.close();  
           } catch (MalformedURLException e) {  
               e.printStackTrace();  
           } catch (IOException e) {  
               e.printStackTrace();  
           }  
 
       }  
   };  
   /* 
    * 安装下载的apk文件 
    */  
   private void installApk() {  
       File file= new File(saveFileName);  
       if(!file.exists()){  
           return;  
       }  
       Intent intent= new Intent(Intent.ACTION_VIEW);  
       intent.setDataAndType(Uri.parse("file://"+file.toString()), "application/vnd.android.package-archive");  
       mContext.startActivity(intent);  
   }  
}

android自动更新软件版本的更多相关文章

  1. 批量自动更新SVN版本库 - Windows

    开发过程中每天都要从SVN代码库里一个一个的update各个项目代码,不仅效率实在是低,也不符合程序员的"懒"精神,由于是在Windows环境做开发,自然就想到了使用bat来实现自 ...

  2. android自动更新程序,安装完以后就什么都没有了,没有出现安装成功的界面的问题

    转载自: http://blog.csdn.net/lovexieyuan520/article/details/9250099 在android软件开发中,总是需要更新版本,所以当有新版本开发的时候 ...

  3. Android 自动更新 + IIS7 添加APK mime

    如果APK文件放在IIS下面需要添加APK的mime,否则会出现下面错误 可以在IIS上添加mime映射 .apk application/vnd.android   下面内容转自:http://ww ...

  4. fedora23没有/var/log/messages &如何禁用后台自动更新软件?

    警告!! Linux是一个非常敏感的操作系统,若删除文件错误,很容易造成系统崩溃. fedora23没有/var/log/messages 不是没有messages这个文件,而是 从 fc core ...

  5. CentOS 7 环境下部署 SVN 并实现自动更新(版本库放在Tomcat下)

    1.安装 SVN 1.1先检查是否有安装 svn rpm -qa subversion #没有什么显示就说明没有安装过yum remove subversion #如果有安装就运行删除老版本yum i ...

  6. 游戏《Minecraft》或其他应用程序 实现 自动更新 客户端版本

    本渣又来写(水)博客了. 先说一下,我这个解决方案的安全性并不是企业级的,咱们就是一群穷开服的Minecraft玩家. 如果你要投入到企业级应用(容易被黑客攻击的场景),请自己写,思路凑合看看.不然安 ...

  7. C#程序自动更新软件版本号

    最近因为服务器程序管理多,所以在查看服务器程序的时候,只能通过EXE的编译时间来判断服务器程序版本时间,费神伤身啊 现在想了一个方式,在目录下新增一个version文件,里面写上年月日,并且只是在程序 ...

  8. android studio 更新Gradle版本方法

    在导入其他项目时,经常由于gradle版本不一致而导致不能编译 解决方法: 第一步: 按提示点击让它下载,其实目的并不是要它下载,因为这样速度会很慢,这样做只是为了让它在本地创建相应的目录结构 第二步 ...

  9. Android自动更新安装后显示‘完成’‘打开’按钮

    /** * 安装apk * * @param url */ private void installApk() { File apkfile = new File(apkFilePath); if ( ...

随机推荐

  1. Oracle数据库的创建、数据导入导出

    如何结合Sql脚本和PL/SQL Developer工具来实现创建表空间.创建数据库.备份数据库.还原数据库等操作,然后实现Oracle对象创建.导入数据等操作,方便我们快速了解.创建所需要的部署Sq ...

  2. mdf与ldf文件如何还原到SQLserver数据库

    现在又如下两个文件 需要用这两个文件还原数据库 那么该怎么去还原呢? 首先在D盘目录下建立一个文件夹test,然后将上图中的文件粘贴到该文件夹中. 接着在数据库中执行如下代码: EXEC sp_att ...

  3. Entity Framework Power Tools安装和使用

    Entity Framework Power Tools是一个由EntityFramework开发小组提供的工具,它可以从现有数据库生成Fluent款式的Code First代码. 大致来说,这个工具 ...

  4. 非常实用的10个PHP高级应用技巧

    PHP 独特的语法混合了 C.Java.Perl 以及 PHP 自创新的语法.它可以比 CGI或者Perl更快速的执行动态网页.用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML ...

  5. Ubuntu 查看文件以及磁盘空间大小命令df

    (1)查看文件大小 查看当前文件夹下所有文件大小(包括子文件夹)    du -sh   # du -h 15M     ./package 16K     ./.fontconfig 4.0K    ...

  6. Django 学习笔记之三 数据库输入数据

    假设建立了django_blog项目,建立blog的app ,在models.py里面增加了Blog类,同步数据库,并且建立了对应的表.具体的参照Django 学习笔记之二的相关命令. 那么这篇主要介 ...

  7. FineUI Grid控件右键菜单的实现

    FineUI官方Demo上一直没有Grid右键菜单的实现,其实从4.1.x的版本开始,允许添加自定义的事件监听(Listeners),所以要实现这个功能已经相当容易了. ExtJs右键菜单有很多种,对 ...

  8. sql2008 计划自动创建数据库分区【转】

    本文转自:http://jingyan.baidu.com/article/6b97984d9a26ec1ca3b0bf77.html sql2008 计划自动创建数据库分区 固定增量的数据,自动创建 ...

  9. Codeforces Round #Pi (Div. 2) E. President and Roads 最短路+桥

    题目链接: http://codeforces.com/contest/567/problem/E 题意: 给你一个带重边的图,求三类边: 在最短路构成的DAG图中,哪些边是必须经过的: 其他的(包括 ...

  10. 使用SpringMVC+mybatis+事务控制+JSON 配置最简单WEB

    最近在总结一些项目的基础知识,根据公司最近的一些意向和技术路线,初步整理了一个简单的配置例子     1.使用springmvc代替strutsMVC     2.使用请求json数据串的方式代替传统 ...