一、首先,参考了以下文章《Android自动检测版本及自动升级》

http://www.linuxidc.com/Linux/2011-10/45718p2.htm:

步骤:

.检测当前版本的信息AndroidManifest.xml-->manifest-->android:versionName。

.从服务器获取版本号(版本号存在于xml文件中)并与当前检测到的版本进行匹配,如果不匹配,提示用户进行升级,如果匹配则进入程序主界面。

.当提示用户进行版本升级时,如果用户点击了确定,系统将自动从服务器上下载并进行自动升级,如果点击取消将进入程序主界面。

[java] view plaincopy
获取当前程序的版本号: ./*
2. * 获取当前程序的版本号
3. */
.private String getVersionName() throws Exception{
. //获取packagemanager的实例
. PackageManager packageManager = getPackageManager();
. //getPackageName()是你当前类的包名,0代表是获取版本信息
. PackageInfo packInfo = packageManager.getPackageInfo(getPackageName(), );
. return packInfo.versionName;
.}
[java] view plaincopy
获取服务器端的版本号:
./*
2. * 用pull解析器解析服务器返回的xml文件 (xml封装了版本号)
3. */
.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;
.}
[java] view plaincopy
从服务器下载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();
. //获取到文件的大小
. 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[];
. int len ;
. int total=;
. while((len =bis.read(buffer))!=-){
. fos.write(buffer, , len);
. total+= len;
. //获取当前下载量
. pd.setProgress(total);
. }
. fos.close();
. bis.close();
. is.close();
. return file;
. }
. else{
. return null;
. }
.}
匹配、下载、自动安装: [java] view plaincopy
/*
* 从服务器获取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();
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();
}
}
}
[java] view plaincopy
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(), "获取服务器更新信息失败", ).show();
LoginMain();
break;
case DOWN_ERROR:
//下载apk失败
Toast.makeText(getApplicationContext(), "下载新版本失败", ).show();
LoginMain();
break;
}
}
};
[java] view plaincopy
/*
*
* 弹出对话框通知用户更新程序
*
* 弹出对话框的步骤:
* 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();
}
[java] view plaincopy
/*
* 从服务器中下载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();
installApk(file);
pd.dismiss(); //结束掉进度条对话框
} catch (Exception e) {
Message msg = new Message();
msg.what = DOWN_ERROR;
handler.sendMessage(msg);
e.printStackTrace();
}
}}.start();
}
[java] view plaincopy
//安装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");//编者按:此处Android应为android,否则造成安装不了
startActivity(intent);
}
[java] view plaincopy
/*
* 进入程序的主界面
*/
private void LoginMain(){
Intent intent = new Intent(this,MainActivity.class);
startActivity(intent);
//结束掉当前的activity
this.finish();
}
二、参考后使用情况:
.可以下载apk,但安装失败: )以为配置文件中需定义了android.permission.INSTALL_PACKAGES,其实不需; )以为是要在执行安装的activity中配置 [html] view plaincopy
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
,其实不是; )代码中application/vnd.Android.package-archive有一个字母A大写了,改小写后解决;

Android提示版本更新的实现的更多相关文章

  1. Xamarin.Android提示aapt退出,代码为255

    Xamarin.Android提示aapt退出,代码为255 错误信息:”aapt.exe”已退出,代码为255.出现这种问题,通常是由于该项目所使用Android SDK不完整.通过SDK Mana ...

  2. Xamarin.Android提示找不到mono.Android.Support.v4

    Xamarin.Android提示找不到mono.Android.Support.v4 错误信息:Error: Exception while loading assemblies: System.I ...

  3. Xamarin Android提示内存溢出错误

    Xamarin Android提示内存溢出错误 错误信息:java.lang.OutOfMemoryError, Consider increasing the value of $(JavaMaxi ...

  4. Xamarin Android提示找不到资源属性定义

    Xamarin Android提示找不到资源属性定义 错误信息:”Resource.Attribute”未包含”actonBarSize”的定义Xamarin Android经常会出现找不到资源属性的 ...

  5. SweetTips: 快意灵动的Android提示库!

    此文章是我在简书的文章,自行搬到博客园.简书地址:SweetTips: 快意灵动的Android提示库! 源码及所在DEMO已上传至GitHub:SweetTips,欢迎大家提Bug,喜欢的话记得St ...

  6. Android提示版本号更新操作流程

    Android提示版本号更新操作流程 2014年5月8日: andorid的app应用中都会有版本号更新的操作,今天空暇的时候就花了点心思弄了一下.主要技术方面用到了AsyncTask异步载入.htt ...

  7. android应用版本更新功能---完整版

    源码下载地址:csdn下载地址:http://download.csdn.net/download/csdn576038874/9526085 博客园下载地址:http://files.cnblogs ...

  8. Android软件版本更新

     转的:适合新手学习,但在实际项目中不可这么做. 以下是我转的内容: ================================================================= ...

  9. android检测版本更新

    原理就是从服务器获取版本号和本得apk的版本号对比更新: //检查更新        Activity activity = this;        while(activity.getParent ...

随机推荐

  1. bzoj 3211 线段树

    开方操作最多进行5次就可以把出现的任何数变成1. 所以用线段树暴力修改,以后修改时只需看一下是否当前区间都是0或1,如果是那么就直接返回. /***************************** ...

  2. bzoj 3262

    题意:给你一些三维上的点,对于每个点,统计三个坐标都小于等于该点的点数. 如果点的范围在300以内,可以用三维树状数组搞,但这题坐标范围太大. 考虑将所有点按照x坐标排序,从左到右,相当于在一个二维平 ...

  3. 详解linux中的ps命令

    Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信 ...

  4. CentOS 7编译openssl

    # 编译安装zlib库wget http://zlib.net/zlib-1.2.11.tar.gztar -zxvf zlib-1.2.11.tar.gz cd zlib-1.2.11 ./conf ...

  5. USB Mass Storage Class – Bulk Only Transport - Error Handling

    6.4 Device Error Handling The device may not be able to fully satisfy the host's request. At the poi ...

  6. 关于OPC Client 编写

    昨天又有人问我 OPC Client 编写,实际是他们不了解OPC 客户端的工作原理,要想写客户端程序,必须知道OPC对象, OPC逻辑对象模型包括3类对象:OPC server对象.OPC grou ...

  7. java 入门书籍(java7)

    一.Java从入门到精通 <Java从入门到精通(第3版)>从刚開始学习的人角度出发,通过通俗易懂的语言.丰富多彩的实例.具体介绍了使用Java语言进行程序开发须要掌握的知识. <J ...

  8. 使用jQuery异步传递Model到控制器方法,并异步返回错误信息

    需要通过jquery传递到控制器方法的Model为: public class Person { public string Name { get; set; } public int Age { g ...

  9. Unity的界面排版: RectTransform

    看Unity3D文档像看国内教课书一样,一些概念,不懂的时候看还是不懂,明白了以后再看,好像也没有说错.好几个做Unity3D的朋友跟我吐槽过U3D的文档质量,相比Apple贴心的技术文档相去甚远. ...

  10. KJBitmap与KJHttp的深度用法

    摘要 本文原创,转载请注明地址:http://kymjs.com/code/2015/09/24/01这篇文章是对KJFrameForAndroid使用的一个深入学习 之前写过一些有关KJFrame的 ...