您的位置:首页 > 移动开发 > Android开发

Android APK 版本更新的下载和安装 直接上代码

2017-08-21 15:57 666 查看
1.获取版本号
2.对比版本号
3.下载apk文件
4.启动安装
/*** 升级按钮** @param view*/public void onUpgrade(View view) {if (isUpgrade) {//判断是否在升级中return;}isUpgrade = true;mUpdateAPKThread = new UpdateAPKThread(this, "url");new UpgradeThread().start();
}class UpgradeThread extends Thread {@Overridepublic void run() {super.run();boolean flag = mUpdateAPKThread.checkIsNeedUpdate();Message msg = Message.obtain();msg.what = KEY_UPGRADE;Bundle bundle = new Bundle();bundle.putBoolean("upgrade", flag);msg.setData(bundle);handler.sendMessage(msg);}}
case KEY_UPGRADE:if (msg.getData().getBoolean("upgrade")) {String message = mUpdateAPKThread.getDetail();new AlertDialog.Builder(LoginActivity.this).setCancelable(false).setTitle(getString(R.string.upgrade)).setMessage(message).setPositiveButton(getString(R.string.confirm), new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {mProgressDialog = new MyProgressDialog(LoginActivity.this, getString(R.string.load), false);mUpdateAPKThread.startDownloadThread();isUpgrade = false;}}).setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {isUpgrade = false;}}).create().show();} else {Yancy.warning(LoginActivity.this, getString(R.string.version)).show();isUpgrade = false;}break;
/*** 文件长度 
接口*/private int max = 0;@Overridepublic void setMax(int length) {max = length;}@Overridepublic void setProgresss(int len) {mProgressDialog.setProgress(len * 100 / max);}@Overridepublic void onSuccess() {mUpdateAPKThread.installApk();mProgressDialog.dismiss();}@Overridepublic void onFail() {Yancy.error(this, getString(R.string.download_failed)).show();mProgressDialog.dismiss();}
package com.yancy.sdk.upgrade;import android.content.Context;import android.content.Intent;import android.content.pm.PackageManager.NameNotFoundException;import android.net.Uri;import android.os.Environment;import android.os.Handler;import android.os.Looper;import com.yancy.sdk.app.App;import com.yancy.sdk.utils.AppUtils;import org.json.JSONException;import org.json.JSONObject;import java.io.ByteArrayOutputStream;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;/*** create by dpc on 2017-5-10*/public class UpdateAPKThread {private Context mContext;private String strURL;private File downloadFile;private DownloadListener downloadListener;private String detail;private String varUrl;private String apkName;private Handler mHandler = new Handler(Looper.getMainLooper()) {public void handleMessage(android.os.Message msg) {switch (msg.what) {case 0:downloadListener.setMax((int) msg.obj);break;case 1:downloadListener.setProgresss((int) msg.obj);break;case 2:downloadListener.onSuccess();break;case 3:downloadListener.onFail();break;default:break;}}};public UpdateAPKThread(Context mContext, String strURL) {this.mContext = mContext;this.strURL = strURL;setDownloadListener((DownloadListener) mContext);}public void setDownloadListener(DownloadListener downloadListener) {this.downloadListener = downloadListener;}public interface DownloadListener {/*** 设置文件长度** @param length*/void setMax(int length);/*** 进度** @param len*/void setProgresss(int len);/*** 成功*/void onSuccess();/*** 失败*/void onFail();}/*** 是否需要更新** @return*/public boolean checkIsNeedUpdate() {if (strURL.equals("")) {return false;}String data = getJsonContent(strURL);if (data.equals("")) {return false;}return parseJson(mContext, data);}private boolean parseJson(Context context, String strResult) {try {JSONObject jsonObject = new JSONObject(strResult);String verName = jsonObject.getString("verName");String verCode = jsonObject.getString("verCode");varUrl = jsonObject.getString("varUrl");detail = jsonObject.getString("detail");apkName = jsonObject.getString("apkname");int code = Integer.parseInt(verCode);if (code > AppUtils.getVersionCode(context)) {return true;}} catch (JSONException e) {e.printStackTrace();} catch (NumberFormatException e) {e.printStackTrace();}return false;}private String getJsonContent(String urlStr) {try {URL url = new URL(urlStr);HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();// 设置连接属性httpConn.setConnectTimeout(3000);httpConn.setDoInput(true);httpConn.setRequestMethod("GET");httpConn.connect();if (200 == httpConn.getResponseCode()) {return ConvertStream2Json(httpConn.getInputStream());}} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return "";}private String ConvertStream2Json(InputStream inputStream) {String jsonStr = "";ByteArrayOutputStream out = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = 0;try {while ((len = inputStream.read(buffer, 0, buffer.length)) != -1) {out.write(buffer, 0, len);}jsonStr = new String(out.toByteArray());} catch (IOException e) {e.printStackTrace();}return jsonStr;}public String getDetail() {return detail;}Thread mThread;boolean isDownloading = false;public void startDownloadThread() {final String urlStr = varUrl;final String fileName = apkName;mThread = new Thread() {public void run() {isDownloading = true;try {URL url = new URL(urlStr);HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 获得文件的长度int contentLength = conn.getContentLength();mHandler.obtainMessage(0, contentLength).sendToTarget();File filePath = new File(Environment.getExternalStorageDirectory() + "/apk/");if (!filePath.exists()) {filePath.mkdirs();filePath = new File(Environment.getExternalStorageDirectory() + "/apk/" + "/.test.txt");if (!filePath.exists())try {filePath.createNewFile();} catch (IOException e) {e.printStackTrace();}FileNotification.updateNotify(filePath);}String pathName = Environment.getExternalStorageDirectory() + "/apk/" + fileName;downloadFile = new File(pathName);InputStream input = conn.getInputStream();if (downloadFile.exists()) {downloadFile.delete();}downloadFile.createNewFile();FileOutputStream output = new FileOutputStream(downloadFile);byte[] buffer = new byte[1024];int len; // 重要参数int sum = 0;while ((len = input.read(buffer)) != -1 && isDownloading) {sum += len;mHandler.obtainMessage(1, sum).sendToTarget();output.write(buffer, 0, len);Thread.sleep(1);}output.close();input.close();mHandler.obtainMessage(2).sendToTarget();} catch (IOException e1) {mHandler.obtainMessage(3).sendToTarget();e1.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}};mThread.start();}/*** 安装APK文件*/public void installApk() {if (downloadFile != null && !downloadFile.exists()) {return;}Intent i = new Intent(Intent.ACTION_VIEW);i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);i.setDataAndType(Uri.parse("file://" + downloadFile.toString()),"application/vnd.android.package-archive");mContext.startActivity(i);}}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐