问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何对Android的版本进行检测与更新37

发布网友 发布时间:2024-02-09 00:10

我来回答

4个回答

热心网友 时间:2024-04-02 02:41

一、准备

  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"/>

热心网友 时间:2024-04-02 02:40

设置-关于手机,一般都在这里。

热心网友 时间:2024-04-02 02:39

应在Toast.LENGTH_SHORT).show();后面加上break;最新版本不需要显示更新

热心网友 时间:2024-04-02 02:45

设置,版本
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
为什么起点中文网上传小说怎么也分不了段?ji 我在手机起点网写小说,请问大家怎样换行? “千古兴亡泰伯国”的出处是哪里 ...登京口北固亭有怀古》原文赏析及翻译(千古兴亡多少事) “千古兴亡一梦惊”的出处是哪里 千古兴亡多少事的翻译是什么 《千古兴亡多少事,悠悠。不尽长江滚滚流。 (宋·辛弃》古诗原文及翻译... 办理蚂蚁宝卡后可以转换成使用原联通号码 蚂蚁宝卡可以变更成其他4G套餐吗 状态空间模型状态空间模型的建立和预测的步骤 请问怎样才没让安卓app永远不提示更新,想一直用老版本?? “帮帮”APP是怎么查看版本?能在软件里面更新到最新版本吗?1 hbuider 如何检测app版本更新 姓阮女孩子名字独特好听的起名用字 姓阮女孩子名字独特好听的起名宜用字 挽回男友全攻略 七招成功挽回前男友 跑步真的溶解肌肉吗?跑步和健身冲突吗? 练好肌肉之后,去跑步那个肌肉会消融了吗 主意还是想法哪个对 ?这是黄水晶吗?是真的吗?发晶跟黄水晶有什么区别吗? 爬杆脚扣要怎么站才标准? 气虚原因导致的排便困难,长时间便秘怎么调理呢?吃什么比较好呢?_百 ... 百度贴吧app如何收藏进度 打造理想三室一厅家居:从装修到细节,一应俱全 谁可以说一说貔貅和麒麟的区别 混凝土结构的极限状态可分为()。 谁能够说一说黄玉和黄水晶那个贵 12320咨询服务范围_百度问一问 ...根据个人档案里的什么资料判断存档人的家庭成员有几人? 2000年的初中学历档案里面有家庭成员吗 照片加水印怎么加? 为什么戴尔笔记本电脑电池网上查着是2200毫安,但是实际上是4000多毫安... 谁有《天天向上》有金敏智的那集视频地址?谢谢啦 梦见袋子里稻谷飘在浑水上 有一个没有情义的堂兄弟要绝交吗 ...兄弟就是一家人,哥哥疼爱弟弟可以无私奉献,堂兄弟不一样? 血糖高能吃减肥的纤体梅吗 纤体梅多久有效果 ? 堂妹结婚时,堂哥要给红包么 电脑店给配的5000块的电脑,为什么感觉吃鸡玩着不流畅 我想组装一台可以玩吃鸡的台式电脑,价格控制在5000以内。谁给我列一... 想去迈阿密看电音节,需要多少开销,住宿吃东西、来回机票、门票_百度知 ... 注册了p卡,怎么得到美国银行的卡号 payoneer美国银行账户是怎么回事 如果使用美国银行账户,美国银行账户有哪些 放弃7系反手提宝马540Li,这辆上路75万的顶配5系太香 | 车主评车_百度... 杭州亚运会奖牌设计有哪些突破 烤漆门和免漆门:环保之选 河南北部那里种植平菇(蘑菇)的比较多? 刚买的2015耐克骚粉色气垫鞋,求各路大神帮我鉴别一下真伪,1100买的_百 ...