码迷,mamicode.com
首页 > 移动开发 > 详细

phonegap(cordova) 自定义插件代码篇(二)----android 自动更新

时间:2016-01-01 19:01:24      阅读:250      评论:0      收藏:0      [点我收藏+]

标签:

程序总要更新的,apple 等appstore 处理,android版 自动更新,上代码

/**
 * 检查并更新APP 
 */

(function (cordova) {
    var define = cordova.define;

    define("cordova/plugin/updateApp", function (require, exports, module) {
        var argscheck = require('cordova/argscheck'),
	    exec = require('cordova/exec');
        exports.checkAndUpdate = function (content, successCB, failCB) {

            exec(successCB, failCB, "UpdateApp", "checkAndUpdate", content);

        };
        exports.getCurrentVersion = function (successCB, failCB) {
            exec(successCB, failCB, "UpdateApp", "getCurrentVersion", []);
        }
        exports.update = function (downUrl, successCB, failCB) {
            exec(successCB, failCB, "UpdateApp", "update", [downUrl]);
        }


    });
    cordova.addConstructor(function () {
        if (!window.plugins) {
            window.plugins = {};
        }
        console.log("将插件注入cordovaupdateApp...");
        window.plugins.updateApp = cordova.require("cordova/plugin/updateApp");
        console.log("updateApp注入结果:" + typeof (window.plugins.updateApp));

    });
})(cordova);

 
<feature name="UpdateApp">
		<param name="android-package" value="包名.UpdateAppPlugin" />
	</feature>

public class UpdateAppPlugin extends CordovaPlugin {

	/* 版本号检查路径 */
	private String checkPath;
	/* 新版本号 */
	private int newVerCode;
	/* 新版本名称 */
	private String newVerName="yooshowNewVersion";
	/* APK 下载路径 */
	private String downloadPath;
	/* 下载中 */
	private static final int DOWNLOAD = 1;
	/* 下载结束 */
	private static final int DOWNLOAD_FINISH = 2;
	/* 下载保存路径 */
	private String mSavePath;
	/* 记录进度条数量 */
	private int progress;
	/* 是否取消更新 */
	private boolean cancelUpdate = false;
	/* 上下文 */
	private Context mContext;
	/* 更新进度条 */
	private ProgressBar mProgress;
	private Dialog mDownloadDialog;

	private ProgressDialog pd = null;
	String UPDATE_SERVERAPK = "yooshowupdate.apk";

	@Override
	public boolean execute(String action, JSONArray args,
			CallbackContext callbackContext) throws JSONException {
		this.mContext = cordova.getActivity();
		if (action.equals("checkAndUpdate")) {
			Log.i("our", "检查版本");
			this.checkPath = args.getString(0);
			checkAndUpdate();
		} else if (action.equals("getCurrentVersion")) {
			// 优化 缩短传输内容,减少流量
			// JSONObject obj = new JSONObject();
			// obj.put("versionCode", this.getCurrentVerCode());
			// obj.put("versionName", this.getCurrentVerName());
			callbackContext.success(this.getCurrentVerCode() + "");
		} else if (action.equals("getServerVersion")) {
			this.checkPath = args.getString(0);
			if (this.getServerVerInfo()) {
				// 优化 缩短传输内容,减少流量
				// JSONObject obj = new JSONObject();
				// obj.put("serverVersionCode", newVerCode);
				// obj.put("serverVersionName", newVerName);
				callbackContext.success(newVerCode + "");
			} else {
				callbackContext
						.error("can't connect to the server!please check [checkpath]");
			}

		} else if (action.equals("update")) {
			this.downloadPath = args.getString(0);
			showDownloadDialog();
		}
		return false;
	}

	/**
	 * 检查更新
	 */
	private void checkAndUpdate() {
		if (getServerVerInfo()) {
			int currentVerCode = getCurrentVerCode();
			if (newVerCode > currentVerCode) {
				this.showNoticeDialog();
			}
		}
	}

	/**
	 * 获取应用当前版本代码
	 * 
	 * @param context
	 * @return
	 */
	private int getCurrentVerCode() {
		String packageName = this.mContext.getPackageName();
		int currentVer = -1;
		try {
			currentVer = this.mContext.getPackageManager().getPackageInfo(
					packageName, 0).versionCode;
		} catch (NameNotFoundException e) {
			e.printStackTrace();
		}
		return currentVer;
	}

	/**
	 * 获取应用当前版本名称
	 * 
	 * @param context
	 * @return
	 */
	private String getCurrentVerName() {
		String packageName = this.mContext.getPackageName();
		String currentVerName = "";
		try {
			currentVerName = this.mContext.getPackageManager().getPackageInfo(
					packageName, 0).versionName;
		} catch (NameNotFoundException e) {
			e.printStackTrace();
		}
		return currentVerName;
	}

	/**
	 * 获取应用名称
	 * 
	 * @param context
	 * @return
	 */
	private String getAppName() {
		return this.mContext.getResources().getText(R.string.app_name)
				.toString();
	}

	/**
	 * 获取服务器上的版本信息
	 * 
	 * @param path
	 * @return
	 * @throws Exception
	 */
	private boolean getServerVerInfo() {
		try {
			StringBuilder verInfoStr = new StringBuilder();
			URL url = new URL(checkPath);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setConnectTimeout(5000);
			conn.setReadTimeout(5000);
			conn.connect();
			BufferedReader reader = new BufferedReader(new InputStreamReader(
					conn.getInputStream(), "UTF-8"), 8192);
			String line = null;
			while ((line = reader.readLine()) != null) {
				verInfoStr.append(line + "\n");
			}
			reader.close();

			JSONArray array = new JSONArray(verInfoStr.toString());
			if (array.length() > 0) {
				JSONObject obj = array.getJSONObject(0);
				newVerCode = obj.getInt("verCode");
				newVerName = obj.getString("verName");
				downloadPath = obj.getString("apkPath");

				Log.i("our", newVerCode + newVerName + downloadPath);
			}
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}

		return true;

	}

	/**
	 * 显示软件更新对话框
	 */
	private void showNoticeDialog() {
		// 构造对话框
		AlertDialog.Builder builder = new Builder(mContext);
		builder.setTitle("软件更新");
		builder.setMessage("有新版本需要更新");
		// 更新
		builder.setPositiveButton("确定", new OnClickListener() {
			public void onClick(DialogInterface dialog, int which) {
				// dialog.dismiss();
				// 显示下载对话框
				showDownloadDialog(); 
			}
		});
		// 稍后更新
		builder.setNegativeButton("取消", new OnClickListener() {
			public void onClick(DialogInterface dialog, int which) {
				dialog.dismiss();
			}
		});
		Dialog noticeDialog = builder.create();
		noticeDialog.show();
	}

	/**
	 * 显示软件下载对话框
	 */
	private void showDownloadDialog() {
		
		pd = new ProgressDialog(mContext);
		pd.setTitle("正在下载");
		pd.setMessage("请稍后...");
		pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
		
		
		pd.setCancelable(false);//设置进度条是否可以按退回键取消
		//设置点击进度对话框外的区域对话框不消失 
		pd.setCanceledOnTouchOutside(false);
		downloadApk();
	}

	/**
	 * 下载apk文件
	 */
	private void downloadApk() {
		// 启动新线程下载软件
//		 new downloadApkThread().start();
		downFile(downloadPath);
	}

	private Handler mHandler = new Handler() {
		public void handleMessage(Message msg) {
			switch (msg.what) {
			// 正在下载
			case DOWNLOAD:
				// 设置进度条位置
//				mProgress.setProgress(progress); 
				pd.setProgress(progress);
				break;
			case DOWNLOAD_FINISH:
				// 安装文件
//				installApk();
				update();
				break;
			default:
				break;
			}
		};
	};

	/**
	 * 下载文件线程
	 */
	private class downloadApkThread extends Thread {
		@Override
		public void run() {
			try {
				// 判断SD卡是否存在,并且是否具有读写权限
				if (Environment.getExternalStorageState().equals(
						Environment.MEDIA_MOUNTED)) {
					// 获得存储卡的路径
					String sdpath = Environment.getExternalStorageDirectory()
							+ "/";
					mSavePath = sdpath + "download";
					URL url = new URL(downloadPath);
					// 创建连接
					HttpURLConnection conn = (HttpURLConnection) url
							.openConnection();
					conn.connect();
					// 获取文件大小
					int length = conn.getContentLength();
					// 创建输入流
					InputStream is = conn.getInputStream();

					File file = new File(mSavePath);
					// 判断文件目录是否存在
					if (!file.exists()) {
						file.mkdir();
					}
					File apkFile = new File(mSavePath, newVerName);
					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);// 点击取消就停止下载.
					fos.close();
					is.close();
				}
			} catch (MalformedURLException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
			// 取消下载对话框显示
			mDownloadDialog.dismiss();
		}
	};

	/**
	 * 安装APK文件
	 */
	private void installApk() {
		File apkfile = new File(mSavePath, newVerName);
		if (!apkfile.exists()) {
			return;
		}
		// 通过Intent安装APK文件
		Intent i = new Intent(Intent.ACTION_VIEW);
		i.setDataAndType(Uri.parse("file://" + apkfile.toString()),
				"application/vnd.android.package-archive");
		mContext.startActivity(i);
	}

	/**
	 * 下载apk
	 */
	public void downFile(final String url) {
		pd.show();
		new Thread() {
			public void run() {
				HttpClient client = new DefaultHttpClient();
				HttpGet get = new HttpGet(url);
				HttpResponse response;
				try {
					response = client.execute(get);
					HttpEntity entity = response.getEntity();
					long length = entity.getContentLength();
					InputStream is = entity.getContent();
					FileOutputStream fileOutputStream = null;
					if (is != null) {
						File file = new File(
								Environment.getExternalStorageDirectory(),
								UPDATE_SERVERAPK);
						fileOutputStream = new FileOutputStream(file);
						byte[] b = new byte[1024];
						int charb = -1;
						int count = 0;
						while ((charb = is.read(b)) != -1) {
							fileOutputStream.write(b, 0, charb);
							count += charb;
							
							progress = (int) (((float) count / length) * 100);
							// 更新进度
							mHandler.sendEmptyMessage(DOWNLOAD);
							 
						}
					}
					fileOutputStream.flush();
					if (fileOutputStream != null) {
						fileOutputStream.close();
					}
					down();
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}.start();
	}

	Handler handler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			pd.cancel();
			update();
		}
	};

	/**
	 * 下载完成,通过handler将下载对话框取消
	 */
	public void down() {
		new Thread() {
			public void run() {
				Message message = handler.obtainMessage();
				handler.sendMessage(message);
			}
		}.start();
	}

	/**
	 * 安装应用
	 */
	public void update() {
		Intent intent = new Intent(Intent.ACTION_VIEW);
		intent.setDataAndType(Uri.fromFile(new File(Environment
				.getExternalStorageDirectory(), UPDATE_SERVERAPK)),
				"application/vnd.android.package-archive");
		mContext.startActivity(intent);
	}
}
每次激活app都检查更新
onResume: function () {
        setTimeout(function () {
            
            //检查更新
            updateClient.check();

           

        }, 0);
        
    }
document.addEventListener("resume", yooshowApp.onResume, false);

var updateClient = {
    check: function (isAlert) {
        if (typeof (device) != "undefined" && device.platform == "Android") {
            if (localStorage.getItem("YooshowSession")) {
                //删除提醒
                remind.delPersonRemind({ "ModuleID": "update" });
            }
            window.plugins.updateApp.getCurrentVersion(function (currentVersionCode) {
                yooshow.PostApp("CheckVersion", {}, function (result) {

                    //最新版本
                    var version = result.Version;
                    //是否强制更新
                    var force = result.Force;
                    //下载地址
                    var url = result.Url;
                    //描述
                    var description = result.Description;
                    if (parseInt(version) > parseInt(currentVersionCode)) {
                        //强制更新
                        if (force) {
                            window.plugins.updateApp.update(url, function () { }, function () { });
                        } else {
                            navigator.notification.confirm(description, function (button) {
                                if (button == 1) {
                                    window.plugins.updateApp.update(url, function () { }, function () { });
                                }
                            }, '发现新版本', '立即更新,稍后更新');
                        }
                    } else {
                        if (isAlert) {
                            yooshow.alert("您已是最新版本");
                        }
                    }

                });
            }, function () {

            });
        }

    }
}


phonegap(cordova) 自定义插件代码篇(二)----android 自动更新

标签:

原文地址:http://blog.csdn.net/lorinzhang/article/details/50442835

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!