版更新使用的是AppUpdate
使用其默认json格式
导入方式
dependencies {
compile 'com.qianwen:update-app:3.5.2'
}
- 有新版本
{
"update": "Yes",//有新版本
"new_version": "0.8.3",//新版本号
"apk_file_url": "https://raw.githubusercontent.com/WVector/AppUpdateDemo/master/apk/app-debug.apk", //apk下载地址
"update_log": "1,添加删除信用卡接口\r\n2,添加vip认证\r\n3,区分自定义消费,一个小时不限制。\r\n4,添加放弃任务接口,小时内不生成。\r\n5,消费任务手动生成。",//更新内容
"target_size": "5M",//apk大小
"new_md5":"A818AD325EACC199BC62C552A32C35F2",
"constraint": false//是否强制更新
}
- 没有新版本
{
"update": "No",//没有新版本
}
- 简单使用
没有自定义参数时可以直接使用如下代码
//最简方式
new UpdateAppManager
.Builder()
//当前Activity
.setActivity(this)
//更新地址
.setUpdateUrl(mUpdateUrl)
//实现httpManager接口的对象
.setHttpManager(new UpdateAppHttpUtil())
.build()
.update();
- 自定义参数
String path = Environment.getExternalStorageDirectory().getAbsolutePath();
Map<String, String> params = new HashMap<String, String>();
params.put("appKey", "ab55ce55Ac4bcP408cPb8c1Aaeac179c5f6f");
params.put("appVersion", Utils.getVersionName(this));
params.put("key1", "value2");
params.put("key2", "value3");
new UpdateAppManager
.Builder()
//必须设置,当前Activity
.setActivity(this)
//必须设置,实现httpManager接口的对象
.setHttpManager(new OkGoUpdateHttpUtil())
//必须设置,更新地址
.setUpdateUrl(mUpdateUrl)
//以下设置,都是可选
//设置请求方式,默认get
.setPost(false)
//添加自定义参数,默认version=1.0.0(app的versionName);apkKey=唯一表示(在AndroidManifest.xml配置)
.setParams(params)
//设置点击升级后,消失对话框,默认点击升级后,对话框显示下载进度
.hideDialogOnDownloading(false)
//设置头部,不设置显示默认的图片,设置图片后自动识别主色调,然后为按钮,进度条设置颜色
.setTopPic(R.mipmap.top_8)
//为按钮,进度条设置颜色,默认从顶部图片自动识别。
//.setThemeColor(ColorUtil.getRandomColor())
//设置apk下砸路径,默认是在下载到sd卡下/Download/1.0.0/test.apk
.setTargetPath(path)
//设置appKey,默认从AndroidManifest.xml获取,如果,使用自定义参数,则此项无效
//.setAppKey("ab55ce55Ac4bcP408cPb8c1Aaeac179c5f6f")
//不显示通知栏进度条
.dismissNotificationProgress()
//是否忽略版本
//.showIgnoreVersion()
.build()
//检测是否有新版本
.checkNewApp(new UpdateCallback() {
/**
* 解析json,自定义协议
*
* @param json 服务器返回的json
* @return UpdateAppBean
*/
@Override
protected UpdateAppBean parseJson(String json) {
UpdateAppBean updateAppBean = new UpdateAppBean();
try {
JSONObject jsonObject = new JSONObject(json);
updateAppBean
//(必须)是否更新Yes,No
.setUpdate(jsonObject.optString("update"))
//(必须)新版本号,
.setNewVersion(jsonObject.optString("new_version"))
//(必须)下载地址
.setApkFileUrl(jsonObject.optString("apk_file_url"))
//(必须)更新内容
.setUpdateLog(jsonObject.optString("update_log"))
//大小,不设置不显示大小,可以不设置
.setTargetSize(jsonObject.optString("target_size"))
//是否强制更新,可以不设置
.setConstraint(false)
//设置md5,可以不设置
.setNewMd5(jsonObject.optString("new_md51"));
} catch (JSONException e) {
e.printStackTrace();
}
return updateAppBean;
}
/**
* 网络请求之前
*/
@Override
public void onBefore() {
CProgressDialogUtils.showProgressDialog(JavaActivity.this);
}
/**
* 网路请求之后
*/
@Override
public void onAfter() {
CProgressDialogUtils.cancelProgressDialog(JavaActivity.this);
}
/**
* 没有新版本
*/
@Override
public void noNewApp() {
Toast.makeText(JavaActivity.this, "没有新版本", Toast.LENGTH_SHORT).show();
}
});
5.其他自定义可以到官方文档和下载Demo查看
自定义的jsong格式
1.下载demo里的update模块
2.导入自己的项目
导入后会提示报错,注释掉
//apply plugin: 'com.novoda.bintray-release'//添加
//添加
//publish {
// userOrg = 'qianwen'//bintray.com用户名
// groupId = 'com.qianwen'//jcenter上的路径
// artifactId = 'update-app'//项目名称
// publishVersion = '3.5.2'//版本号
// desc = 'a library for android version update'
// website = 'https://github.com/WVector/AppUpdate'
//}
- 添加CProgressDialogUtils
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.DialogInterface;
/**
* Created by Vector on 2016/8/12 0012.
*/
public class CProgressDialogUtils {
private static final String TAG = CProgressDialogUtils.class.getSimpleName();
private static ProgressDialog sCircleProgressDialog;
private CProgressDialogUtils() {
throw new UnsupportedOperationException("cannot be instantiated");
}
public static void showProgressDialog(Activity activity) {
showProgressDialog(activity, "加载中", false, null);
}
public static void showProgressDialog(Activity activity, DialogInterface.OnCancelListener listener) {
showProgressDialog(activity, "加载中", true, listener);
}
public static void showProgressDialog(Activity activity, String msg) {
showProgressDialog(activity, msg, false, null);
}
public static void showProgressDialog(Activity activity, String msg, DialogInterface.OnCancelListener listener) {
showProgressDialog(activity, msg, true, listener);
}
public static void showProgressDialog(final Activity activity, String msg, boolean cancelable, DialogInterface.OnCancelListener listener) {
if (activity == null || activity.isFinishing()) {
return;
}
if (sCircleProgressDialog == null) {
sCircleProgressDialog = new ProgressDialog(activity);
sCircleProgressDialog.setMessage(msg);
sCircleProgressDialog.setOwnerActivity(activity);
sCircleProgressDialog.setOnCancelListener(listener);
sCircleProgressDialog.setCancelable(cancelable);
} else {
if (activity.equals(sCircleProgressDialog.getOwnerActivity())) {
sCircleProgressDialog.setMessage(msg);
sCircleProgressDialog.setCancelable(cancelable);
sCircleProgressDialog.setOnCancelListener(listener);
} else {
//不相等,所以取消任何ProgressDialog
cancelProgressDialog();
sCircleProgressDialog = new ProgressDialog(activity);
sCircleProgressDialog.setMessage(msg);
sCircleProgressDialog.setCancelable(cancelable);
sCircleProgressDialog.setOwnerActivity(activity);
sCircleProgressDialog.setOnCancelListener(listener);
}
}
if (!sCircleProgressDialog.isShowing()) {
sCircleProgressDialog.show();
}
}
public static void cancelProgressDialog(Activity activity) {
if (sCircleProgressDialog != null && sCircleProgressDialog.isShowing()) {
if (sCircleProgressDialog.getOwnerActivity() == activity) {
sCircleProgressDialog.cancel();
sCircleProgressDialog = null;
}
}
}
public static void cancelProgressDialog() {
if (sCircleProgressDialog != null && sCircleProgressDialog.isShowing()) {
sCircleProgressDialog.cancel();
sCircleProgressDialog = null;
}
}
}
- 下载
OkGoUpdateHttpUtil
import android.support.annotation.NonNull;
import android.util.Log;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.model.Progress;
import com.vector.update_app.HttpManager;
import java.io.File;
import java.util.Map;
/**
* 使用OkGo实现接口
*/
public class OkGoUpdateHttpUtil implements HttpManager {
/**
* 异步get
*
* @param url get请求地址
* @param params get参数
* @param callBack 回调
*/
@Override
public void asyncGet(@NonNull String url, @NonNull Map<String, String> params, @NonNull final Callback callBack) {
OkGo.<String>get(url).params(params).execute(new com.lzy.okgo.callback.StringCallback() {
@Override
public void onSuccess(com.lzy.okgo.model.Response<String> response) {
callBack.onResponse(response.body());
}
@Override
public void onError(com.lzy.okgo.model.Response<String> response) {
super.onError(response);
callBack.onError("异常");
}
});
}
/**
* 异步post
*
* @param url post请求地址
* @param params post请求参数
* @param callBack 回调
*/
@Override
public void asyncPost(@NonNull String url, @NonNull Map<String, String> params, @NonNull final Callback callBack) {
OkGo.<String>post(url).params(params).execute(new com.lzy.okgo.callback.StringCallback() {
@Override
public void onSuccess(com.lzy.okgo.model.Response<String> response) {
callBack.onResponse(response.body());
}
@Override
public void onError(com.lzy.okgo.model.Response<String> response) {
super.onError(response);
callBack.onError("异常");
}
});
}
/**
* 下载
*
* @param url 下载地址
* @param path 文件保存路径
* @param fileName 文件名称
* @param callback 回调
*/
@Override
public void download(@NonNull String url, @NonNull String path, @NonNull String fileName, @NonNull final FileCallback callback) {
OkGo.<File>get(url).execute(new com.lzy.okgo.callback.FileCallback(path, fileName) {
@Override
public void onSuccess(com.lzy.okgo.model.Response<File> response) {
callback.onResponse(response.body());
Log.e("onSuccess==","");
}
@Override
public void onStart(com.lzy.okgo.request.base.Request<File, ? extends com.lzy.okgo.request.base.Request> request) {
super.onStart(request);
callback.onBefore();
Log.e("onBefore=","");
}
@Override
public void onError(com.lzy.okgo.model.Response<File> response) {
super.onError(response);
callback.onError("异常");
Log.e("onError=","");
}
@Override
public void downloadProgress(Progress progress) {
super.downloadProgress(progress);
callback.onProgress(progress.fraction, progress.totalSize);
Log.e("onProgressa=","");
}
});
}
使用OKGO下载需添加
compile 'com.lzy.net:okgo:3.0.4'
UpdateAppHttpUtil
import com.vector.update_app.HttpManager;
import com.zhy.http.okhttp.OkHttpUtils;
import com.zhy.http.okhttp.callback.FileCallBack;
import com.zhy.http.okhttp.callback.StringCallback;
import java.io.File;
import java.util.Map;
import okhttp3.Call;
import okhttp3.Request;
import okhttp3.Response;
/**
* Created by Vector
* on 2017/6/19 0019.
*/
public class UpdateAppHttpUtil implements HttpManager {
/**
* 异步get
*
* @param url get请求地址
* @param params get参数
* @param callBack 回调
*/
@Override
public void asyncGet(@NonNull String url, @NonNull Map<String, String> params, @NonNull final Callback callBack) {
OkHttpUtils.get()
.url(url)
.params(params)
.build()
.execute(new StringCallback() {
@Override
public void onError(Call call, Response response, Exception e, int id) {
callBack.onError(validateError(e, response));
}
@Override
public void onResponse(String response, int id) {
callBack.onResponse(response);
}
});
}
/**
* 异步post
*
* @param url post请求地址
* @param params post请求参数
* @param callBack 回调
*/
@Override
public void asyncPost(@NonNull String url, @NonNull Map<String, String> params, @NonNull final Callback callBack) {
OkHttpUtils.post()
.url(url)
.params(params)
.build()
.execute(new StringCallback() {
@Override
public void onError(Call call, Response response, Exception e, int id) {
callBack.onError(validateError(e, response));
}
@Override
public void onResponse(String response, int id) {
callBack.onResponse(response);
}
});
}
/**
* 下载
*
* @param url 下载地址
* @param path 文件保存路径
* @param fileName 文件名称
* @param callback 回调
*/
@Override
public void download(@NonNull String url, @NonNull String path, @NonNull String fileName, @NonNull final FileCallback callback) {
OkHttpUtils.get()
.url(url)
.build()
.execute(new FileCallBack(path, fileName) {
@Override
public void inProgress(float progress, long total, int id) {
callback.onProgress(progress, total);
}
@Override
public void onError(Call call, Response response, Exception e, int id) {
callback.onError(validateError(e, response));
}
@Override
public void onResponse(File response, int id) {
callback.onResponse(response);
}
@Override
public void onBefore(Request request, int id) {
super.onBefore(request, id);
callback.onBefore();
}
});
}
使用OKGO下载需添加
compile 'com.qianwen:okhttp-utils:3.8.0'
也可以使用其他作为下载,需要自己定义
- 修改json格式
修改update-app模块中UpdateAppBean里参数
根据自己json格式修改
修改update-app模块中UpdateAppManager里
processData()里的判断跟新条件
根据自己的实际情况进行修改
例如根据版本号判断↓
if (!mUpdateApp.getNewVersion().equals(viewname))
使用
剩下的使用和官方文档的一样,只需修改json解析
例子:
public void updateDiy() {
// String path = Environment.getExternalStorageDirectory().getAbsolutePath();
Map<String, String> params = new HashMap<String, String>();
params.put("a", "version");
// params.put("appVersion", AppUpdateUtils.getVersionName(this));
// params.put("key1", "value2");
// params.put("key2", "value3");
new UpdateAppManager
.Builder()
//必须设置,当前Activity
.setActivity(this)
//必须设置,实现httpManager接口的对象
.setHttpManager(new OkGoUpdateHttpUtil())
//必须设置,更新地址
.setUpdateUrl(Consts.NetUrl.BASE_NET_URL)
//全局异常捕获
.handleException(new ExceptionHandler() {
@Override
public void onException(Exception e) {
e.printStackTrace();
}
})
//以下设置,都是可选
//设置请求方式,默认get
.setPost(true)
//不显示通知栏进度条
// .dismissNotificationProgress()
//是否忽略版本
// .showIgnoreVersion()
//添加自定义参数,默认version=1.0.0(app的versionName);apkKey=唯一表示(在AndroidManifest.xml配置)
.setParams(params)
//设置点击升级后,消失对话框,默认点击升级后,对话框显示下载进度,如果是强制更新,则设置无效
// .hideDialogOnDownloading()
//设置头部,不设置显示默认的图片,设置图片后自动识别主色调,然后为按钮,进度条设置颜色
.setTopPic(R.mipmap.top_8)
//为按钮,进度条设置颜色。
.setThemeColor(0xffffac5d)
//设置apk下砸路径,默认是在下载到sd卡下/Download/1.0.0/test.apk
// .setTargetPath(path)
//设置appKey,默认从AndroidManifest.xml获取,如果,使用自定义参数,则此项无效
// .setAppKey("ab55ce55Ac4bcP408cPb8c1Aaeac179c5f6f")
.setUpdateDialogFragmentListener(new IUpdateDialogFragmentListener() {
@Override
public void onUpdateNotifyDialogCancel(UpdateAppBean updateApp) {
//用户点击关闭按钮,取消了更新,如果是下载完,用户取消了安装,则可以在 onActivityResult 监听到。
}
})
//不自动,获取
// .setIgnoreDefParams(true)
.build()
//检测是否有新版本
.checkNewApp(new UpdateCallback() {
/**
* 解析json,自定义协议
*
* @param json 服务器返回的json
* @return UpdateAppBean
*/
@Override
protected UpdateAppBean parseJson(String json) {
UpdateAppBean updateAppBean = new UpdateAppBean();
try {
org.json.JSONObject jsonObject = new org.json.JSONObject(json);
String jsonObjects = jsonObject.optString("data");
org.json.JSONObject jsonObjectdata = new org.json.JSONObject(jsonObjects);
LogUtils.e("apk地址=",jsonObjectdata.optString("update"));
final String newVersion = jsonObjectdata.optString("version");
updateAppBean
//(必须)是否更新Yes,No
.setUpdate("Yes")
//(必须)新版本号,
.setNewVersion(newVersion)
//(必须)下载地址
.setApkFileUrl(jsonObjectdata.optString("update"))
//大小,不设置不显示大小,可以不设置
.setTargetSize(jsonObject.optString("target_size"))
//是否强制更新,可以不设置
.setConstraint(false)
//设置md5,可以不设置
.setNewMd5(jsonObject.optString("new_md5"));
} catch (JSONException e) {
e.printStackTrace();
}
return updateAppBean;
}
@Override
protected void hasNewApp(UpdateAppBean updateApp, UpdateAppManager updateAppManager) {
updateAppManager.showDialogFragment();
}
/**
* 网络请求之前
*/
@Override
public void onBefore() {
CProgressDialogUtils.showProgressDialog(LoginActivity.this);
}
/**
* 网路请求之后
*/
@Override
public void onAfter() {
CProgressDialogUtils.cancelProgressDialog(LoginActivity.this);
}
/**
* 没有新版本
*/
@Override
public void noNewApp(String error) {
Toast.makeText(LoginActivity.this, "没有新版本", Toast.LENGTH_SHORT).show();
}
});
}