Android自动检测版本及自动升级
16lz
2022-06-05
转:http://blog.csdn.net/furongkang/article/details/6886526
步骤:
1.检测当前版本的信息AndroidManifest.xml-->manifest-->android:versionName。
2.从服务器获取版本号(版本号存在于xml文件中)并与当前检测到的版本进行匹配,如果不匹配,提示用户进行升级,如果匹配则进入程序主界面。
3.当提示用户进行版本升级时,如果用户点击了确定,系统将自动从服务器上下载并进行自动升级,如果点击取消将进入程序主界面。
效果图:
获取当前程序的版本号:
1 /* 2 * 获取当前程序的版本号 3 */ 4 private String getVersionName() throws Exception{ 5 //获取packagemanager的实例 6 PackageManager packageManager = getPackageManager(); 7 //getPackageName()是你当前类的包名,0代表是获取版本信息 8 PackageInfo packInfo = packageManager.getPackageInfo(getPackageName(), 0); 9 return packInfo.versionName; 10 }
获取服务器端的版本号:
1 /* 2 * 用pull解析器解析服务器返回的xml文件 (xml封装了版本号) 3 */ 4 public static UpdataInfo getUpdataInfo(InputStream is) throws Exception{ 5 XmlPullParser parser = Xml.newPullParser(); 6 parser.setInput(is, "utf-8");//设置解析的数据源 7 int type = parser.getEventType(); 8 UpdataInfo info = new UpdataInfo();//实体 9 while(type != XmlPullParser.END_DOCUMENT ){10 switch (type) {11 case XmlPullParser.START_TAG:12 if("version".equals(parser.getName())){13 info.setVersion(parser.nextText()); //获取版本号14 }else if ("url".equals(parser.getName())){15 info.setUrl(parser.nextText()); //获取要升级的APK文件16 }else if ("description".equals(parser.getName())){17 info.setDescription(parser.nextText()); //获取该文件的信息18 }19 break;20 }21 type = parser.next();22 }23 return info;24 }
从服务器下载apk:
1 public static File getFileFromServer(String path, ProgressDialog pd) throws Exception{ 2 //如果相等的话表示当前的sdcard挂载在手机上并且是可用的 3 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ 4 URL url = new URL(path); 5 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 6 conn.setConnectTimeout(5000); 7 //获取到文件的大小 8 pd.setMax(conn.getContentLength()); 9 InputStream is = conn.getInputStream();10 File file = new File(Environment.getExternalStorageDirectory(), "updata.apk");11 FileOutputStream fos = new FileOutputStream(file);12 BufferedInputStream bis = new BufferedInputStream(is);13 byte[] buffer = new byte[1024];14 int len ;15 int total=0;16 while((len =bis.read(buffer))!=-1){17 fos.write(buffer, 0, len);18 total+= len;19 //获取当前下载量20 pd.setProgress(total);21 }22 fos.close();23 bis.close();24 is.close();25 return file;26 }27 else{28 return null;29 }30 }
匹配、下载、自动安装:
1 /* 2 * 从服务器获取xml解析并进行比对版本号 3 */ 4 public class CheckVersionTask implements Runnable{ 5 6 public void run() { 7 try { 8 //从资源文件获取服务器 地址 9 String path = getResources().getString(R.string.serverurl); 10 //包装成url的对象 11 URL url = new URL(path); 12 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 13 conn.setConnectTimeout(5000); 14 InputStream is =conn.getInputStream(); 15 info = UpdataInfoParser.getUpdataInfo(is); 16 17 if(info.getVersion().equals(versionname)){ 18 Log.i(TAG,"版本号相同无需升级"); 19 LoginMain(); 20 }else{ 21 Log.i(TAG,"版本号不同 ,提示用户升级 "); 22 Message msg = new Message(); 23 msg.what = UPDATA_CLIENT; 24 handler.sendMessage(msg); 25 } 26 } catch (Exception e) { 27 // 待处理 28 Message msg = new Message(); 29 msg.what = GET_UNDATAINFO_ERROR; 30 handler.sendMessage(msg); 31 e.printStackTrace(); 32 } 33 } 34 } 35 36 Handler handler = new Handler(){ 37 38 @Override 39 public void handleMessage(Message msg) { 40 // TODO Auto-generated method stub 41 super.handleMessage(msg); 42 switch (msg.what) { 43 case UPDATA_CLIENT: 44 //对话框通知用户升级程序 45 showUpdataDialog(); 46 break; 47 case GET_UNDATAINFO_ERROR: 48 //服务器超时 49 Toast.makeText(getApplicationContext(), "获取服务器更新信息失败", 1).show(); 50 LoginMain(); 51 break; 52 case DOWN_ERROR: 53 //下载apk失败 54 Toast.makeText(getApplicationContext(), "下载新版本失败", 1).show(); 55 LoginMain(); 56 break; 57 } 58 } 59 }; 60 61 /* 62 * 63 * 弹出对话框通知用户更新程序 64 * 65 * 弹出对话框的步骤: 66 * 1.创建alertDialog的builder. 67 * 2.要给builder设置属性, 对话框的内容,样式,按钮 68 * 3.通过builder 创建一个对话框 69 * 4.对话框show()出来 70 */ 71 protected void showUpdataDialog() { 72 AlertDialog.Builder builer = new Builder(this) ; 73 builer.setTitle("版本升级"); 74 builer.setMessage(info.getDescription()); 75 //当点确定按钮时从服务器上下载 新的apk 然后安装 76 builer.setPositiveButton("确定", new OnClickListener() { 77 public void onClick(DialogInterface dialog, int which) { 78 Log.i(TAG,"下载apk,更新"); 79 downLoadApk(); 80 } 81 }); 82 //当点取消按钮时进行登录 83 builer.setNegativeButton("取消", new OnClickListener() { 84 public void onClick(DialogInterface dialog, int which) { 85 // TODO Auto-generated method stub 86 LoginMain(); 87 } 88 }); 89 AlertDialog dialog = builer.create(); 90 dialog.show(); 91 } 92 93 /* 94 * 从服务器中下载APK 95 */ 96 protected void downLoadApk() { 97 final ProgressDialog pd; //进度条对话框 98 pd = new ProgressDialog(this); 99 pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);100 pd.setMessage("正在下载更新");101 pd.show();102 new Thread(){103 @Override104 public void run() {105 try {106 File file = DownLoadManager.getFileFromServer(info.getUrl(), pd);107 sleep(3000);108 installApk(file);109 pd.dismiss(); //结束掉进度条对话框110 } catch (Exception e) {111 Message msg = new Message();112 msg.what = DOWN_ERROR;113 handler.sendMessage(msg);114 e.printStackTrace();115 }116 }}.start();117 }118 119 //安装apk 120 protected void installApk(File file) {121 Intent intent = new Intent();122 //执行动作123 intent.setAction(Intent.ACTION_VIEW);124 //执行的数据类型125 intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");126 startActivity(intent);127 }128 129 /*130 * 进入程序的主界面131 */132 private void LoginMain(){133 Intent intent = new Intent(this,MainActivity.class);134 startActivity(intent);135 //结束掉当前的activity 136 this.finish();137 }
UpdataInfo:
1 public class UpdataInfo { 2 private String version; 3 private String url; 4 private String description; 5 public String getVersion() { 6 return version; 7 } 8 public void setVersion(String version) { 9 this.version = version;10 }11 public String getUrl() {12 return url;13 }14 public void setUrl(String url) {15 this.url = url;16 }17 public String getDescription() {18 return description;19 }20 public void setDescription(String description) {21 this.description = description;22 }23 }
update.xml:
1 <?xml version="1.0" encoding="utf-8"?>2 <info>3 <version>2.0</version>4 <url>http://192.168.1.187:8080/mobilesafe.apk</url>5 <description>检测到最新版本,请及时更新!</description>6 </info>
更多相关文章
- 利用drozer进行Android渗透测试
- 花样Android(安卓)ProgressBar 史上最强大讲解
- android 按钮倒计时读秒
- Android(安卓)SQLite数据库升级的问题
- Android(安卓)常用dialog提示对话框
- android获取手机流量使用情况
- Android(安卓)Sudio 如何获取SHA1(开发版和发布版)
- Android应用程序获取ROOT权限的方法
- Android传感器编程入门(二)