首先是UpdateHelper类,检测版本是否要更新
package com.caojing.about;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.content.Context;
import android.content.DialogInterface;
public class UpdateHelper {
private Context context;
public UpdateHelper(Context context){
this.context = context;
}
private boolean checkVersion(String version){
Pattern pattern = Pattern.compile("[0-9]{1,4}\\.[0-9]{1,4}\\.[0-9]{1,4}");
Matcher matcher = pattern.matcher(version);
if(matcher.find())
return true;
return false;
}
/**
* 根据服务器版本号和客户端版本号检查是否需要弹出更新提示框,
* 请在执行本类的update之前进行判断,方便后续进入的方法
* @param serverVersion 当前服务器版本号
* @param clientVersion 当前客户端版本号
* @return boolean 是否需要提示升级
*/
public boolean checkUpdate(String serverVersion, String clientVersion){
if(checkVersion(serverVersion)&&checkVersion(clientVersion))
if(parseVersion(serverVersion)>parseVersion(clientVersion))
return true;
return false;
}
/**
* 根据downloadUrl下载更新包,并且更新程序,在调用本方法前请先检查是否需要下载
* @param downloadUrl 下载更新包的url,此url必须能正常访问到
* @param savePath 升级下载的更新包存放的地址,需要完整路径
* @param onCancelListener 弹出对话框后点击不升级的响应事件
* @param updateflag 0为提醒更新,1为强制更新
*/
public void update(final String downloadUrl, final String savePath, DialogInterface.OnClickListener onCancelListener,final String updateflag){
CustomDialog.getInst().showUpdateConfirmDialog(context, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
HttpDownloader downloader = new HttpDownloader(context);
downloader.downloadFile(downloadUrl, savePath, true,updateflag);
}
}, onCancelListener);
}
public void updateMandatory(final String downloadUrl, final String savePath, DialogInterface.OnClickListener onCancelListener,final String updateflag){
CustomDialog.getInst().showUpdateConfirmDialogMandatory(context, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
HttpDownloader downloader = new HttpDownloader(context);
downloader.downloadFile(downloadUrl, savePath, true,updateflag);
}
},onCancelListener);
}
private int parseVersion(String version){
int versionInteger = 0;
String versionString = "";
String[] arr = version.split("\\.");
for(int i = 0; i < arr.length; i++){
String s = arr[i];
while(s.length()<4)
s = "0" + s;
arr[i] = s;
}
for(int i = 0; i < arr.length; i++)
versionString += arr[i];
versionInteger = Integer.parseInt(versionString);
return versionInteger;
}
}
package com.caojing.about;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.widget.Toast;
public class HttpDownloader {
private URL url = null;
private String fullFilePath;
private ProgressDialog downloadDialog;
private int downloadedSize = 0; // 已下載的文件大小(bit)
private int fileTotalSize; // 文件的總大小(bit)
private static final int START_DOWNLOAD = 0x0;
private static final int DOWNLOADING = 0x1;
private static final int DOWNLOADED = 0x2;
private static final int DOWNLOAD_ERROR = -1;
private static final int PREV_CHECK = 10;
private Context ctx;
private File file;
private String errorMsg;
private boolean isOpen;
private Handler mainThreadHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case PREV_CHECK:{
break;
}
case START_DOWNLOAD: {
downloadDialog.show();
downloadDialog.setMax(fileTotalSize);
break;
}
case DOWNLOADING: {
downloadDialog.setProgress(downloadedSize);
break;
}
case DOWNLOADED: {
downloadDialog.dismiss();
Toast.makeText(ctx, "文件下载完成", Toast.LENGTH_SHORT).show();
if(isOpen){
OpenFileHelper ofp = new OpenFileHelper(ctx);
ofp.openFile(file);
}
break;
}
case DOWNLOAD_ERROR: {
if(downloadDialog.isShowing())
downloadDialog.dismiss();
Toast.makeText(ctx, errorMsg, Toast.LENGTH_SHORT).show();
if(file!=null)
FileUtils.delete(file.toString());
break;
}
default:
break;
}
super.handleMessage(msg);
}
};
public HttpDownloader(Context ctx){
this.ctx = ctx;
}
/**
* 该私有方法用于向mainThreadHandler發送消息
*
* @param flag
*/
private void sendMessage(int flag) {
Message msg = mainThreadHandler.obtainMessage();
msg.what = flag;
mainThreadHandler.sendMessage(msg);
}
/**
* 本方法用于将一个输入流写入到指定文本中
* @param file
* @param input
* @return File
*/
private void write2SDFromInput(InputStream input) {
FileOutputStream output = null;
Log.i("HttpDownloader", fullFilePath);
try {
output = new FileOutputStream(file);
byte buffer[] = new byte[4 * 1024];
int size = 0;
while ((size = input.read(buffer)) != -1) {
output.write(buffer, 0, size);
downloadedSize += size;
sendMessage(DOWNLOADING);
}
output.flush();
sendMessage(DOWNLOADED);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
output.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 启动下载线程
* @param urlStr
* @param updateflag 0为提醒更新,1为强制更新
*/
private void startDownload(final String urlStr,String updateflag){
downloadDialog = new ProgressDialog(ctx);
if(updateflag.equals("1")) {
downloadDialog.setCancelable(false);
} else if(updateflag.equals("0")) {
downloadDialog.setCancelable(true);
}
downloadDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
new Thread(new Runnable() {
@Override
public void run() {
InputStream inputStream = null;
try {
inputStream = getInputStreamFromUrl(urlStr);
sendMessage(START_DOWNLOAD);
write2SDFromInput(inputStream);
} catch (Exception e) {
errorMsg = "URL出错,请检查能否正常访问到下载URL";
sendMessage(DOWNLOAD_ERROR);
Log.d("HttpDownloader.URL",urlStr);
} finally {
try {
inputStream.close();
} catch (Exception e) {
errorMsg = "URL出错,请检查能否正常访问到下载URL";
sendMessage(DOWNLOAD_ERROR);
Log.d("HttpDownloader.URL",urlStr);
}
}
}
}).start();
}
/**
* 根据URL得到输入流
*
* @param urlStr
* @return InputStream
* @throws MalformedURLException
* @throws IOException
*/
private InputStream getInputStreamFromUrl(String urlStr)
throws MalformedURLException, IOException {
String fName = urlStr.substring(urlStr.lastIndexOf("/") + 1, urlStr
.indexOf("?") == -1 ? urlStr.length() : urlStr.indexOf("?"));
urlStr = urlStr.replace(fName, java.net.URLEncoder.encode(fName));//处理附件名中文问题
Log.i("HttpDownloader", "urlStr-->" + urlStr);
url = new URL(urlStr);
URLConnection urlConn = url.openConnection();
urlConn.connect();
InputStream inputStream = urlConn.getInputStream();
fileTotalSize = urlConn.getContentLength();
return inputStream;
}
/**
* 根据文件的下载URl,将下载到的文件到SD卡中的指定文件下,
* @param url 下载的URL
* @param filePath 下载后保存为指定文件的全路径
* @param isOpen 下载完是否自动调用应用程序打开
* @param updateflag 0为提醒更新,1为强制更新
*/
public void downloadFile(String url, String filePath, boolean isOpen,String updateflag){
this.isOpen = isOpen;
this.fullFilePath = filePath;
File file = new File(filePath);
// if(file.exists()){
// this.file = file;
// if(isOpen){//文档存在,并且需要打开文档
// Toast.makeText(ctx, "文件已经存在,系统将自动为您打开", Toast.LENGTH_SHORT).show();
// OpenFileHelper helper = new OpenFileHelper(ctx);
// helper.openFile(file);
// }else{//文档存在,但是不需要打开文档
// Toast.makeText(ctx, "该文件已经存在...", Toast.LENGTH_SHORT).show();
// }
// }else{
if(file.isDirectory()){
errorMsg = "存储对象必须是文件,请联系相关开发人员";
sendMessage(DOWNLOAD_ERROR);
return;
}
if(file.getParent()!=null){
if(!(new File(file.getParent()).exists())){
FileUtils.createDir(file.getParent());
}
}
try {
this.file = FileUtils.createFile(filePath);
} catch (IOException e) {
errorMsg = "创建文件失败";
sendMessage(DOWNLOAD_ERROR);
return;
}
startDownload(url,updateflag);
// }
}
public String downloadText(String urlStr){
StringBuffer sb = new StringBuffer();
String line = null;
BufferedReader buffer = null;
try {
// 创建一个URL对象
url = new URL(urlStr);
// 创建一个Http连接
HttpURLConnection urlConn = (HttpURLConnection) url
.openConnection();
// 使用IO流读取数据
buffer = new BufferedReader(new InputStreamReader(
urlConn.getInputStream(),"GBK"));
while ((line = buffer.readLine()) != null) {
sb.append(line + "\r\n");
}
urlConn.disconnect();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
buffer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return sb.toString();
}
}

被折叠的 条评论
为什么被折叠?



