接上一个获取文件大小的,这个内容是app更新了。
else if (v.getId() == R.id.llRefresh) {
//发送请求前,先判断网络是否可用。
if (UIHelp.isNetworkConnected(getActivity())) {
UpdateTask task = new UpdateTask();
task.execute();
} else {
UIHelp.showToast(getActivity(), getActivity().getString(R.string.no_network));
}
UIHelp.isNetworkConnected(getActivity()是我的工具类用于检查是否有网络。
UIHelp.showToast()是我工具类里面弹吐司的。
UpdateTask 的异步类:
private class UpdateTask extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... params) {
return ws.Update();
}
@Override
protected void onPostExecute(final String s) {
super.onPostExecute(s);
pd.dismiss();
Log.v(TAG, "result" + s);
new Thread() {
@Override
public void run() {
Looper.prepare();
UpdateManager manager = new UpdateManager(getActivity(), s);
// 检查软件更新
manager.checkUpdate();
Looper.loop();
}
}.start();
}
@Override
protected void onPreExecute() {
super.onPreExecute();
pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
pd.setMessage("正在获取最新版本信息....");
pd.setCancelable(false);
pd.show();
}
@Override
protected void onCancelled() {
super.onCancelled();
pd.dismiss();
}
}
doInBackground方法里面请求的方法Update():
public String Update(){
String url = "http://218.77.13.42:81/version.xml";
SyncHttpClient client = new SyncHttpClient();
return client.post(url);
}
总之这个方法就是去发请求的。。。
UpdateManager manager = new UpdateManager(getActivity(), s);
// 检查软件更新
manager.checkUpdate();
这里在onPostExecute方法里面得到的s通过构造函数传入。
s其实是一个版本的xml,String类型的。
UpdateManager 整个类如下:
package com.rb.huaihua.util.update;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Environment;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.rb.huaihua.R;
import com.rb.huaihua.util.UIHelp;
import java.io.ByteArrayInputStream;
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.URL;
import java.util.HashMap;
/**
* Created by Administrator on 2015/10/10.
*/
public class UpdateManager {
/* 下载中 */
private static final int DOWNLOAD = 1;
/* 下载结束 */
private static final int DOWNLOAD_FINISH = 2;
private static final String TAG = UpdateManager.class.getSimpleName();
/* 保存解析的XML信息 */
HashMap<String, String> mHashMap;
/* 是否取消更新 */
private boolean cancelUpdate = false;
/* 下载保存路径 */
public static String mSavePath = Environment.getExternalStorageDirectory() + File.separator
+"richbond"+File.separator+"xssb"+File.separator;
/* 记录进度条数量 */
private int progress;
private Context mContext;
private ProgressBar mProgress;
private TextView update_data;
private Dialog mDownloadDialog;
private static String apkFilePath = "";
private String str;//读取到的xml
/*用于更新进度条、安装文件*/
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
// 正在下载
case DOWNLOAD:
// 设置进度条位置
mProgress.setProgress(progress);
update_data.setText(progress+"%");
break;
case DOWNLOAD_FINISH:
// 安装文件
installApk(apkFilePath);
break;
default:
break;
}
};
};
public UpdateManager(Context context,String str)
{
this.mContext = context;
this.str=str;
}
/**
* 检测软件更新
*/
public void checkUpdate()
{
if (isUpdate())
{
// 显示提示对话框
showNoticeDialog();
} else
{
UIHelp.showToast(mContext, mContext.getString(R.string.soft_update_no));
}
}
/**
* 检查软件是否有更新版本
*
* @return
*/
private boolean isUpdate()
{/**
* 使用流读取 classpath 下文件:
* 1.Android Studio Terminal
* 2.cd appname\src\main\java
* 3.jar cvf xml.jar persons.xml
* 4.move xml.jar E:\AndroidStudio\Projects\Apps\appname\libs
*/
// 获取当前软件版本
int versionCode = getVersionCode(mContext);
Log.v(TAG,"versionCode = "+versionCode);
// 把version.xml放到网络上,然后获取文件信息
try {
//InputStream inStream = mContext.getAssets().open("version.xml");
//InputStream inStream = mContext.getAssets().open("version.xml");
/*String str = "<update>\n" +
"\t<version>2</version>\n" +
"\t<name>baidu_xinwen_1.1.0</name>\n" +
"\t<url>http://gdown.baidu.com/data/wisegame/f98d235e39e29031/baiduxinwen.apk</url>\n" +
"</update>";*/
ByteArrayInputStream inStream = new ByteArrayInputStream(str.getBytes());
Log.v(TAG,"is = "+inStream);
//InputStream inStream = getClass().getClassLoader().getResourceAsStream("version.xml");
//Log.v(TAG,"inStream = "+inStream);
// 解析XML文件。 由于XML文件比较小,因此使用DOM方式进行解析
ParseXmlService service = new ParseXmlService();
mHashMap = service.parseXml(inStream);
} catch (Exception e)
{
e.printStackTrace();
}
if (null != mHashMap)
{
Log.v(TAG,"mHashMap = "+mHashMap.toString());
int serviceCode = Integer.valueOf(mHashMap.get("version"));
// 版本判断
if (serviceCode > versionCode)
{
return true;
}
}
return false;
}
/**
* 获取软件版本号
*
* @param context
* @return
*/
public int getVersionCode(Context context)
{
int versionCode = 0;
try {
// 获取软件版本号,对应AndroidManifest.xml下android:versionCode
versionCode = context.getPackageManager()
.getPackageInfo(context.getPackageName(), 0).versionCode;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return versionCode;
}
/**
* 显示软件更新对话框
*/
private void showNoticeDialog()
{
// 构造对话框
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
builder.setTitle(R.string.soft_update_title);
builder.setMessage(R.string.soft_update_info);
//按对话框以外的地方不起作用。按返回键也不起作用
builder.setCancelable(false);
// 更新
builder.setPositiveButton(R.string.soft_update_updatebtn, new OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
dialog.dismiss();
// 显示下载对话框
showDownloadDialog();
}
});
// 稍后更新
builder.setNegativeButton(R.string.soft_update_later, new OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
dialog.dismiss();
}
});
Dialog noticeDialog = builder.create();
noticeDialog.show();
}
/**
* 显示软件下载对话框
*/
private void showDownloadDialog()
{
// 构造软件下载对话框
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
builder.setTitle(R.string.soft_updating);
// 给下载对话框增加进度条
final LayoutInflater inflater = LayoutInflater.from(mContext);
View v = inflater.inflate(R.layout.softupdate_progress, null);
mProgress = (ProgressBar) v.findViewById(R.id.update_progress);
update_data = (TextView) v.findViewById(R.id.update_data);
update_data.setText("0%");
builder.setView(v);
// 取消更新
builder.setNegativeButton(R.string.soft_update_cancel, new OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
dialog.dismiss();
// 设置取消状态
cancelUpdate = true;
}
});
mDownloadDialog = builder.create();
//设置点击外部时下载对话框不会消失
mDownloadDialog.setCanceledOnTouchOutside(false);
mDownloadDialog.show();
// 下载文件
downloadApk();
}
/**
* 下载apk文件
*/
private void downloadApk()
{
// 启动新线程下载软件
new downloadApkThread().start();
}
/**
* 下载文件线程
*/
private class downloadApkThread extends Thread
{
@Override
public void run()
{
try
{
// 判断SD卡是否存在,并且是否具有读写权限
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
apkFilePath = mSavePath + mHashMap.get("name")+".apk";
Log.v(TAG,"mSavePath"+mSavePath);
URL url = new URL(mHashMap.get("url"));
Log.v(TAG,"url="+mHashMap.get("url"));
// 创建连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.connect();
// 获取文件大小
int length = conn.getContentLength();
File file = new File(mSavePath);
// 判断文件目录是否存在
if (!file.exists())
{
file.mkdir();
}
File apkFile = new File(apkFilePath);
if (apkFile.exists()){
if (apkFile.length()==length){
//安装文件
installApk(apkFilePath);
mDownloadDialog.dismiss();
conn.disconnect();
return;
}
//删除文件
apkFile.delete();
}
// 创建输入流
InputStream is = conn.getInputStream();
FileOutputStream fos = new FileOutputStream(apkFile);
int count = 0;
// 缓存
byte buf[] = new byte[1024];
// 写入到文件中
do
{
int numread = is.read(buf);
count += numread;
// 计算进度条位置
progress = (int) (((float) count / length) * 100);
// 更新进度
mHandler.sendEmptyMessage(DOWNLOAD);
if (numread <= 0) {
// 下载完成
mHandler.sendEmptyMessage(DOWNLOAD_FINISH);
break;
}
// 写入文件
fos.write(buf, 0, numread);
} while (!cancelUpdate);// 点击取消就停止下载.
conn.disconnect();
fos.close();
is.close();
}
else{
//吐司提示没有sd卡
new Thread() {
@Override
public void run() {
Looper.prepare();
UIHelp.showToast(mContext, mContext.getString(R.string.no_sdCard));
Looper.loop();
}
}.start();
}
} catch (MalformedURLException e) {
Log.v(TAG,"urlException进入了这个异常");
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// 取消下载对话框显示
mDownloadDialog.dismiss();
}
};
/**
* 安装APK文件
*/
private void installApk(String apkFilePath)
{
File apkfile = new File(apkFilePath);
if (!apkfile.exists())
{
return;
}
// 通过Intent安装APK文件
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse("file://" + apkfile.toString()), "application/vnd.android.package-archive");
mContext.startActivity(intent);
//apkfile.delete();
}
/**
* 删除apk文件
*/
public static void deleteApk(){
//File apkfile = new File(apkFilePath);///storage/sdcard0/richbond/xssb/xssb_1.1.0.apk
File apkfile = new File("/storage/sdcard0/richbond/xssb/xssb_1.1.0.apk");
if (!apkfile.exists())
{
return;
}
apkfile.delete();
}
}