package com.mogujie.tools; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnCancelListener; import android.content.Intent; import android.net.Uri; import android.os.Environment; import android.os.Handler; import android.os.Message; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import com.mogujie.im.libs.R; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; /** * 自动下载更新,~ * @author 6a209 * Feb 17, 2013 */ public class MGAutoUpdate { private Context mCtx; private ProgressDialog mProgressDialog; private long mCount; private static final int UPDATE = 0x01; private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg){ switch(msg.what){ case UPDATE: mProgressDialog.setProgress((int)(mCount / 1000)); break; } } }; private boolean isCancle = false; private UpdateOnCancleListener updateOnCancleListener; private OnUpdateFinishListener mUpdateFinishListener; public MGAutoUpdate(Context ctx) { mCtx = ctx; mProgressDialog = new ProgressDialog(mCtx); mProgressDialog.setTitle(R.string.downloading); mProgressDialog.setMessage(mCtx.getString(R.string.wait_moment)); mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); //默认100 mProgressDialog.setMax(100); mProgressDialog.show(); mProgressDialog.setOnCancelListener(new OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { if(null != updateOnCancleListener){ isCancle = true; updateOnCancleListener.cancel(); } } }); } public void startDown(final String url) { new Thread() { public void run() { HttpClient client = new DefaultHttpClient(); // params[0]代表连接的url HttpGet get = new HttpGet(url); HttpResponse response; try { response = client.execute(get); HttpEntity entity = response.getEntity(); long length = entity.getContentLength(); mProgressDialog.setMax((int)(length / 1000)); InputStream is = entity.getContent(); FileOutputStream fileOutputStream = null; if (is != null) { File file = new File(Environment .getExternalStorageDirectory(), "OA.apk"); fileOutputStream = new FileOutputStream(file); byte[] buf = new byte[1024]; int ch = -1; mCount = 0; while ((ch = is.read(buf)) != -1) { // baos.write(buf, 0, ch); fileOutputStream.write(buf, 0, ch); mCount += ch; if (length > 0) { } mHandler.sendEmptyMessage(UPDATE); } } fileOutputStream.flush(); if (fileOutputStream != null) { fileOutputStream.close(); } down(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }.start(); } void down() { mHandler.post(new Runnable() { public void run() { update(); } }); } void update() { if(mProgressDialog.isShowing()){ mProgressDialog.dismiss(); } if(isCancle){ return; } if(null != mUpdateFinishListener){ mUpdateFinishListener.onFinish(); } Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File("/sdcard/OA.apk")), "application/vnd.android.package-archive"); mCtx.startActivity(intent); } public void setUpdateOnCancleListener(UpdateOnCancleListener updateOnCancleListener){ this.updateOnCancleListener = updateOnCancleListener; } public void setOnFinishListener(OnUpdateFinishListener listener){ mUpdateFinishListener = listener; } public interface UpdateOnCancleListener { public void cancel(); } public interface OnUpdateFinishListener{ public void onFinish(); } }