Welcome

首页 / 移动开发 / Android / Android编程实现自动检测版本及自动升级的方法

本文实例讲述了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(){@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubsuper.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 stubLoginMain();}});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(){@Overridepublic 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();}//安装apkprotected 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);//结束掉当前的activitythis.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程序设计有所帮助。