1、获取当前安装版本
//获取当前版本 public int getVersion(Context context){ int version = 0; try { version = context.getPackageManager().getPackageInfo( "项目包名", 0).versionCode; } catch (Exception e) { System.out.println("获取版本号出错"); } return version; } //获取当前版本名称 public String getVersionName(Context context){ String versionName = null; try { versionName = context.getPackageManager().getPackageInfo( "项目包名", 0).versionName; } catch (Exception e) { System.out.println("获取版本名称出错"); } return versionName; }
2、检测服务器发布版本,创建一个ver.aspx 页面
[{"appname":"appName","apkname":"UpdateApp.apk","versionName":"2.0","version":"2"}]
3、检测服务器发布版本
public String getServerVersion(){ String serverJson = null; byte[] buffer = new byte[128]; try { URL serverURL = new URL(http_url+"/ver.aspx"); HttpURLConnection connect = (HttpURLConnection) serverURL.openConnection(); BufferedInputStream bis = new BufferedInputStream(connect.getInputStream()); int n = 0; while((n = bis.read(buffer))!= -1){ serverJson = new String(buffer); } } catch (Exception e) { System.out.println("获取服务器版本出错:"+e); } return serverJson; }
4、版本对比
public boolean compareVersion(Context context){ final Context contextTemp = context; new Thread(){ public void run() { Looper.prepare(); String serverJson = manager.getServerVersion(); //读取json try { JSONArray array = new JSONArray(serverJson); JSONObject object = array.getJSONObject(0); String getServerVersion = object.getString("version"); String getServerVersionName = object.getString("versionName"); SettingPage.serverVersion = Integer.parseInt(getServerVersion); SettingPage.serverVersionName = getServerVersionName; if(SettingPage.version < SettingPage.serverVersion){ // AlertDialog.Builder builder = new Builder(contextTemp); AlertDialog.Builder builder = new AlertDialog.Builder(contextTemp,R.style.Dialog);//使用浅色背景 主题 builder.setTitle("版本更新" ) ; builder.setMessage("本地版本号:"+SettingPage.versionName +"\n"+"服务器版本号:"+SettingPage.serverVersionName ) ; builder.setPositiveButton("确认下载",new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int arg1) { //下载apk new Thread(){ public void run() { Looper.prepare(); downloadApkFile(contextTemp); Looper.loop(); }; }.start(); } }); builder.setNegativeButton("取消", null); builder.show(); }else{ AlertDialog.Builder builder = new Builder(contextTemp); builder.setTitle("提示" ) ; builder.setMessage("当前使用版本为最新版" ) ; builder.setPositiveButton("确定",null); builder.show(); } } catch (JSONException e) { e.printStackTrace(); System.out.println("下载出错"+e); } Looper.loop(); }; }.start(); return false; }
5、下载服务器版本
public void downloadApkFile(Context context){ String savePath = Environment.getExternalStorageDirectory()+"/UpdateApp.apk"; String serverFilePath = http_url+"/UpdateApp.apk";//"/AndroidUpdateDemo.png"; try { if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){ URL serverURL = new URL(serverFilePath); HttpURLConnection connect = (HttpURLConnection) serverURL.openConnection(); BufferedInputStream bis = new BufferedInputStream(connect.getInputStream()); File apkfile = new File(savePath); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(apkfile)); int fileLength = connect.getContentLength(); int downLength = 0; int progress = 0; int n; byte[] buffer = new byte[1024]; while((n=bis.read(buffer, 0, buffer.length))!=-1){ bos.write(buffer, 0, n); downLength +=n; progress = (int) (((float) downLength / fileLength) * 100); Message msg = new Message(); msg.arg1 = progress; SettingPage.handler.sendMessage(msg); } bis.close(); bos.close(); connect.disconnect(); } } catch (Exception e) { System.out.println("下载出错"+e); } }
6、下载进度提醒
public class receiveVersionHandler extends Handler { @Override public void handleMessage(Message msg) { proBar.setProgress(msg.arg1); textView.setText("下载进度:"+msg.arg1+"%"+"\n"+"版本名称:"+versionName); if(msg.arg1 == 100){ Intent intent = new Intent(Intent.ACTION_VIEW); String path = Environment.getExternalStorageDirectory()+"/UpdateApp.apk"; intent.setDataAndType(Uri.fromFile(new File(path)), "application/vnd.android.package-archive"); startActivity(intent); } //proBar.setVisibility(R.id.button_id_1); } }
7、下载完成后手动安装即可
完整升级类代码
public class UpdateManager { private static UpdateManager manager = null; private static String http_url="http://127.0.0.1"; private UpdateManager(){} public static UpdateManager getInstance(){ manager = new UpdateManager(); return manager; } //获取当前版本号 public int getVersion(Context context){ int version = 0; try { version = context.getPackageManager().getPackageInfo( "项目包名", 0).versionCode; } catch (Exception e) { System.out.println("获取版本号出错"); } return version; } //获取当前版本名称 public String getVersionName(Context context){ String versionName = null; try { versionName = context.getPackageManager().getPackageInfo( "项目包名", 0).versionName; } catch (Exception e) { System.out.println("获取版本名称出错"); } return versionName; } //获取服务器发布的版本 public String getServerVersion(){ String serverJson = null; byte[] buffer = new byte[128]; try { URL serverURL = new URL(http_url+"/ver.aspx"); HttpURLConnection connect = (HttpURLConnection) serverURL.openConnection(); BufferedInputStream bis = new BufferedInputStream(connect.getInputStream()); int n = 0; while((n = bis.read(buffer))!= -1){ serverJson = new String(buffer); } } catch (Exception e) { System.out.println("获取服务器版本出错:"+e); } return serverJson; } //版本比较 public boolean compareVersion(Context context){ final Context contextTemp = context; new Thread(){ public void run() { Looper.prepare(); String serverJson = manager.getServerVersion(); //读取json try { JSONArray array = new JSONArray(serverJson); JSONObject object = array.getJSONObject(0); String getServerVersion = object.getString("version"); String getServerVersionName = object.getString("versionName"); SettingPage.serverVersion = Integer.parseInt(getServerVersion); SettingPage.serverVersionName = getServerVersionName; if(SettingPage.version < SettingPage.serverVersion){ // AlertDialog.Builder builder = new Builder(contextTemp); AlertDialog.Builder builder = new AlertDialog.Builder(contextTemp,R.style.Dialog);//使用浅色背景 主题 builder.setTitle("版本更新" ) ; builder.setMessage("本地版本号:"+SettingPage.versionName +"\n"+"服务器版本号:"+SettingPage.serverVersionName ) ; builder.setPositiveButton("确认下载",new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int arg1) { //下载apk new Thread(){ public void run() { Looper.prepare(); downloadApkFile(contextTemp); Looper.loop(); }; }.start(); } }); builder.setNegativeButton("取消", null); builder.show(); }else{ AlertDialog.Builder builder = new Builder(contextTemp); builder.setTitle("提示" ) ; builder.setMessage("当前使用版本为最新版" ) ; builder.setPositiveButton("确定",null); builder.show(); } } catch (JSONException e) { e.printStackTrace(); System.out.println("下载出错"+e); } Looper.loop(); }; }.start(); return false; } //下载apk public void downloadApkFile(Context context){ String savePath = Environment.getExternalStorageDirectory()+"/UpdateApp.apk"; String serverFilePath = http_url+"/UpdateApp.apk";//"/AndroidUpdateDemo.png"; try { if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){ URL serverURL = new URL(serverFilePath); HttpURLConnection connect = (HttpURLConnection) serverURL.openConnection(); BufferedInputStream bis = new BufferedInputStream(connect.getInputStream()); File apkfile = new File(savePath); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(apkfile)); int fileLength = connect.getContentLength(); int downLength = 0; int progress = 0; int n; byte[] buffer = new byte[1024]; while((n=bis.read(buffer, 0, buffer.length))!=-1){ bos.write(buffer, 0, n); downLength +=n; progress = (int) (((float) downLength / fileLength) * 100); Message msg = new Message(); msg.arg1 = progress; SettingPage.handler.sendMessage(msg); } bis.close(); bos.close(); connect.disconnect(); } } catch (Exception e) { System.out.println("下载出错"+e); } } }
同时可以参考下面博客,源码实现不同,实现效果大同小异
http://www.cnblogs.com/coolszy/archive/2012/04/27/2474279.html