马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 青玄 于 2014-12-4 09:21 编辑
版本版本更新: 实现原理:通过向服务器端发送请求,获取服务端的版本信息,然后再与本机上的软件进行比对,如果版本不一致的话,那就得更新版本! 首先需要一个打开的欢迎界面:
在这个欢迎界面打开的时候就要判断此软件的版本是否要更新!
需要说明的是在服务器端这边的时候,发给客户顿的是一个json数据,为了更加明确的说明一下,服务端的大概代码是这样的:
- import java.io.File;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.List;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import net.sf.json.JSONArray;
- import cn.cxrh.daomain.mobile;
- public class MobileSafeServlet extends HttpServlet {
- File file = null;
-
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- // TODO Auto-generated method stub
-
- List<mobile> mobiles = new ArrayList<mobile>();
- mobiles.add(new mobile("2.0","http://192.168.128.1:8080/safemobile_server/software/qqliulanqi.apk","小白马提醒您,软件是否更新!^_^!"));
-
-
- JSONArray json = JSONArray.fromObject(mobiles);
- resp.getOutputStream().write(json.toString().getBytes("utf-8"));
-
- }
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- // TODO Auto-generated method stub
- super.doGet(req, resp);
- }
-
- }
复制代码注意:这里要说明的是,在服务端进行json数据的发送的时候,还需要用到json的jar包! 然后就是客户端这边的处理了! 首先是需要的一个utils工具类: - package com.example.safemobile_test.utils;
- import java.io.ByteArrayOutputStream;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.net.HttpURLConnection;
- import java.net.MalformedURLException;
- import java.net.ProtocolException;
- import java.net.URL;
- import org.json.JSONArray;
- import org.json.JSONException;
- import org.json.JSONObject;
- import android.app.ProgressDialog;
- import android.content.Context;
- import android.os.Environment;
- import android.util.Log;
- import com.example.safemobile_test.daomain.Info;
- public class Utils {
- /**
- * 读取服务端发过来的输入流信息,并把它转化为字符串
- * @param is 输入流
- * @return
- * @throws Exception
- */
- public static String readJson(InputStream is) throws Exception
- {
- ByteArrayOutputStream bao = new ByteArrayOutputStream();
- byte[] buffer = new byte[1024];
- int len = -1;
-
- while((len = is.read(buffer)) != -1)
- {
- bao.write(buffer, 0, len);
- }
- is.close();
- bao.close();
-
- return new String(bao.toByteArray());
-
- }
- /**
- * 用json解析来获取服务端的信息
- * @param path 这个得路径指的是需要访问服务器端的地址
- * @return 返回的是一个javabean的对象
- * @throws Exception
- */
- public static Info getServerInfo(String path) throws MalformedURLException,ProtocolException,JSONException,IOException,Exception
- {
- URL url = new URL(path);
- HttpURLConnection conn = (HttpURLConnection) url.openConnection();
- conn.setRequestMethod("GET");
- conn.setReadTimeout(5000);
- int code = conn.getResponseCode();
-
- if(code == 200)
- {
- InputStream is = conn.getInputStream();
-
- JSONArray jsonArray = new JSONArray(readJson(is));
- Info info = new Info();
-
- for(int i=0; i < jsonArray.length(); i++)
- {
- JSONObject object = jsonArray.getJSONObject(i);
- info.setVersion(object.getString("version"));
- info.setDesc(object.getString("desc"));
- info.setPath(object.getString("path"));
- Log.i("Utils", object.getString("version"));
-
- }
- return info;
- }
- return null;
-
- }
- /**
- * 从服务端下载需要更新的软件
- * @param file 要存放到sdcard的文件的对象
- * @param path 要访问服务端的地址
- * @param pd 进度条
- * @return 返回存放文件的文件对象
- */
- public static File updateSoft(File file,String path,ProgressDialog pd)
- {
-
- try {
- URL url = new URL(path);
- HttpURLConnection conn = (HttpURLConnection) url.openConnection();
- conn.setRequestMethod("GET");
- conn.setReadTimeout(5000);
- int fileLength = conn.getContentLength();
- pd.setMax(fileLength);
- int code = conn.getResponseCode();
- if(code == 200)
- {
- FileOutputStream fos = new FileOutputStream(file);
-
- InputStream is= conn.getInputStream();
- byte[] buffer = new byte[1024];
-
- int len = -1;
- int total = 0;
-
- while((len = is.read(buffer)) != -1)
- {
- total += len;
- fos.write(buffer, 0, len);
- pd.setProgress(total);
- }
- fos.close();
- is.close();
- pd.dismiss();
- return file;
- }
- } catch (MalformedURLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (ProtocolException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
-
- return null;
- }
- }
复制代码
然后就是版本更新的主要代码,也是主类的代码:
- package com.example.safemobile_test;
- import java.io.File;
- import java.io.IOException;
- import java.net.MalformedURLException;
- import org.apache.http.ProtocolException;
- import org.json.JSONException;
- import com.example.safemobile_test.daomain.Info;
- import com.example.safemobile_test.utils.Utils;
- import com.example.service.BlackNumberService;
- import android.app.Activity;
- import android.app.AlertDialog;
- import android.app.AlertDialog.Builder;
- import android.app.ProgressDialog;
- import android.content.DialogInterface;
- import android.content.DialogInterface.OnClickListener;
- import android.content.Intent;
- import android.content.pm.PackageInfo;
- import android.content.pm.PackageManager;
- import android.content.pm.PackageManager.NameNotFoundException;
- 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.widget.TextView;
- import android.widget.Toast;
- public class splashactivity extends Activity {
- protected static final int URL_ERROR = 1;
- protected static final int PROTOCOL_ERROR = 2;
- protected static final int JSON_PARSER_ERROR = 3;
- protected static final int INTERNET_ERROR = 4;
- protected static final int READ_DATA_ERROR = 5;
- protected static final int LOAD_MAIN = 6;
- protected static final int SHOW_DIALOG = 7;
- protected static final int UPDADTE_SOFT = 8;
- protected static final int DOWNLOAD_FILE_FAILURE = 9;
- private TextView tv_splash_version;
- private Handler handler;
- private long startTime = 0;
- private Info info = null;
- private ProgressDialog pd;
- private File file;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_splash);
- tv_splash_version = (TextView) this.findViewById(R.id.te_splash_version);
- this.tv_splash_version.setText("版本:" + this.getVersion()); //获取当前的版本
- handler = new Handler(){
- @Override
- public void handleMessage(Message msg) { //接收消息队列里面的消息
- // TODO Auto-generated method stub
- switch (msg.what) {
- case URL_ERROR:
- Toast.makeText(splashactivity.this, "url错误", Toast.LENGTH_LONG).show();
- loadMain();
- break;
- case PROTOCOL_ERROR:
- Toast.makeText(splashactivity.this, "请求方式错误", Toast.LENGTH_LONG).show();
- loadMain();
- break;
- case JSON_PARSER_ERROR:
- Toast.makeText(splashactivity.this, "JSON解析错误", Toast.LENGTH_LONG).show();
- loadMain();
- break;
- case INTERNET_ERROR:
- Toast.makeText(splashactivity.this, "网络链接错误", Toast.LENGTH_LONG).show();
- loadMain();
- break;
- case READ_DATA_ERROR:
- Toast.makeText(splashactivity.this, "数据解析错误", Toast.LENGTH_LONG).show();
- loadMain();
- break;
- case LOAD_MAIN:
- loadMain();
- break;
- case SHOW_DIALOG:
- showDialog();
- break;
- case UPDADTE_SOFT:
- File file = (File) msg.obj;
- installApk(file);
- break;
- case DOWNLOAD_FILE_FAILURE:
- Toast.makeText(splashactivity.this, "文件下载失败", Toast.LENGTH_LONG).show();
- loadMain();
- break;
- }
- }
-
- };
- /********************************************************************************************/
- //子线程去检查服务器是否有新的版本
- this.checkServiceVersion();
- }
- /**
- * ***************此方法是查找此软件的版本是否要更新
- */
- private void checkServiceVersion()
- {
- new Thread() //开一个子线程,因为主线程不要太多的工作,不然会容易阻塞的
- {
- public void run()
- {
- //连接互联网
- startTime = System.currentTimeMillis();
-
- String path = "http://192.168.128.1:8080/safemobile_server/safemobile_ser"; //访问服务端的地址
- Message msg = Message.obtain(); //获得消息对象
- try
- {
- //loadMain();
- info = Utils.getServerInfo(path); //通过json解析获得需要的信息
- Log.i("splashactivity", "版本号:"+ info.getVersion());
- if(getVersion().equals(info.getVersion()))
- {
- msg.what = LOAD_MAIN;
- }else
- {
- msg.what = SHOW_DIALOG;
- }
- } catch (MalformedURLException e) {
- e.printStackTrace();
- msg.what=URL_ERROR;
- } catch (ProtocolException e) {
- e.printStackTrace();
- msg.what=PROTOCOL_ERROR;
- }catch (JSONException e) {
- msg.what=JSON_PARSER_ERROR;
- }catch (IOException e) {
- e.printStackTrace();
- msg.what=INTERNET_ERROR;
- }catch (Exception e) {
- e.printStackTrace();
- msg.what=READ_DATA_ERROR;
-
- }finally
- {
- long edntime = System.currentTimeMillis();
- long data = edntime-startTime;
- if(data < 2000)
- {
- try
- {
- Thread.sleep(2000 - data);
- }catch(Exception e)
- {
- e.printStackTrace();
- }
-
- handler.sendMessage(msg);
- }
- }
- }
- }.start();
- }
- /**
- * 如果要更新的话就显示一个更新的对话框
- */
- public void showDialog()
- {
- AlertDialog.Builder builder = new Builder(this);
- builder.setIcon(R.drawable.ic_launcher);
- builder.setTitle("升级提醒");
- builder.setMessage(info.getDesc());
- builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
-
- @Override
- public void onCancel(DialogInterface dialog) {
- // TODO Auto-generated method stub
- loadMain();
- }
- });
-
- builder.setNegativeButton("否", new OnClickListener(){
- @Override
- public void onClick(DialogInterface dialog, int which) {
- loadMain();
-
- }
-
- });
-
- builder.setPositiveButton("是", new OnClickListener(){
- @Override
- public void onClick(DialogInterface dialog, int which) {
-
- if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
- {
- file = new File(Environment.getExternalStorageDirectory(), info.getPath().substring(info.getPath().lastIndexOf("/")+1));
- pd = new ProgressDialog(splashactivity.this);
- pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
- pd.setIcon(R.drawable.ic_launcher);
- pd.setTitle("下载文件");
- pd.setMessage("文件正在下载,请稍后...");
- pd.show();
-
- new Thread(){
- public void run()
- {
- File newFile = Utils.updateSoft(file, info.getPath(), pd);
- if(newFile !=null)
- {
- installApk(newFile);
- }else
- {
- Log.i("splashactivity-->newfile: ", newFile+"" + info.getPath());
- Message msg = Message.obtain();
- msg.what = DOWNLOAD_FILE_FAILURE;
- handler.sendMessage(msg);
- }
- }
- }.start();
- }else
- {
- Toast.makeText(splashactivity.this, "sdcard不可用", Toast.LENGTH_LONG).show();
- }
-
- }
-
- });
- builder.show();
- }
- /**
- * 跳转主页面的方法
- */
- public void loadMain()
- {
- Intent intent = new Intent(this,MainActivity.class);
- startActivity(intent);
- // Intent blackNumberintent = new Intent(this, BlackNumberService.class);
- // startService(blackNumberintent);
- finish();
- }
- /**
- *
- * 安装应用
- * @param file
- */
- public 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);
- this.finish();
- }
-
- /**
- * 获取当前的版本
- */
- public String getVersion()
- {
- PackageManager packageManager = this.getPackageManager();
- try
- {
- PackageInfo info = packageManager.getPackageInfo(getPackageName(), PackageManager.GET_ACTIVITIES);
- String version = info.versionName;
- return version;
- }catch(Exception e)
- {
- e.printStackTrace();
- return "";
- }
-
- }
- }
复制代码如果地址错误或者连不上网的话,就出现这个:
如果连接正确的话就是:
然后就进行下载更新:
完成安装之后就进入到主界面:
|