Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android實現檢查並下載APK更新、安裝APK及獲取網絡信息的方法

Android實現檢查並下載APK更新、安裝APK及獲取網絡信息的方法

編輯:關於Android編程

本文所述實例為一個天氣預報中的android代碼,主要包括了下載和安裝APK、檢查Apk更新、顯示'已經是最新'或者'無法獲取版本信息'對話框、獲取當前客戶端版本信息、顯示版本更新通知對話框、顯示下載對話框、判斷是否掛載了SD卡、顯示文件大小格式:2個小數點顯示等。具體實現代碼如下:

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.text.DecimalFormat;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.util.EntityUtils;
import org.lmw.weather.R;
import org.lmw.weather.entity.AppDetail;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.DialogInterface.OnCancelListener;
import android.content.DialogInterface.OnClickListener;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
public class DownloadManager {
  private static final int DOWN_NOSDCARD = 0;
  private static final int DOWN_UPDATE = 1;
  private static final int DOWN_OVER = 2;
  private static final int DOWN_ERROR=3;
  private static final int DIALOG_TYPE_LATEST = 0;
  private static final int DIALOG_TYPE_FAIL = 1;
  private static final int DIALOG_TYPE_INTERNETERROR = 2;
  private static DownloadManager downloadManager;
  private Context mContext;
  // 通知對話框
  private Dialog noticeDialog;
  // 下載對話框
  private Dialog downloadDialog;
  // 進度條
  private ProgressBar mProgress;
  // 顯示下載數值
  private TextView mProgressText;
  // 查詢動畫
  private ProgressDialog mProDialog;
  // '已經是最新' 或者 '無法獲取最新版本' 的對話框
  private Dialog latestOrFailDialog;
  // 返回的安裝包url
  private String apkUrl = "";
  // 進度值
  private int progress;
  // 下載線程
  private Thread downLoadThread;
  // 終止標記
  private boolean interceptFlag;
  // 提示語
  private String updateMsg = "";
  // 下載包保存路徑
  private String savePath = "";
  // apk保存完整路徑
  private String apkFilePath = "";
  // 臨時下載文件路徑
  private String tmpFilePath = "";
  // 下載文件大小
  private String apkFileSize;
  // 已下載文件大小
  private String tmpFileSize;
  private String curVersionName = "";
  private int curVersionCode;
  private AppDetail mDownload;
  private String checkUrl="http://192.168.0.133:8080/lmw/androidMarket/SimpleWeather-20130701093349937/update.xml";
  private Handler mHandler = new Handler() {
 public void handleMessage(Message msg) {
   switch (msg.what) {
   case DOWN_UPDATE:
 mProgress.setProgress(progress);
 mProgressText.setText(tmpFileSize + "/" + apkFileSize);
 break;
   case DOWN_OVER:
 downloadDialog.dismiss();
 installApk();
 break;
   case DOWN_NOSDCARD:
 downloadDialog.dismiss();
 Toast.makeText(mContext, "無法下載安裝文件,請檢查SD卡是否掛載",Toast.LENGTH_SHORT).show();
 break;
   case DOWN_ERROR:
 downloadDialog.dismiss();
 if(msg.arg1==0){
 Toast.makeText(mContext, "網絡不給力啊", Toast.LENGTH_SHORT).show();
 }else if(msg.arg1==1||msg.arg1==2){
 Toast.makeText(mContext, "未找到資源",Toast.LENGTH_SHORT).show();
 }
 break;
   }
 };
  };
  public static DownloadManager getDownloadManager() {
 if (downloadManager == null) {
   downloadManager = new DownloadManager();
 }
 downloadManager.interceptFlag = false;
 return downloadManager;
  }
  public void DownLoader(Context context, AppDetail download) {
 this.mContext = context;
 this.mDownload = download;
 showDownloadDialog();
  }
  /**
   * 檢查App更新
   * @param context
   * @param isShowMsg
   * 是否顯示提示消息
   */
  public void checkAppUpdate(Context context, final boolean isShowMsg,final boolean notmain) {
 this.mContext = context;
 getCurrentVersion(mContext);
 if (isShowMsg) {
   if (mProDialog == null)
 mProDialog = ProgressDialog.show(mContext, null, "正在檢測,請稍後...",true, true);
   else if (mProDialog.isShowing()|| (latestOrFailDialog != null && latestOrFailDialog.isShowing()))
 return;
 }
 final Handler handler = new Handler() {
   public void handleMessage(Message msg) {
 // 進度條對話框不顯示 - 檢測結果也不顯示
 if (mProDialog != null && !mProDialog.isShowing()) {
   return;
 }
 // 關閉並釋放釋放進度條對話框
 if (isShowMsg && mProDialog != null) {
   mProDialog.dismiss();
   mProDialog = null;
 }
 // 顯示檢測結果
 if (msg.what == 1) {
   mDownload = (AppDetail) msg.obj;
   if (mDownload != null) {
  if (curVersionCode < mDownload.getVersionCode()) {
    apkUrl = mDownload.getUri()+mDownload.getFileName();
    updateMsg = mDownload.getAppHistory();
    showNoticeDialog();
  } else if (isShowMsg) {
    if (notmain) {
  showLatestOrFailDialog(DIALOG_TYPE_LATEST);
    }
  }
   }
 }else if(msg.what==-1&&isShowMsg){
  showLatestOrFailDialog(DIALOG_TYPE_INTERNETERROR);
 }else if (isShowMsg) {
   showLatestOrFailDialog(DIALOG_TYPE_FAIL);
 }
   }
 };
 new Thread() {
   public void run() {
 Message msg = new Message();
 try {
  DefaultHttpClient client = new DefaultHttpClient();
  client.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 3000);
  HttpGet get = new HttpGet(checkUrl);
  HttpResponse response = client.execute(get);
  if (response.getStatusLine().getStatusCode() == 200) {
  HttpEntity entity = response.getEntity();
  InputStream stream = new ByteArrayInputStream( EntityUtils.toString(entity, "gb2312").getBytes());
   AppDetail update = AppDetail.parseXML(stream);
   msg.what = 1;
   msg.obj = update;
  }else{
   msg.what = -1;
  }
 } catch (Exception e) {
   e.printStackTrace();
   msg.what = -1;
 }
 handler.sendMessage(msg);
   }
 }.start();
  }
  /*顯示'已經是最新'或者'無法獲取版本信息'對話框*/
  private void showLatestOrFailDialog(int dialogType) {
   String ToastMsg="";
 if (latestOrFailDialog != null) {
   // 關閉並釋放之前的對話框
   latestOrFailDialog.dismiss();
   latestOrFailDialog = null;
 }
// AlertDialog.Builder builder = new Builder(mContext);
// builder.setTitle("系統提示");
 if (dialogType == DIALOG_TYPE_LATEST) {
//   builder.setMessage("您當前已經是最新版本");
   ToastMsg="您當前已經是最新版本";
 } else if (dialogType == DIALOG_TYPE_FAIL) {
//   builder.setMessage("無法獲取版本更新信息");
 ToastMsg="無法獲取版本更新信息";
 }else if(dialogType==DIALOG_TYPE_INTERNETERROR){
// builder.setMessage("網絡故障,無法連接服務器");
 ToastMsg="網絡故障,無法連接服務器";
 }
 Toast.makeText(mContext, ToastMsg, Toast.LENGTH_SHORT).show();
  }
  /*獲取當前客戶端版本信息*/
  public String getCurrentVersion(Context context) {
 try {
   PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
   curVersionName = info.versionName;
   curVersionCode = info.versionCode;
 } catch (NameNotFoundException e) {
   e.printStackTrace(System.err);
 }
 return curVersionName;
  }
  /*顯示版本更新通知對話框*/
  private void showNoticeDialog() {
 AlertDialog.Builder builder = new Builder(mContext);
 builder.setTitle("軟件版本更新");
 builder.setMessage(updateMsg);
 builder.setPositiveButton("立即更新", new OnClickListener() {
   @Override
   public void onClick(DialogInterface dialog, int which) {
 dialog.dismiss();
 showDownloadDialog();
   }
 });
 builder.setNegativeButton("以後再說", new OnClickListener() {
   @Override
   public void onClick(DialogInterface dialog, int which) {
 dialog.dismiss();
   }
 });
 noticeDialog = builder.create();
 noticeDialog.show();
  }
  /*顯示下載對話框*/
  private void showDownloadDialog() {
 AlertDialog.Builder builder = new Builder(mContext);
 builder.setTitle("正在下載安裝包");
 final LayoutInflater inflater = LayoutInflater.from(mContext);
 View v = inflater.inflate(R.layout.download_progress, null);
 mProgress = (ProgressBar) v.findViewById(R.id.update_progress);
 mProgressText = (TextView) v.findViewById(R.id.update_progress_text);
 builder.setView(v);
 builder.setNegativeButton("取消", new OnClickListener() {
   @Override
   public void onClick(DialogInterface dialog, int which) {
 dialog.dismiss();
 interceptFlag = true;
   }
 });
 builder.setOnCancelListener(new OnCancelListener() {
   @Override
   public void onCancel(DialogInterface dialog) {
 dialog.dismiss();
 interceptFlag = true;
   }
 });
 downloadDialog = builder.create();
 downloadDialog.setCanceledOnTouchOutside(false);
 downloadDialog.show();
 downloadApk();
  }
  private Runnable mdownApkRunnable = new Runnable() {
 Message error_msg=new Message();
 @Override
 public void run(){
   try {
 String apkName = mDownload.getFileName().replace(".apk","")+".apk";
 String tmpApk = mDownload.getFileName().replace(".apk","")+".tmp";
 // 判斷是否掛載了SD卡
 String storageState = Environment.getExternalStorageState();
 if (storageState.equals(Environment.MEDIA_MOUNTED)) {
   savePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/QN/QNStore/";
   File file = new File(savePath);
   if (!file.exists()) {
  file.mkdirs();
   }
   apkFilePath = savePath + apkName;
   tmpFilePath = savePath + tmpApk;
 }
 // 沒有掛載SD卡,無法下載文件
 if (apkFilePath == null || apkFilePath == "") {
   mHandler.sendEmptyMessage(DOWN_NOSDCARD);
   return;
 }
 File ApkFile = new File(apkFilePath);
 // 是否已下載更新文件
// if (ApkFile.exists()) {
//   downloadDialog.dismiss();
//   installApk();
//   return;
// }
 // 輸出臨時下載文件
 File tmpFile = new File(tmpFilePath);
 FileOutputStream fos = new FileOutputStream(tmpFile);
 URL url = new URL(mDownload.getUri()+mDownload.getFileName());
 HttpURLConnection conn = (HttpURLConnection) url.openConnection();
 try {
   conn.connect();
 } catch (ConnectTimeoutException e) {
   error_msg.what=DOWN_ERROR;
   error_msg.arg1=0;
   mHandler.sendMessage(error_msg);
 }
 int length = conn.getContentLength();
 InputStream is = conn.getInputStream();
 // 顯示文件大小格式:2個小數點顯示
 DecimalFormat df = new DecimalFormat("0.00");
 // 進度條下面顯示的總文件大小
 apkFileSize = df.format((float) length / 1024 / 1024) + "MB";
 int count = 0;
 byte buf[] = new byte[1024];
 do {
   int numread = is.read(buf);
   count += numread;
   // 進度條下面顯示的當前下載文件大小
   tmpFileSize = df.format((float) count / 1024 / 1024) + "MB";
   // 當前進度值
   progress = (int) (((float) count / length) * 100);
   // 更新進度
   mHandler.sendEmptyMessage(DOWN_UPDATE);
   if (numread <= 0) {
  // 下載完成 - 將臨時下載文件轉成APK文件
  if (tmpFile.renameTo(ApkFile)) {
    // 通知安裝
    mHandler.sendEmptyMessage(DOWN_OVER);
  }
  break;
   }
   fos.write(buf, 0, numread);
 } while (!interceptFlag);// 點擊取消就停止下載
 fos.close();
 is.close();
   } catch (MalformedURLException e) {
 error_msg.what=DOWN_ERROR;
 error_msg.arg1=1;
 mHandler.sendMessage(error_msg);
 e.printStackTrace();
   } catch (IOException e) {
 error_msg.what=DOWN_ERROR;
 error_msg.arg1=2;
 mHandler.sendMessage(error_msg);
 e.printStackTrace();
   }
 }
  };
  /**
   * 下載apk
   * @param url
   */
  private void downloadApk() {
 downLoadThread = new Thread(mdownApkRunnable);
 downLoadThread.start();
  }
  /**
   * 安裝apk
   * @param url
   */
  private void installApk() {
 File apkfile = new File(apkFilePath);
 if (!apkfile.exists()) {
   return;
 }
 Intent i = new Intent(Intent.ACTION_VIEW);
 i.setDataAndType(Uri.parse("file://" + apkfile.toString()),"application/vnd.android.package-archive");
 mContext.startActivity(i);
  }
}

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved