如何对Android的版本进行检测与更新
来源:互联网 发布:vb timer interval 编辑:程序博客网 时间:2024/06/03 08:54
一、准备 1.检测当前版本的信息AndroidManifest.xml-->manifest-->android:versionName。 2.从服务器获取版本号(版本号存在于xml文件中)并与当前检测到的版本进行匹配,如果不匹配,提示用户进行升级,如果匹配则进入程序主界面。 3.当提示用户进行版本升级时,如果用户点击了确定,系统将自动从服务器上下载并进行自动升级,如果点击取消将进入程序主界面。 二、效果图 三、必要说明 服务器端存储apk文件,同时有version.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> <url_server>http://192.168.1.99/version.xml</url_server> </info> 通过一个实体类获取上述信息。 package com.android; public class UpdataInfo { private String version; private String url; private String description; private String url_server; public String getUrl_server() { return url_server; } public void setUrl_server(String url_server) { this.url_server = url_server; } 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; } } apk和版本信息地址都放在服务器端的version.xml里比较方便,当然如果服务器端不变动,apk地址可以放在strings.xml里,不过版本号信息是新的,必须放在服务器端,xml地址放在strings.xml。 <?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, VersionActivity!</string> <string name="app_name">Version</string> <string name="url_server">http://192.168.1.99/version.xml</string> </resources> 不知道读者发现没有,笔者犯了个错误,那就是url_server地址必须放在本地,否则怎么读取version.xml,所以url_server不必在实体类和version里添加,毕竟是现需要version地址也就是url_server,才能够读取version。 三、代码实现 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/btn_getVersion" android:text="检查更新" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout> package com.android; import java.io.InputStream; import org.xmlpull.v1.XmlPullParser; import android.util.Xml; public class UpdataInfoParser { 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()); }else if ("description".equals(parser.getName())){ info.setDescription(parser.nextText()); } break; } type = parser.next(); } return info; } } package com.android; import java.io.File; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import android.app.Activity; import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; public class VersionActivity extends Activity { private final String TAG = this.getClass().getName(); private final int UPDATA_NONEED = 0; private final int UPDATA_CLIENT = 1; private final int GET_UNDATAINFO_ERROR = 2; private final int SDCARD_NOMOUNTED = 3; private final int DOWN_ERROR = 4; private Button getVersion; private UpdataInfo info; private String localVersion; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); getVersion = (Button) findViewById(R.id.btn_getVersion); getVersion.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { try { localVersion = getVersionName(); CheckVersionTask cv = new CheckVersionTask(); new Thread(cv).start(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); } private String getVersionName() throws Exception { //getPackageName()是你当前类的包名,0代表是获取版本信息 PackageManager packageManager = getPackageManager(); PackageInfo packInfo = packageManager.getPackageInfo(getPackageName(), 0); return packInfo.versionName; } public class CheckVersionTask implements Runnable { InputStream is; public void run() { try { String path = getResources().getString(R.string.url_server); URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url .openConnection(); conn.setConnectTimeout(5000); conn.setRequestMethod("GET"); int responseCode = conn.getResponseCode(); if (responseCode == 200) { // 从服务器获得一个输入流 is = conn.getInputStream(); } info = UpdataInfoParser.getUpdataInfo(is); if (info.getVersion().equals(localVersion)) { Log.i(TAG, "版本号相同"); Message msg = new Message(); msg.what = UPDATA_NONEED; handler.sendMessage(msg); // 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_NONEED: Toast.makeText(getApplicationContext(), "不需要更新", Toast.LENGTH_SHORT).show(); case UPDATA_CLIENT: //对话框通知用户升级程序 showUpdataDialog(); break; case GET_UNDATAINFO_ERROR: //服务器超时 Toast.makeText(getApplicationContext(), "获取服务器更新信息失败", 1).show(); break; case DOWN_ERROR: //下载apk失败 Toast.makeText(getApplicationContext(), "下载新版本失败", 1).show(); 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 DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { Log.i(TAG, "下载apk,更新"); downLoadApk(); } }); builer.setNegativeButton("取消", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub //do sth } }); 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); } } package com.android; import java.io.BufferedInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import android.app.ProgressDialog; import android.os.Environment; public class DownLoadManager { 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; } } } <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
0 0
- 如何对Android的版本进行检测与更新
- Android程序的版本检测与更新
- Android程序的版本检测与更新
- Android版本检测与更新
- Android版本检测与更新
- Android版本检测与更新
- Android版本检测与更新
- Android 的版本更新检测
- Android 检测版本更新
- Android检测版本更新
- Android检测版本更新
- Android检测版本更新
- Android 版本检测更新
- android检测版本更新
- Android版本检测更新
- Android检测版本更新
- Android版本检测更新
- Android检测版本更新
- 一个单例模式的简单例子
- HTML5 input placeholder 颜色修改示例
- px,em,rem 解释精透
- Java混淆器和java混淆编译
- 程序员应该知道的七个图形工具
- 如何对Android的版本进行检测与更新
- PhalGo-Request
- 项目从tomcat向weblogic迁移遇到的一些问题
- java 利用二进制位进行标记,获取不相同的随机数
- shape中gradient属性介绍
- HDU 3564 线段树+简单DP
- android: 横竖屏切换总结-布局改变和数据保存
- 文章标题
- 安卓事件分发