直接上代码:
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 android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.net.Uri; import android.os.Environment; import android.os.Handler; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.ProgressBar; import com.iblueyeClient.R; import com.iblueyeClient.utils.Msg; public class UpdateManager { private Context mContext; // 返回的安装包url private String apkUrl = "http://www.iblueye.com/client/download/ibePhone.apk"; private Dialog noticeDialog; private Dialog downloadDialog; /* 下载包安装路径 */ private static final String savePath = Environment .getExternalStorageDirectory().getPath(); private static final String saveFileName = savePath + "/" + "ibePhone.apk"; private Thread downLoadThread; private boolean interceptFlag = false; public ProgressBar mProgress;/* 进度条与通知ui刷新的handler和msg常量 */ public int progress; private Handler handler; public UpdateManager(Context context, Handler h) { this.mContext = context; handler = h; } // 外部接口让主Activity调用 public void confirmUpdate() { AlertDialog.Builder builder = new Builder(mContext); builder.setTitle(R.string.update_version); builder.setMessage(R.string.update_msg); builder.setPositiveButton(R.string.download, new OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); showDownloadDialog(); } }); builder.setNegativeButton(R.string.next_download, new OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); handler.sendEmptyMessage(Msg.START); } }); noticeDialog = builder.create(); noticeDialog.show(); } private void showDownloadDialog() { final LayoutInflater inflater = LayoutInflater.from(mContext); View v = inflater.inflate(R.layout.progress, null); mProgress = (ProgressBar) v.findViewById(R.id.progress); AlertDialog.Builder builder = new Builder(mContext); builder.setTitle(R.string.update_version); builder.setView(v); builder.setNegativeButton(R.string.cancel, new OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); interceptFlag = true; handler.sendEmptyMessage(Msg.START); } }); downloadDialog = builder.create(); downloadDialog.show(); downloadApk(); } private Runnable mdownApkRunnable = new Runnable() { public void run() { try { URL url = new URL(apkUrl); HttpURLConnection conn = (HttpURLConnection) url .openConnection(); conn.connect(); int length = conn.getContentLength(); InputStream is = conn.getInputStream(); File file = new File(savePath); if (!file.exists()) { file.mkdir(); } String apkFile = saveFileName; File ApkFile = new File(apkFile); 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); /* 更新进度 */ handler.sendEmptyMessage(Msg.DOWN_UPDATE); Log.i("更新测试", "progress=" + progress); if (numread <= 0) { /* 下载完成通知安装 */ handler.sendEmptyMessage(Msg.DOWN_OVER); break; } fos.write(buf, 0, numread); } while (!interceptFlag);/* 点击取消就停止下载 */ fos.close(); is.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }; /** * 下载apk * * @param url */ private void downloadApk() { downLoadThread = new Thread(mdownApkRunnable); downLoadThread.start(); } /** * 安装apk * * @param url */ public void installApk() { File apkfile = new File(saveFileName); if (!apkfile.exists()) { return; } Intent apk = new Intent(Intent.ACTION_VIEW); apk.setDataAndType(Uri.parse("file://" + apkfile.toString()), "application/vnd.android.package-archive"); mContext.startActivity(apk); } public void uninstall(String pakageName) { Uri uri = Uri.parse(pakageName); Intent intent = new Intent(Intent.ACTION_DELETE, uri); mContext.startActivity(intent); } }