Coder Social home page Coder Social logo

appupdate's People

Contributors

bean-liu avatar wvector avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

appupdate's Issues

自定义协议,点击升级没有进度条

new UpdateAppManager.Builder()
//必须设置,当前Activity
.setActivity(activity)
//必须设置,实现httpManager接口的对象
.setHttpManager(new UpdateAppHttpUtil())
//必须设置,更新地址
.setUpdateUrl(Urls.UPDATA_APP)
//以下设置,都是可选
//设置请求方式,默认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);
JSONArray array = jsonObject.optJSONArray("list");
for (int i = 0; i < array.length(); i ++){
JSONObject obj = array.getJSONObject(i);
if (i == 0){
updateAppBean
//(必须)是否更新Yes,No
.setUpdate("Yes")
//(必须)新版本号,
.setNewVersion(obj.optString("versionNo"))
//(必须)下载地址
//.setApkFileUrl(obj.optString("updateUrl"))
.setApkFileUrl("https://raw.githubusercontent.com/WVector/AppUpdateDemo/master/apk/app-debug.apk")
//(必须)更新内容
.setUpdateLog(obj.optString("updateMemo"))
//大小,不设置不显示大小,可以不设置
//.setTargetSize(jsonObject.optString("target_size"))
//设置md5,可以不设置
//.setNewMd5(jsonObject.optString("new_md51"))
//是否强制更新,可以不设置
//.setConstraint(obj.optString("isUpdate").equals("y"));
.setConstraint(true);
}
}
} catch (JSONException e) {
e.printStackTrace();
}
return updateAppBean;
}

                /**
                 * 网络请求之前
                 */
                @Override
                public void onBefore() {
                }

                /**
                 * 网路请求之后
                 */
                @Override
                public void onAfter() {
                }

                /**
                 * 没有新版本
                 */
                @Override
                public void noNewApp() {

                }

                /**
                 *  自定义更新对话框
                 * */
                @Override
                protected void hasNewApp(UpdateAppBean updateApp, final UpdateAppManager updateAppManager) {
                    super.hasNewApp(updateApp, updateAppManager);

// String message = updateApp.getUpdateLog();
// boolean isFroce = updateApp.isConstraint();
// DialogUtil.showDiglogNoDismiss(activity, "有新本更新", message, isFroce ? "" : "取消", "升级", isFroce, new DialogUtil.CallBack() {
// @OverRide
// public void onDefault() {
// updateAppManager.download();
// }
// });
}
});

我导入发生了错误

Process: tsinghua.com.villageassistantclick, PID: 13145
java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.Worker thread.
at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:62)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
Caused by: java.lang.NoClassDefFoundError: okhttp3.internal.http.HttpEngine
at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:219)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:170)
at okhttp3.RealCall.execute(RealCall.java:60)
at retrofit2.OkHttpCall.execute(OkHttpCall.java:174)
at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$RequestArbiter.request(RxJavaCallAdapterFactory.java:171)
at rx.internal.operators.OperatorSubscribeOn$1$1$1.request(OperatorSubscribeOn.java:80)
at rx.Subscriber.setProducer(Subscriber.java:209)
at rx.internal.operators.OperatorSubscribeOn$1$1.setProducer(OperatorSubscribeOn.java:76)
at rx.Subscriber.setProducer(Subscriber.java:205)
at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:152)
at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:138)
at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:50)
at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
at rx.Observable.unsafeSubscribe(Observable.java:8666)
at rx.internal.operators.OperatorSubscribeOn$1.call(OperatorSubscribeOn.java:94)
at rx.internal.schedulers.CachedThreadScheduler$EventLoopWorker$1.call(CachedThreadScheduler.java:220)
at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422) 
at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152) 
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
at java.lang.Thread.run(Thread.java:841) 

异常

在三星手机上会报错:API 18
Unable to get provider com.vector.update_app.UpdateFileProvider: java.lang.ClassNotFoundException: Didn't find class "com.vector.update_app.UpdateFileProvider" on path: /data/app/com.redocn.redocn-1.apk

自定义协议+自定义对话框,怎么还会弹窗默认的对话框

new UpdateAppManager.Builder()
//必须设置,当前Activity
.setActivity(activity)
//必须设置,实现httpManager接口的对象
.setHttpManager(new UpdateAppHttpUtil())
//必须设置,更新地址
.setUpdateUrl(Urls.UPDATA_APP)
//以下设置,都是可选
//设置请求方式,默认get
.setPost(false)
//添加自定义参数,默认version=1.0.0(app的versionName);apkKey=唯一表示(在AndroidManifest.xml配置)
.setParams(params)
//设置点击升级后,消失对话框,默认点击升级后,对话框显示下载进度
//.hideDialogOnDownloading(true)
//设置头部,不设置显示默认的图片,设置图片后自动识别主色调,然后为按钮,进度条设置颜色
//.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);
JSONArray array = jsonObject.optJSONArray("list");
for (int i = 0; i < array.length(); i ++){
JSONObject obj = array.getJSONObject(i);
if (i == 0){
updateAppBean
//(必须)是否更新Yes,No
.setUpdate("Yes")
//(必须)新版本号,
.setNewVersion(obj.optString("versionNo"))
//(必须)下载地址
//.setApkFileUrl(obj.optString("updateUrl"))
.setApkFileUrl("https://raw.githubusercontent.com/WVector/AppUpdateDemo/master/apk/app-debug.apk")
//(必须)更新内容
.setUpdateLog(obj.optString("updateMemo"))
//大小,不设置不显示大小,可以不设置
//.setTargetSize(jsonObject.optString("target_size"))
//设置md5,可以不设置
//.setNewMd5(jsonObject.optString("new_md51"))
//是否强制更新,可以不设置
.setConstraint(obj.optString("isUpdate").equals("y"));
}
}
} catch (JSONException e) {
e.printStackTrace();
}
return updateAppBean;
}

                /**
                 * 网络请求之前
                 */
                @Override
                public void onBefore() {
                }

                /**
                 * 网路请求之后
                 */
                @Override
                public void onAfter() {
                }

                /**
                 * 没有新版本
                 */
                @Override
                public void noNewApp() {

                }

                /**
                 *  自定义更新对话框
                 * */
                @Override
                protected void hasNewApp(UpdateAppBean updateApp, final UpdateAppManager updateAppManager) {
                    super.hasNewApp(updateApp, updateAppManager);

// String message = updateApp.getUpdateLog();
// boolean isFroce = updateApp.isConstraint();
// DialogUtil.showDiglogNoDismiss(activity, "有新本更新", message, isFroce ? "" : "取消", "升级", isFroce, new DialogUtil.CallBack() {
// @OverRide
// public void onDefault() {
// updateAppManager.download();
// }
// });
}

isUpdate() 判断问题。

”update": "Yes"的时候,就更新。如果下载了更新,并安装了,点更新的话还是会继续弹窗提示有更新?
而不是提示“已经是最新版本”。

每次弹出都先显示默认的红色背景

谢谢开源这个好用的库,发现一个小问题,设置的背景图片之后,弹出升级提示的背景经常能看到由默认的红色背景变成我设置的那个背景

建议

使用原有的弹窗点击取消后望能增加操作,或者检测到弹窗被取消。

用夜神模拟器运行会有问题.

Didn't find class "com.vector.update_app.UpdateFileProvider" on path: DexPathList[[zip file "/data/app/com.pancool.ymi-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.pancool.ymi-2, /system/lib]]

建议作者改善或者去掉appIsDownloaded中MD5值的判断

可以提供获取当前apk 的MD5值的方法,然后与下载的文件的MD5值进行对比,这样就完美了..
源码里面的manifest里面设置的MD5值是死的,估计是想让我们替换为自己的md5值吧,而且服务器如果不返回MD5值的话,建议使用另外的方式去判断当前APK和新的APK的区别,谢谢大佬

本地客户端版本号与服务器版本号一样都是0.8.3,但还是会提示更新

部署服务器后台的代码后,找不到mobileVersionManger/login.html

然后拿sample里的url测试,发现sample里的url只是指向了github里更新的json文件,不管本地版本号是多少,都会返回此json文件并更新。

请求:
OkGo: --> GET https://raw.githubusercontent.com/WVector/AppUpdateDemo/master/json/json.txt?key2=value3&appKey=ab55ce55Ac4bcP408cPb8c1Aaeac179c5f6f&appVersion=0.8.3&key1=value2 http/1.1

返回:
OkGo: body:{
"update": "Yes",
"new_version": "0.8.3",
"apk_file_url": "https://raw.githubusercontent.com/WVector/AppUpdateDemo/master/apk/app-debug.apk",
"update_log": "1,添加删除信用卡接口。\r\n2,添加vip认证。\r\n3,区分自定义消费,一个小时不限制。\r\n4,添加放弃任务接口,小时内不生成。\r\n5,消费任务手动生成。",
"target_size": "5M",
"new_md5":"295687E756F569C7159974DD493489A5",
"constraint": false
}

正常:
{
"update": "No",//没有新版本
}

下载路径错误:/storage/C33C-1BF6/Download

千匍,您好

最近在使用您开发的升级库遇到一点小问题,在测试的时候,我使用的是

华为Che1-CL10的手机

  • 系统EMUI4.0
  • Android版本6.0.1

点击更新APP(默认),就是最简单的更新按钮,控制台提示

  • 下载路径错误:/storage/C33C-1BF6/Download

我看了一下您的代码,在UpdateAppManager.java中,第140行的verify()函数

有一个preSuffix验证,限定了下载路径必须是要以"/storage/emulated"开头的

这里修改一下会不会好一些,

通过判断是否装载了SD卡会不会好一些,否则有些手机就没法下载了。

DEMO报错

从这里下载的DEMO,在AS里可以编译运行,但是把编译过后的APK安装包手动放到手机里安装就会报错,报错如下:
08-24 09:30:46.441 9399-9399/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.vector.appupdatedemo, PID: 9399
java.lang.RuntimeException: Unable to instantiate application com.vector.appupdatedemo.App: java.lang.ClassNotFoundException: Didn't find class "com.vector.appupdatedemo.App" on path: DexPathList[[zip file "/data/app/com.vector.appupdatedemo-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
at android.app.LoadedApk.makeApplication(LoadedApk.java:563)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4576)
at android.app.ActivityThread.access$1500(ActivityThread.java:148)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1353)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5310)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.vector.appupdatedemo.App" on path: DexPathList[[zip file "/data/app/com.vector.appupdatedemo-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
at android.app.Instrumentation.newApplication(Instrumentation.java:1002)
at android.app.LoadedApk.makeApplication(LoadedApk.java:558)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4576) 
at android.app.ActivityThread.access$1500(ActivityThread.java:148) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1353) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:135) 
at android.app.ActivityThread.main(ActivityThread.java:5310) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696) 
Suppressed: java.lang.ClassNotFoundException: com.vector.appupdatedemo.App
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
... 13 more
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available

在强制更新的时候,在更新界面,还没点击升级按钮,把程序切换置后台,再切换回来,提示app正在更新,其实并没有点击升级按钮,感觉提示语不恰当

在强制更新的情况下,我写的逻辑是,在oncreate方法里面调接口看有没有版本更新,如果有,就在本地存放一个true,没有就存放false,我在onResume方法里面,获取存放的这个值。如果是最新版本(已更新,没有最新版会存放false),更新弹窗就不出来了,如果不是最新版本,弹窗还照样出来。

If I havn't appKey

No doubt this is great library ever, I'm using dropbox to update.txt but library assign appKey and version associate with link. Dropbox just handle following link, How I manage this condition? Please help me

08-02 23:16:13.204 20894-21242/com.ahmer.books I/okHttp: <-- 400  https://dl.dropboxusercontent.com/s/3ah4tgrwd361uu9/update.txt?appKey=null&version=23.6002817 (7383ms)
08-02 23:16:13.204 20894-21242/com.ahmer.books I/okHttp: 	server: nginx
08-02 23:16:13.204 20894-21242/com.ahmer.books I/okHttp: 	date: Wed, 02 Aug 2017 18:16:18 GMT
08-02 23:16:13.204 20894-21242/com.ahmer.books I/okHttp: 	content-type: text/html
08-02 23:16:13.204 20894-21242/com.ahmer.books I/okHttp: 	x-dropbox-request-id: 5cd5db4b86c5f15d656d799827f2fee5
08-02 23:16:13.204 20894-21242/com.ahmer.books I/okHttp: 	x-robots-tag: noindex, nofollow, noimageindex
08-02 23:16:13.204 20894-21242/com.ahmer.books I/okHttp:  

静默下载 问题 demo

静默下载,关闭更新弹窗 再点击更新 一直显示 “app正在更新” DownloadService.isRunning一直 true

直接让后台控制更新不太好吧

直接让后台通过update在判断更新,如果我已经是最新的apk,每次进去还是会提示这个鬼东西,感觉还是使用版本判断比较靠谱!

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
    at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1842)
    at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1860)
    at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:650)
    at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:609)
    at android.support.v4.app.DialogFragment.dismissInternal(DialogFragment.java:205)
    at android.support.v4.app.DialogFragment.dismiss(DialogFragment.java:171)
    at com.vector.update_app.UpdateDialogFragment$4.onFinish(UpdateDialogFragment.java:312)
    at com.vector.update_app.service.DownloadService$FileDownloadCallBack.onResponse(DownloadService.java:256)
    at com.vector.appupdatedemo.http.UpdateAppHttpUtil$3.onResponse(UpdateAppHttpUtil.java:102)
    at com.vector.appupdatedemo.http.UpdateAppHttpUtil$3.onResponse(UpdateAppHttpUtil.java:89)
    at com.zhy.http.okhttp.OkHttpUtils$5.run(OkHttpUtils.java:256)
    at android.os.Handler.handleCallback(Handler.java:733)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5315)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:680)
    at dalvik.system.NativeStart.main(Native Method)

你好,无意间发现这个库,非常感谢你提供这么方便的库,不过今天下载你的demo尝试时:点击下载,然后按home键返回桌面做其他的事,在下载完了之后就会出现这个异常。
定位错误出现在demo中的UpdateDialogFragment的312行

  @Override
                public boolean onFinish(File file) {
                    if (!UpdateDialogFragment.this.isRemoving()) {
                        dismiss();
                    }
                    return true;
                }

中的dismiss();
测试时用的华为和小米,系统版本分别是4.4和5.0,两者都会出现这种情况。你可以试一下。

提个建议

检查是否有新版本的功能,是不是没必要做在类库里?类库只需要提示框、下载、安装这些功能就好

下载中 页面滑动卡顿

在下载过程中 是否能关闭dialog 让在后台下载

我修改了源码 在下载中 关闭dialog 但是在下载中的时候 页面滑动非常卡顿 不知道为什么

java.lang.IllegalArgumentException: unexpected url: www.xxxx.com/xs/xxx/app/xxx_Android_01.01.40.apk

url中存在下划线,好像就会报这个异常。
at okhttp3.Request$Builder.url(Request.java:143)
at com.zhy.http.okhttp.request.OkHttpRequest.initBuilder(OkHttpRequest.java:49)
at com.zhy.http.okhttp.request.OkHttpRequest.(OkHttpRequest.java:39)
at com.zhy.http.okhttp.request.GetRequest.(GetRequest.java:15)
at com.zhy.http.okhttp.builder.GetBuilder.build(GetBuilder.java:31)
at com.mengtai.athome.common.utils.UpdateAppHttpUtil.download(UpdateAppHttpUtil.java:97)

日志显示下载成功,但界面提示“更新新版本出错,未知异常 code=200”

打印出来的日志显示成功,但界面提示“更新新版本出错,未知异常 code=200”
日志如下(为了防止攻击,我在http:// 后面加了空格):
08-08 14:10:22.169 20642-20698/? I/okHttp: <-- 200 OK http:// 3a3g.cn/app-1.1.apk (23ms)
08-08 14:10:22.169 20642-20698/? I/okHttp: Date: Tue, 08 Aug 2017 06:10:13 GMT
08-08 14:10:22.169 20642-20698/? I/okHttp: Server: Apache/2.4.25 (Win64) PHP/5.6.30
08-08 14:10:22.169 20642-20698/? I/okHttp: Accept-Ranges: bytes
08-08 14:10:22.169 20642-20698/? I/okHttp: ETag: W/"2355487-1502168009865"
08-08 14:10:22.169 20642-20698/? I/okHttp: Last-Modified: Tue, 08 Aug 2017 04:53:29 GMT
08-08 14:10:22.169 20642-20698/? I/okHttp: Content-Type: application/vnd.android.package-archive
08-08 14:10:22.169 20642-20698/? I/okHttp: Content-Length: 2355487
08-08 14:10:22.169 20642-20698/? I/okHttp: Keep-Alive: timeout=5, max=99
08-08 14:10:22.169 20642-20698/? I/okHttp: Connection: Keep-Alive
08-08 14:10:22.169 20642-20698/? I/okHttp:
08-08 14:10:22.170 20642-20698/? I/okHttp: body: maybe [file part] , too large too print , ignored!
08-08 14:10:22.170 20642-20698/? I/okHttp: <-- END HTTP

自定义 json 格式的建议

很好的更新库,但是能够支持自定义返回 json 格式就更好了。例如开放 json-> model 的解析接口。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.