Android自动检测版本及自动升级
1.检测当前版本的信息AndroidManifest.xml-->manifest-->android:versionName。
2.从服务器获取版本号(版本号存在于xml文件中)并与当前检测到的版本进行匹配,如果不匹配,提示用户进行升级,如果匹配则进入程序主界面。
3.当提示用户进行版本升级时,如果用户点击了确定,系统将自动从服务器上下载并进行自动升级,如果点击取消将进入程序主界面。
效果图:


获取当前程序的版本号:
- /*
- * 获取当前程序的版本号
- */
- private String getVersionName() throws Exception{
- //获取packagemanager的实例
- PackageManager packageManager = getPackageManager();
- //getPackageName()是你当前类的包名,0代表是获取版本信息
- PackageInfo packInfo = packageManager.getPackageInfo(getPackageName(), 0);
- return packInfo.versionName;
- }
获取服务器端的版本号:
- /*
- * 用pull解析器解析服务器返回的xml文件 (xml封装了版本号)
- */
- public static UpdataInfo getUpdataInfo(InputStream is) throws Exception{
- XmlPullParser parser = Xml.newPullParser();
- parser.setInput(is, "utf-8");//设置解析的数据源
- int type = parser.getEventType();
- UpdataInfo info = new UpdataInfo();//实体
- while(type != XmlPullParser.END_DOCUMENT ){
- switch (type) {
- case XmlPullParser.START_TAG:
- if("version".equals(parser.getName())){
- info.setVersion(parser.nextText()); //获取版本号
- }else if ("url".equals(parser.getName())){
- info.setUrl(parser.nextText()); //获取要升级的APK文件
- }else if ("description".equals(parser.getName())){
- info.setDescription(parser.nextText()); //获取该文件的信息
- }
- break;
- }
- type = parser.next();
- }
- return info;
- }
从服务器下载apk:
- public static File getFileFromServer(String path, ProgressDialog pd) throws Exception{
- //如果相等的话表示当前的sdcard挂载在手机上并且是可用的
- if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
- URL url = new URL(path);
- HttpURLConnection conn = (HttpURLConnection) url.openConnection();
- conn.setConnectTimeout(5000);
- //获取到文件的大小
- pd.setMax(conn.getContentLength());
- InputStream is = conn.getInputStream();
- File file = new File(Environment.getExternalStorageDirectory(), "updata.apk");
- FileOutputStream fos = new FileOutputStream(file);
- BufferedInputStream bis = new BufferedInputStream(is);
- byte[] buffer = new byte[1024];
- int len ;
- int total=0;
- while((len =bis.read(buffer))!=-1){
- fos.write(buffer, 0, len);
- total+= len;
- //获取当前下载量
- pd.setProgress(total);
- }
- fos.close();
- bis.close();
- is.close();
- return file;
- }
- else{
- return null;
- }
- }
匹配、下载、自动安装:
- /*
- * 从服务器获取xml解析并进行比对版本号
- */
- public class CheckVersionTask implements Runnable{
- public void run() {
- try {
- //从资源文件获取服务器 地址
- String path = getResources().getString(R.string.serverurl);
- //包装成url的对象
- URL url = new URL(path);
- HttpURLConnection conn = (HttpURLConnection) url.openConnection();
- conn.setConnectTimeout(5000);
- InputStream is =conn.getInputStream();
- info = UpdataInfoParser.getUpdataInfo(is);
- if(info.getVersion().equals(versionname)){
- Log.i(TAG,"版本号相同无需升级");
- LoginMain();
- }else{
- Log.i(TAG,"版本号不同 ,提示用户升级 ");
- Message msg = new Message();
- msg.what = UPDATA_CLIENT;
- handler.sendMessage(msg);
- }
- } catch (Exception e) {
- // 待处理
- Message msg = new Message();
- msg.what = GET_UNDATAINFO_ERROR;
- handler.sendMessage(msg);
- e.printStackTrace();
- }
- }
- }
- Handler handler = new Handler(){
- @Override
- public void handleMessage(Message msg) {
- // TODO Auto-generated method stub
- super.handleMessage(msg);
- switch (msg.what) {
- case UPDATA_CLIENT:
- //对话框通知用户升级程序
- showUpdataDialog();
- break;
- case GET_UNDATAINFO_ERROR:
- //服务器超时
- Toast.makeText(getApplicationContext(), "获取服务器更新信息失败", 1).show();
- LoginMain();
- break;
- case DOWN_ERROR:
- //下载apk失败
- Toast.makeText(getApplicationContext(), "下载新版本失败", 1).show();
- LoginMain();
- break;
- }
- }
- };
- /*
- *
- * 弹出对话框通知用户更新程序
- *
- * 弹出对话框的步骤:
- * 1.创建alertDialog的builder.
- * 2.要给builder设置属性, 对话框的内容,样式,按钮
- * 3.通过builder 创建一个对话框
- * 4.对话框show()出来
- */
- protected void showUpdataDialog() {
- AlertDialog.Builder builer = new Builder(this) ;
- builer.setTitle("版本升级");
- builer.setMessage(info.getDescription());
- //当点确定按钮时从服务器上下载 新的apk 然后安装
- builer.setPositiveButton("确定", new OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- Log.i(TAG,"下载apk,更新");
- downLoadApk();
- }
- });
- //当点取消按钮时进行登录
- builer.setNegativeButton("取消", new OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- // TODO Auto-generated method stub
- LoginMain();
- }
- });
- AlertDialog dialog = builer.create();
- dialog.show();
- }
- /*
- * 从服务器中下载APK
- */
- protected void downLoadApk() {
- final ProgressDialog pd; //进度条对话框
- pd = new ProgressDialog(this);
- pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
- pd.setMessage("正在下载更新");
- pd.show();
- new Thread(){
- @Override
- public void run() {
- try {
- File file = DownLoadManager.getFileFromServer(info.getUrl(), pd);
- sleep(3000);
- installApk(file);
- pd.dismiss(); //结束掉进度条对话框
- } catch (Exception e) {
- Message msg = new Message();
- msg.what = DOWN_ERROR;
- handler.sendMessage(msg);
- e.printStackTrace();
- }
- }}.start();
- }
- //安装apk
- protected void installApk(File file) {
- Intent intent = new Intent();
- //执行动作
- intent.setAction(Intent.ACTION_VIEW);
- //执行的数据类型
- intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
- startActivity(intent);
- }
- /*
- * 进入程序的主界面
- */
- private void LoginMain(){
- Intent intent = new Intent(this,MainActivity.class);
- startActivity(intent);
- //结束掉当前的activity
- this.finish();
- }
UpdataInfo:
- public class UpdataInfo {
- private String version;
- private String url;
- private String description;
- public String getVersion() {
- return version;
- }
- public void setVersion(String version) {
- this.version = version;
- }
- public String getUrl() {
- return url;
- }
- public void setUrl(String url) {
- this.url = url;
- }
- public String getDescription() {
- return description;
- }
- public void setDescription(String description) {
- this.description = description;
- }
- }
update.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <info>
- <version>2.0</version>
- <url>http://192.168.1.187:8080/mobilesafe.apk</url>
- <description>检测到最新版本,请及时更新!</description>
- </info>
Android自动检测版本及自动升级的更多相关文章
- Android应用更新-自动检测版本及自动升级
原文 http://www.cnblogs.com/keyindex/articles/1819504.html 注:实质,把自己新版的APK放在可以下载的地方,先自己设置个通信,检查版本,我是直接放 ...
- Android Studio2.x版本无法自动关联源码的解决方法
Android Studio2.x版本无法自动关联源码的解决方法 在学习android开发过程中,对于一个不熟悉的类,阅读源码是一个很好的学习方式,使用andorid studio开发工具的SDK M ...
- Sublime 是自动检测而非自动设置缩进
以为是自动设置规范化的缩进 以前一直认为是:识别出文件类型后,设置统一的缩进规范.比如说 识别为CSS,就把缩进设成2个空格 其实是自动检测然后与你保持统一 亲测发现,根据你文本里用的是几个空格的缩进 ...
- Android 一个相对完整的自动升级功能实现代码
由于项目的需要最近做了一个关于Android自动升级的功能,下面将贴出Android手机客户端的完整代码.这段代码参考别的代码居多,由于不满足需求,所以自己仅仅改了一些需要变动的内容,其他功能都是按照 ...
- Android实现App版本自动更新
现在很多的App中都会有一个检查版本的功能.例如斗鱼TV App的设置界面下: 当我们点击检查更新的时候,就会向服务器发起版本检测的请求.一般的处理方式是:服务器返回的App版本与当前手机安装的版本号 ...
- 最新版自动检测卡片类型工具软件版本(auto check card type v3.2.0)
自动检测卡片类型工具软件. 卡片放到读卡器上面自动识别卡片类型,不需老是按下按钮,好用,方便.支持自动识别NTAG213卡片,NTAG215卡片, NTAG216卡片,Ultralight芯片, Ul ...
- iOS自动检测版本更新
虽然苹果官方是不允许应用自动检测更新,提示用户下载,因为苹果会提示你有多少个软件需要更新,但是有的时候提示用户一下有新版还是很有必要的. 首先说一下原理: 每个上架的苹果应用程序,都会有一个应用程序的 ...
- IOS开发中如何实现自动检测更新APP
自动检测更新实现逻辑: 先上github地址:https://github.com/wolfhous/HSUpdateApp 1,获取当前项目APP版本号 2,拿到AppStore项目版本号 3,对比 ...
- js上传插件uploadify自动检测不到flash控件的问题
[问题描述] 项目开发中,由于使用了js的一个上传插件uploadify,下载的是flash版本的,后来在谷歌浏览器上运行时经常报flash控件未安装,虽然下图是uploadify自动检测自动弹出来的 ...
随机推荐
- Alice and Bob(贪心HDU 4268)
Alice and Bob Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- Human Gene Functions
Human Gene Functions Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18053 Accepted: 1004 ...
- Unity-Animato深入系列---FloatValue阻尼
回到 Animator深入系列总目录 Animator的SetFloat接口可以设置阻尼,并且4种类型变量只有float是支持阻尼的. public void SetFloat(int id, flo ...
- 怎样解决:未找到路径“……”的控制器或该控制器未实现 IController?
就是要加上new{area=""},比如下面的: @{Html.RenderAction("Cartsummary","ShoppingCart&qu ...
- 什么是“鸭子类型(duck typing)”?
在计算机编程世界里会接触到一个知识点 —— duck typing,叫“鸭子类型”. 它有一个形象的解释: “当看到一只鸟走起来像鸭子.游泳起来像鸭子.叫起来也像鸭子,那么这只鸟就可以被称为鸭子. ...
- bouncycastle创建csr
public static void main(String[] args) { String subjectDN = "CN=duwenlei"; String algorith ...
- 编译android源码官方教程(4)开始编译
Preparing to Build IN THIS DOCUMENT Obtain proprietary binaries Download proprietary binaries Extrac ...
- Intent官方教程(6)常见Intent示例,启动日历,时钟,镜头等。
guide/components/intents-common.html 包含:Alarm Clock Calendar Camera Contacts/People App Email File S ...
- 在HTML5规范中div中读取预存的data-[key]值
HTML 代码: <div id="div_test" data-test="this is test" ></div> jQuery ...
- oracle默认管理员的帐号和密码以及密码修改和解除锁定
安装 ORACLE 时,若没有为下列用户重设密码,则其默认密码如下: 用户名 / 密码 登录身份 说明 sys/change_on_install SYSDBA 或 SYSOPER 不能以 NORMA ...