安卓 软件更新程序

首先,在manifest.xml配置文件中,会有当前安卓软件的版本号。

1 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
2     package="com.cn.gordon.exhibition.walk.activity"
3     android:versionCode="1"
4     android:versionName="1.0.1" >

简单的思路就是把自己的版本号通过参数,传递给后台,由后台来判断是否要检测更新。(这里是把后台中最新的版本获取到,和本地的做对比。)

通过方法来获取本地的版本号:

 1 public static String getVersionName(Context context) {
 2         String verName = "";
 3         try {
 4             verName = context.getPackageManager().getPackageInfo(PACKAGE_NAME,
 5                     0).versionName;
 6         } catch (NameNotFoundException e) {
 7             e.printStackTrace();
 8         }
 9         return verName;
10     }

获取网络的版本号:

 1 protected void getVersionFromNet(final View view) {
 2         Map<String, String> postvalues = new HashMap<String, String>();
 3         postvalues.put("", "");
 4
 5         new NetUtils(new NetCallBack(){
 6             @Override
 7             public void getNet(NetCallBack_State arg0, String arg1) {
 8                 switch (arg0) {
 9                 case error:
10                     Toast.makeText(getActivity(), "网络资源错误", Toast.LENGTH_SHORT).show();
11                     break;
12                 case noNet:
13                     Toast.makeText(getActivity(), "网络未开启", Toast.LENGTH_SHORT).show();
14                     break;
15                 case wrong:
16                     Toast.makeText(getActivity(), "网络数据错误"+arg1, Toast.LENGTH_SHORT).show();
17                     break;
18                 case ok:
19                     processUpdate(view,arg1);
20                     break;
21                 default:
22                     break;
23                 }
24             }
25         }).read(getActivity(), false, Utils.GETAPKVERSIONCODE_URL, null, null, false, postvalues, "GBK", true, true);
26
27     }

返回的json在arg1中,解析json:

 1 protected void processUpdate(View view ,String arg1) {
 2         try {
 3             JSONObject jo = new JSONObject(arg1);
 4             if (jo.optString("version").equals(Utils.getVersionName(getActivity()))) {
 5                 Toast.makeText(getActivity(), "当前软件已经是最新版本~", Toast.LENGTH_SHORT).show();
 6             }else {
 7                 String apkUrl = Utils.PICIP + "/iot-hmi-web/iot/" + jo.optString("url").replace("\\", "/");
 8                 System.out.println("apkUrl = "+apkUrl);
 9                 String apkName = jo.optString("name");
10                 String versionName = jo.optString("version");
11
12                 global.setApkName(apkName);
13                 global.setApkUrl(apkUrl);
14                 PromptDialogPopupWindow pDialog = new PromptDialogPopupWindow(getActivity(), 4, "LoginActivity", 检测到新版本,\r\n最新版本:V"+versionName+"\r\n当前版本:V"+Utils.getVersionName(getActivity())+"\r\n是否现在更新?");
15                 pDialog.showPopupWindow(view);
16             }
17         } catch (JSONException e) {
18             e.printStackTrace();
19             return;
20         }
21
22
23     }

解析完成后,弹出一个popupwindow来提示用户是否真的要更新?

  1 package com.cn.gordon.exhibition.walk.popup;
  2
  3 import com.cn.gordon.exhibition.walk.activity.CreateBusinesscardActivity;
  4 import com.cn.gordon.exhibition.walk.activity.DownApkActivity;
  5 import com.cn.gordon.exhibition.walk.activity.LoginActivity;
  6 import com.cn.gordon.exhibition.walk.activity.R;
  7 import com.cn.gordon.exhibition.walk.application.GlobalVaries;
  8 import android.annotation.TargetApi;
  9 import android.app.Activity;
 10 import android.bluetooth.BluetoothAdapter;
 11 import android.bluetooth.BluetoothManager;
 12 import android.content.Context;
 13 import android.content.Intent;
 14 import android.graphics.drawable.BitmapDrawable;
 15 import android.os.Bundle;
 16 import android.view.Gravity;
 17 import android.view.LayoutInflater;
 18 import android.view.View;
 19 import android.view.View.OnClickListener;
 20 import android.widget.Button;
 21 import android.widget.PopupWindow;
 22 import android.widget.RelativeLayout.LayoutParams;
 23 import android.widget.TextView;
 24
 25 public class PromptDialogPopupWindow {
 26     private Activity context;
 27     private Button btnOK,btnCancel;
 28     private TextView txtContent;
 29     private PopupWindow popWindow ;
 30     private GlobalVaries global;
 31     private String promptContent,activityName;
 32     private int goingFlag;//1:登录2:完善信息
 33     private int okCancel = 0;//init-->0,ok-->1,cancel-->2
 34
 35
 36
 37     public PromptDialogPopupWindow(Activity context,int goingFlag,String activityName,String promptContent){
 38         this.context = context;
 39         this.promptContent = promptContent;
 40         this.activityName = activityName;
 41         this.goingFlag = goingFlag;
 42         init();
 43     }
 44         @SuppressWarnings("deprecation")
 45         private void init() {
 46
 47             global = (GlobalVaries) context.getApplication();
 48
 49             LayoutInflater inflater = LayoutInflater.from(context);
 50              // 引入窗口配置文件
 51             View viewPop = inflater.inflate(R.layout.popup_promptdialog, null);
 52             txtContent = (TextView)viewPop.findViewById(R.id.promptcontent);
 53             btnOK = (Button)viewPop.findViewById(R.id.btn_ok);
 54             btnCancel = (Button)viewPop.findViewById(R.id.btn_cancel);
 55             // 创建PopupWindow对象
 56             popWindow = new PopupWindow(viewPop, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, false);
 57             // 需要设置一下此参数,点击外边可消失
 58             popWindow.setBackgroundDrawable(new BitmapDrawable());
 59             //设置点击窗口外边窗口消失
 60             popWindow.setOutsideTouchable(false);
 61             // 设置此参数获得焦点,否则无法点击
 62             popWindow.setFocusable(false);
 63
 64             txtContent.setText(promptContent);
 65             popWindow.update();
 66
 67             btnOK.setOnClickListener(new OnClickListener() {
 68
 69                 @TargetApi(18)
 70                 @Override
 71                 public void onClick(View v) {
 72                     if (goingFlag==1) {//用户还没有登录
 73                         Intent in = new Intent(context,LoginActivity.class);
 74                         Bundle bundle = new Bundle();
 75                         bundle.putString("from", activityName);
 76                         in.putExtras(bundle);
 77                         context.startActivity(in);
 78                     }
 79                                                             if (goingFlag==4) {
 80                         //更新软件
 81                         String apkName = global.getApkName();
 82                         String apkUrl = global.getApkUrl();
 83                         Intent in = new Intent(context, DownApkActivity.class);
 84                         Bundle bundle = new Bundle();
 85                         bundle.putString("apkName", apkName);
 86                         bundle.putString("apkUrl", apkUrl);
 87                         in.putExtras(bundle);
 88                         context.startActivity(in);
 89                     }
 90                     okCancel = 1;
 91                     popWindow.dismiss();
 92                 }
 93             });
 94
 95             btnCancel.setOnClickListener(new OnClickListener() {
 96                 @Override
 97                 public void onClick(View v) {
 98                     okCancel = 2;
 99                     popWindow.dismiss();
100                 }
101             });
102
103
104
105     }
106
107     public int getClickState(){
108         return okCancel;
109     }
110
111     public boolean isShowing(){
112         if (!popWindow.isShowing()) {
113             return false;
114         }else {
115             return true;
116         }
117     }
118
119     public int showPopupWindow(View parent) {
120         if (!popWindow.isShowing()) {
121             // 以下拉方式显示popupwindow  //Gravity.CENTER_HORIZONTAL|Gravity.CENTER_VERTICAL
122             popWindow.showAtLocation(parent,Gravity.CENTER,0, 0);
123         } else {
124             popWindow.dismiss();
125         }
126         return okCancel ;
127     }
128 }

点击提示框中的确定之后,页面跳转到下载的Activity页面:

  1 package com.cn.gordon.exhibition.walk.activity;
  2
  3 import java.io.File;
  4 import java.io.FileOutputStream;
  5 import java.io.InputStream;
  6 import java.io.OutputStream;
  7 import java.net.URL;
  8 import java.net.URLConnection;
  9
 10 import com.cn.gordon.exhibition.walk.utils.Utils;
 11
 12 import android.annotation.SuppressLint;
 13 import android.app.Activity;
 14 import android.content.Intent;
 15 import android.graphics.Color;
 16 import android.net.Uri;
 17 import android.os.Bundle;
 18 import android.os.Handler;
 19 import android.os.Message;
 20 import android.view.View;
 21 import android.view.View.OnClickListener;
 22 import android.widget.Button;
 23 import android.widget.ProgressBar;
 24 import android.widget.TextView;
 25 import android.widget.Toast;
 26
 27 public class DownApkActivity extends Activity {
 28
 29     private Button btnOK,btnCancel;
 30     private TextView tvComplete;
 31     private static final String APK_PATH = Utils.getSDPath()+ java.io.File.separator +  "exhibition_walk"; // 存放各个下载器 27
 32
 33     private Handler mHandler;
 34     private ProgressBar bar;
 35     private Bundle bundle;
 36     private String apkName,apkUrl;
 37     @Override
 38     protected void onCreate(Bundle savedInstanceState) {
 39         super.onCreate(savedInstanceState);
 40         setContentView(R.layout.downloadapk);
 41         bundle = getIntent().getExtras();
 42         if (bundle!=null) {
 43             apkName = bundle.getString("apkName");
 44             apkUrl = bundle.getString("apkUrl");
 45         }
 46         init();
 47         setAction();
 48         if (apkName!=null&&apkUrl!=null&&!"".equals(apkName)&&!"".equals(apkUrl)) {
 49             downloadFile(apkUrl,apkName);
 50         }
 51     }
 52     @SuppressLint("HandlerLeak")
 53     private void init() {
 54         btnOK = (Button) findViewById(R.id.oksure);
 55         btnCancel = (Button) findViewById(R.id.nocancel);
 56         btnOK.setVisibility(View.INVISIBLE);
 57         btnCancel.setVisibility(View.INVISIBLE);
 58         tvComplete = (TextView) findViewById(R.id.tv_complete);
 59         bar = (ProgressBar) findViewById(R.id.progress_horizontal);
 60         mHandler = new Handler() {
 61             public void handleMessage(Message msg) {
 62                 if (msg.what == 1) {
 63 //                    String url = (String) msg.obj;
 64                     int length = msg.arg1;
 65                     int totalSize = msg.arg2;
 66                     int percent = 0;
 67                     if (totalSize!=0) {
 68                         percent = (100*length)/totalSize;
 69                     }
 70                     tvComplete.setText("下载进度:"+percent+"%");
 71                     if (bar != null) {// 设置进度条按读取的length长度更新
 72                         bar.setProgress(length);
 73                         bar.setMax(totalSize);
 74                         if (length >= totalSize) {
 75                             Toast.makeText(DownApkActivity.this, "下载完成!", Toast.LENGTH_SHORT).show();
 76                              // 下载完成后清除进度条并将map中的数据清空 45
 77 //                            LinearLayout layout = (LinearLayout) bar.getParent();//FIXME
 78 //                            layout.removeView(bar);
 79 //                            ProgressBars.remove(url);
 80 //                            downloaders.get(url).delete(url);
 81 //                            downloaders.get(url).reset();
 82 //                            downloaders.remove(url);
 83                             installApk(APK_PATH,apkName);
 84                         }
 85                      }
 86                 }
 87         }
 88     };
 89     }
 90     private void setAction() {
 91         btnOK.setOnClickListener(new OnClickListener() {
 92             @Override
 93             public void onClick(View v) {
 94                 // TODO Auto-generated method stub
 95
 96             }
 97         });
 98         btnCancel.setOnClickListener(new OnClickListener() {
 99             @Override
100             public void onClick(View v) {
101                 // TODO Auto-generated method stub
102
103             }
104         });
105
106     }
107
108     private void downloadFile(final String fileUrl,final String fileName){
109         //准备拼接新的文件名(保存在存储卡后的文件名)
110 //        String newFilename = _urlStr.substring(_urlStr.lastIndexOf("/")+1);
111 //        newFilename = _dirName + newFilename;
112         new Thread(new Runnable() {
113
114             @Override
115             public void run() {
116                 File file = new File(fileName);
117                 //如果目标文件已经存在,则删除。产生覆盖旧文件的效果
118                 if(file.exists())
119                 {
120                     file.delete();
121                 }
122                 try {
123                          // 构造URL
124                          URL url = new URL(fileUrl);
125                          // 打开连接
126                          URLConnection con = url.openConnection();
127                          //获得文件的长度
128                          int contentLength = con.getContentLength();
129                          System.out.println("长度 :"+contentLength);
130                          // 输入流
131                          InputStream is = con.getInputStream();
132                          // 64K的数据缓冲
133                          byte[] bs = new byte[1024*8];
134                          // 读取到的数据长度
135                          int len;
136                          //downloadSize
137                          int downloadSize = 0;
138
139 //                         Bundle bund = new Bundle();
140                          // 输出的文件流
141                          OutputStream os = new FileOutputStream(APK_PATH+java.io.File.separator+fileName);
142                          // 开始读取
143                          while ((len = is.read(bs)) != -1) {
144                              downloadSize+=len;
145                              os.write(bs, 0, len);
146                              Message message = new Message();
147                              message.arg1 = downloadSize;
148                              message.arg2 = contentLength;
149                              message.what = 1;
150                              mHandler.sendMessage(message);
151                          }
152                          // 完毕,关闭所有链接
153                          os.close();
154                          is.close();
155
156                 } catch (Exception e) {
157                         e.printStackTrace();
158                         Toast.makeText(DownApkActivity.this, "下载失败", Toast.LENGTH_SHORT).show();
159 //                        finish();
160                         tvComplete.setTextColor(Color.YELLOW);
161                         return;
162                 }
163
164             }
165         }).start();
166
167     }
168
169
170     /**
171      * 安装APK文件
172      */
173     private void installApk(String filePath,String fileName)//TODO   search method parameters
174     {
175         File apkfile = new File(filePath,fileName);
176         if (!apkfile.exists())
177         {
178             return;
179         }
180         // 通过Intent安装APK文件
181         Intent i = new Intent(Intent.ACTION_VIEW);
182         i.setDataAndType(Uri.parse("file://" + APK_PATH + java.io.File.separator +fileName), "application/vnd.android.package-archive");
183         DownApkActivity.this.startActivity(i);
184     }
185
186 }

下载完成后,便开始启动安装软件。

时间: 2024-10-03 23:15:41

安卓 软件更新程序的相关文章

更新 是 可用的 针对 安卓 软件开发包和工具 Updates are available for android software development packages and tools

作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:[email protected] E-mail: 313134555 @qq.com 更新 是 可用的 针对 安卓 软件开发包和工具 Updates are available for android software development packages and tools 安卓软件开发包更新 确保 你有最新的特性和 增强. 安卓工作室将更新下面的组件: 安卓模拟器 新版本 26.1.2 谷歌仓库新版本 57 安卓7.

Genymotion - 强大好用高性能的 Android 模拟器 (在电脑流畅运行APK安卓软件游戏的利器)

随着 Android 系统的应用和游戏越来越丰富,甚至有些比起Windows.Mac上的软件更加好用好玩,因此很多人都希望能在电脑上也能玩到安卓的游戏或APP. 我们曾推荐过 BlueStacks,而 Genymotion 则是另一款更加优秀专业高性能的安卓 Android 模拟器!它支持 Windows.Mac.Linux,由于其模拟运行速度很快画面流畅.且支持 OpenGL 3D 加速.多开.全屏等特性,并提供 Eclipse.IntelliJ IDEA 的开发插件,不仅是开发者们也是普通玩

有道词典 安卓版 更新日志 - imsoft.cnblogs

手机词典 更新日志: 2014年4月23日 v5.0.4版本 ·         新增“全球发音”功能,带来世界各国的英文口音,体验原汁原味的英语发音: ·         新增“发现频道”,打造移动端最大的在线学习平台,聚合新东方.外研社等大量高质量的教育机构及名师的语言学习课程.书籍资源,为您提供英语学习一站式服务: ·         新增单词本分类功能,个性化的管理您的单词本: ·         全新Logo与视觉风格,带来不一样的视觉体验. 2013年5月10日 v4.0.1版本 ·

使用WinRar软件制作程序安装包

之前我写过使用好压软件打包程序,见随笔: 使用好压(HaoZip)软件打包EverEdit制作安装程序 - Fetty - 博客园http://www.cnblogs.com/fetty/p/4907969.html 这次研究了下WinRar制作程序安装包,和好压大同小异. 使用的winrar版本为5.3,百度搜索一下,很容易下载到的. 打开需要制作安装包程序的目录,不要包含上层目录,点击“添加”按钮,配置压缩参数. “常规”选项中,勾选 “创建自解压格式压缩文件”和“锁定压缩文件”. 切换到“

浅谈安卓软件如何实现企业盈利

谷歌系统的开源性不仅提供了一个免费的平台,而且也让很多第三方Android应用程序商店加入其中.这其中还包括了亚马逊Android商店.与此同时,各大Android手机厂商以及运营商也纷纷开设了自己的安卓应用商店.这种情况在iOS,Symbian,乃至Windows Phone 7中是不存在的.在你争我夺的价格战背后,一系列新的疑问也随之而来.Android第三方应用商店真的能盈利吗?通过何种方式盈利?用户最关注的安全性又如何保障?借助谷歌庞大的广告网络,Android第三方应用最终会如何发展?

利用WSUS部署更新程序

WSUS概述 为了让用户的windows系统与其他microsoft产品能够更安全,更稳定,因此microsoft会不定期在网站上推出最新的更新程序供用户下载与安装,而用户可以通过以下方式来取得这些程序: 手动连接microsoft update网站 通过windows系统的自动更新功能 然而以上两种方式对企业内部来说,都可能会有以下缺点. 影响网络效率:如果企业内部每台计算机都自行上网更新,将会增加对外网络的负担. 与现有软件相互干扰:如果企业内部使用的软件与更新程序发生冲突,则用户自行下载与

基于libUSB的USB设备固件更新程序(下载数据)(转)

源:基于libUSB的USB设备固件更新程序(下载数据) 本文紧接上一篇日志:基于libUSB-Win32的USB设备固件更新程序(前言),相关背景以及起因等,此处不再赘述,如感兴趣请移步. libUSB-Win32给出的example里面,有一个bulk.c文件,分析其关键代码,结合libusb官方文档,摘出其关键代码如下: int main(void) { usb_dev_handle *dev = NULL; /* the device handle */ usb_init(); /* i

winform自动更新程序实现

一.问题背景 本地程序在实际项目使用过程中,因为可以操作电脑本地的一些信息,并且对于串口.OPC.并口等数据可以方便的进行收发,虽然现在软件行业看着动不动都是互联网啊啥的,大有Web服务就是高大上的感觉,但是作为本地的应用还是有着非常重要的位置,特别是在制造业工厂里,车间里相关的程序. 抛开一切业务上的功能不谈,本地程序一直比较诟病的地方就是在于软件的更新上,由于程序都在客户端电脑上运行,当需要更新的时候,就不得不由专门的实施人员过去,部署更新,无形中增加项目成本,SO,对于c/s程序的自动更新

安卓软件开发你知道需要学什么吗,看这里?

当下手机软甲开发越来越流行,开发主题也逐渐从公司到个人过渡.相对于经验薄弱的个人来说安卓软件开发需要学什么?具备怎样的基础呢? 1.Activity生命周期 Android中有四大组件,但Activity是最常用的,练掌握Android的生命周期是必须的.其实生命周期就是记住 Activity的那些方法在什么时候被系统调用,这样才可以把对应的逻辑代码写到合适的方法内部去. 2.界面开发技术 界面开发是一种基本的技术,几乎所有的程序里面都需要用到.在Android开发中界面开发分为3种: 1)使用