怎么对Android的版本进行检测与更新

Android

1个回答

写回答

Znnmao

2025-10-15 18:10

+ 关注

Android
Android

  一、准备

  1.检测当前版本的信息AndroidManifest.XML--manifest--Android:versionName。

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

XML
XML

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

  二、效果图

   三、必要说明

  服务器端存储apk文件,同时有version.XML文件便于比对更新。

  ?XML version=1.0 encoding=utf-8?  info  version2.0/version  urlhttp://192.168.1.187:8080/mobilesafe.apk/url  description检测到最新版本,请及时更新!/description  url_serverhttp://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=helloHello World, VersionActivity!/string  string name=app_nameVersion/string  string name=url_serverhttp://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/

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号