Giter Site home page Giter Site logo

update's Introduction

update

清晰灵活简单易用的应用更新库

  • 支持断点续传
  • 支持强制安装:不安装无法使用app
  • 支持静默更新:不提示用户直接下载安装
  • 支持可忽略该版本:忽略后不再提示用户更新该版本
  • 支持在通知栏显示下载进度,可监听下载进度
  • 支持自定义更新查询
  • 支持自定义下载
  • 支持自定义提示对话框

screenshot

引入

repositories {
    maven { url "https://gitee.com/ezy/repo/raw/cosmo/"}
}
dependencies {
    implementation "me.reezy.cosmo:update:0.9.1"
}

Usage

// 设置更新信息源
UpdateManager.setChecker("http://yourdomain.com/path")
// 查询更新
UpdateManager.check(context)
// 在设置界面点击检查更新:默认无新版本时不会提示用户
UpdateManager.check(this) {
    Toast.makeText(this, it.getFullMessage(this), Toast.LENGTH_LONG).show()
}
UpdateManager.setPrompter { activity, agent
    UpdatePromptDialog(activity, it).show()
}

// 自定义更新对话框
UpdateManager.check(this, onPrompt = { activity, agent ->
    UpdatePromptDialog(activity, agent).show()
})
// 清除已经下载好了的包
UpdateManager.clean(context);

整个更新流程很简单,具体请看 UpdateExecutor

when {
    // 没有新版本 -> 返回结果
    !info.hasUpdate -> returnResult(UpdateResult(UpdateResult.UPDATE_NO_NEWER))
    // 强制更新 -> 提示用户更新,不显示[取消][忽略]按钮
    info.isForce -> prompt(info, task)
    // 静默更新 -> 不提示用户直接更新
    info.isSilent -> update(info, task)
    // 不可忽略的版本 -> 提示用户更新,不显示[忽略]按钮
    !info.isIgnorable -> prompt(info, task)
    // 该版本已经被忽略 -> 返回结果
    info.isIgnored -> returnResult(UpdateResult(UpdateResult.UPDATE_IGNORED))
    // 提示用户更新
    else -> prompt(info, task)
}

UpdateInfo

data class UpdateInfo(
    // 是否有新版本
    val hasUpdate: Boolean = false,

    // 是否强制安装:为true时不安装无法使用app
    val isForce: Boolean = false,

    // 是否静默更新:不提示用户直接下载安装
    val isSilent: Boolean = false,

    // 是否可忽略该版本:忽略后不再提示用户更新该版本
    val isIgnorable: Boolean = false,

    // 是否在通知栏显示下载进度:为true时显示
    val isShowNotification: Boolean = true,

    // 更新内容文案
    val updateContent: String = "",

    // 新包下载地址
    val url: String = "",

    // 新包哈希值
    val hash: String = "",
)

LICENSE

The Component is open-sourced software licensed under the Apache license.

update's People

Contributors

czy1121 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

update's Issues

静默下载模式

感觉静默下载是不是可以下载,然后出现提示安装的框。而不是静默下载后要下一次进来,自动安装。这样用户可以自己选择安不安装,因为现在国内用户对自动安装还是很不友好的

建议检查版本跟下载版本解耦

用了一段时间你的这个库,感觉还是不错的,不过我个人觉得检查版本跟下载版本耦合度有点高,建议分开,也就是说可以只使用下载功能

Caused by: java.lang.NullPointerException

Caused by: java.lang.NullPointerException
at ezy.boost.update.p.a(UpdateManager.java:61)

context.getExternalFilesDir("").getParentFile()报空指针了,个别6.0系统以下的手机,这里需要加上判断sd卡状态吗?

强制更新!!!

强制更新下载完成弹出自动安装界面,如果取消安装,返回应用界面(未退出),没有拦截用户操作并提示安装,用户任然使用旧版本,感觉不咋合理。

Failed to find configured root that contains

java.lang.IllegalArgumentException: Failed to find configured root that contains
at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:711)
at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:400)
at ezy.boost.update.UpdateUtil.install(UpdateUtil.java:111)
at ezy.boost.update.UpdateAgent.doInstall(UpdateAgent.java:251)
at ezy.boost.update.UpdateAgent.onFinish(UpdateAgent.java:175)
at ezy.boost.update.UpdateDownloader.onPostExecute(UpdateDownloader.java:124)
at ezy.boost.update.UpdateDownloader.onPostExecute(UpdateDownloader.java:34)
at android.os.AsyncTask.finish(AsyncTask.java:688)
at android.os.AsyncTask.-wrap1(AsyncTask.java)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:705)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:156)
at android.app.ActivityThread.main(ActivityThread.java:6524)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:941)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:831)

Nexus 6 Android 6.0.1 文件读写异常

java.io.FileNotFoundException: /storage/emulated/0/Android/data/ezy.demo.update/cache/56cf48f10e4cf6043fbf53bbbc4009e3: open failed: EACCES (Permission denied)
05-09 18:11:59.841 30251-30892/ezy.demo.update W/System.err: at libcore.io.IoBridge.open(IoBridge.java:452)
05-09 18:11:59.841 30251-30892/ezy.demo.update W/System.err: at java.io.RandomAccessFile.(RandomAccessFile.java:117)
05-09 18:11:59.841 30251-30892/ezy.demo.update W/System.err: at ezy.boost.update.UpdateDownloader$LoadingRandomAccessFile.(UpdateDownloader.java:236)
05-09 18:11:59.841 30251-30892/ezy.demo.update W/System.err: at ezy.boost.update.UpdateDownloader.download(UpdateDownloader.java:184)
05-09 18:11:59.842 30251-30892/ezy.demo.update W/System.err: at ezy.boost.update.UpdateDownloader.doInBackground(UpdateDownloader.java:78)
05-09 18:11:59.842 30251-30892/ezy.demo.update W/System.err: at ezy.boost.update.UpdateDownloader.doInBackground(UpdateDownloader.java:34)
05-09 18:11:59.842 30251-30892/ezy.demo.update W/System.err: at android.os.AsyncTask$2.call(AsyncTask.java:295)
05-09 18:11:59.842 30251-30892/ezy.demo.update W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
05-09 18:11:59.842 30251-30892/ezy.demo.update W/System.err: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
05-09 18:11:59.842 30251-30892/ezy.demo.update W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
05-09 18:11:59.842 30251-30892/ezy.demo.update W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
05-09 18:11:59.842 30251-30892/ezy.demo.update W/System.err: at java.lang.Thread.run(Thread.java:818)
05-09 18:11:59.842 30251-30892/ezy.demo.update W/System.err: Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
05-09 18:11:59.843 30251-30892/ezy.demo.update W/System.err: at libcore.io.Posix.open(Native Method)
05-09 18:11:59.843 30251-30892/ezy.demo.update W/System.err: at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
05-09 18:11:59.843 30251-30892/ezy.demo.update W/System.err: at libcore.io.IoBridge.open(IoBridge.java:438)
05-09 18:11:59.843 30251-30892/ezy.demo.update W/System.err: ... 11 more
05-09 18:11:59.876 30251-30251/ezy.demo.update I/ezy.update: [3004]下载失败:磁盘读写错误

魅族 M57AC 获取文件夹报错

java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.File java.io.File.getParentFile()' on a null object reference

。。。.update.UpdateManager.create(UpdateManager.java:59)

[3004]下载失败:磁盘读写错误

java.io.FileNotFoundException: /56cf48f10e4cf6043fbf53bbbc4009e3: open failed: EROFS (Read-only file system)
at libcore.io.IoBridge.open(IoBridge.java:409)
at java.io.RandomAccessFile.(RandomAccessFile.java:118)
at ezy.boost.update.UpdateDownloader$LoadingRandomAccessFile.(UpdateDownloader.java:236)
at ezy.boost.update.UpdateDownloader.download(UpdateDownloader.java:184)
at ezy.boost.update.UpdateDownloader.doInBackground(UpdateDownloader.java:78)
at ezy.boost.update.UpdateDownloader.doInBackground(UpdateDownloader.java:34)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
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: libcore.io.ErrnoException: open failed: EROFS (Read-only file system)
at libcore.io.Posix.open(Native Method)
at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
at libcore.io.IoBridge.open(IoBridge.java:393)
... 11 more

提示3010 下载失败 校验错误

_提示3010 下载失败 校验错误 这个哪个地方校验失败了啊!
UpdateManager.setDebuggable(false);
UpdateManager.setWifiOnly(false);
UpdateManager.setUrl(mCheckUrl, getChannel());
UpdateManager.check(this);
check(false, true, false, false, true, 998);
UpdateManager.create(this).setUrl(mCheckUrl).setPostData("token="+getToken()).setManual(isManual).setNotifyId(notifyId).setParser(new IUpdateParser() {
public UpdateInfo parse(String source) throws Exception {
UpdateInfo info = new UpdateInfo();
info.hasUpdate = hasUpdate;
info.updateContent = "• 支持文字、贴纸、背景音乐,尽情展现欢乐气氛;\n• 两人视频通话支持实时滤镜,丰富滤镜,多彩心情;\n• 图片编辑新增艺术滤镜,一键打造文艺画风;\n• 资料卡新增点赞排行榜,看好友里谁是魅力之王。";
info.versionCode = App.versionCode;
info.versionName = versionName;
info.url = mUpdateUrl;
info.md5 = "---------------";
info.size = 10149314;
info.isForce = isForce;
info.isIgnorable = isIgnorable;
info.isSilent = isSilent;
return info;
}
}).check();

public String getChannel() {
String channel = null;
try {
ApplicationInfo ai = getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
channel = ai.metaData.getString("UMENG_CHANNEL");
if (channel == null) {
channel = String.valueOf(ai.metaData.getInt("UMENG_CHANNEL"));
}
} catch (NameNotFoundException e) {
e.printStackTrace();
}

	    return  channel;
	 }

这是集成的代码

MD5

小白问下自己的app的 MD5 怎么生成的?谢谢

多个provider节点导致manifest合并冲突

如果app引入的多个第三方库都有定义android.support.v4.content.FileProvider,则可能导致合并的时候冲突,建议自定义FileProvider extends android.support.v4.content.FileProvider,然后在类库的的manifest使用这个自定义FileProvider

项目运行 报这个是什么问题?

Caused by: java.lang.ClassNotFoundException: Didn't find class "ezy.boost.update.UpdateFileProvider" on path: DexPathList[[zip file "/data/app/com.xiaobu121.xiaobu.xiaobu_android-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.xiaobu121.xiaobu.xiaobu_android-1, /system/lib]]

install 出现 ActivityNotFoundException 导致闪退

在魅族和小米6.0上遇到了这个问题,确切的说是魅族,看见了日志,小米的没有看见日志,猜应该是一样的问题。在华为手机6.0以上测试没有这个。因为二次定制了下,不确定是不是我这边改完以后的情况。当版本大于23的时候通过捕获这个异常修改intent.setDataAndType为小于23的时候的设置方法(intent.setDataAndType(Uri.fromFile(file),“xxx”))解决了这个问题,不知道作者那边是不是也有同样的问题。

建议增加参数,可以跳过md5检查

在实际的检查更新接口中很有可能没有md5值,而接口又往往不是android开发人员可以变更的。
所以为了可以继续使用这个lib,建议增加一个参数,可以跳过对md5值的检查。

Https 下载链接?

看了下 UpdateDownloader 的代码,暂时还不兼容支持 Https 的下载链接。
是否考虑兼容呢?

借用出现问题

为什么我别的都没动只是把.apk地址换成另外的可用地址 走完进度条报校验错误? 求解

关于加密post请求查询新版本问题

你好,看了很多个自升级库,感觉你的这个是比较好的,不过有个问题想问下
我这边的App,查询版本更新是使用post方式向服务器传递当前版本号等参数,并且加密过后传递给服务器,服务器会根据我传递的版本号,告知我是否有新版本
但是如果我要使用你的这个库,不知道如何处理这个请求,是否可以把请求回来的参数直接传递到你的这个update库中,剩下的下载,通知栏,安装等操作由你的库来控制?

关于文档介绍的问题

单个功能介绍的比较详细,但如何使用到项目中让新手懵圈,整个运用流程感觉不够通俗易通

请求服务器更新信息的时候,没有响应超时怎么办?

我创建了一个progressBar,提示用户,我在检查更新信息.但是服务器没有响应的时候,超时的时候,我想隐藏progressBar,并用toast提示,检查失败....现在我不知道哪里可以回调一下,让我知道check请求超时了....能帮忙解决一下吗?谢谢!!!!!

更新安装包下载完成后总是提示“下载失败:检验错误”,但是MD5是没错的

`/**
* 检查更新
*/
private void checkUpdate() {
UpdateUtil.clean(getContext());//清除sp的忽略标志和apk文件缓存
UpdateManager.setDebuggable(true);
UpdateManager.setWifiOnly(false);
check();
}

void check() {
    UpdateManager.create(getContext()).setChecker(new IUpdateChecker() {
        @Override
        public void check(ICheckAgent agent, String url) {
            //定制查询更新
            L.i("update " + "checking");
            HttpURLConnection connection = null;
            try {
                connection = (HttpURLConnection) new URL(url).openConnection();
                connection.setRequestProperty("Accept", "application/json");
                connection.connect();
                if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                    agent.setInfo(UpdateUtil.readString(connection.getInputStream()));
                } else {
                    agent.setError(new UpdateError(UpdateError.CHECK_HTTP_STATUS, "" + connection.getResponseCode()));
                }
            } catch (IOException e) {
                e.printStackTrace();
                agent.setError(new UpdateError(UpdateError.CHECK_NETWORK_IO));
            } finally {
                if (connection != null) {
                    connection.disconnect();
                }
            }
        }
    }).setUrl(mCheckUrl).setManual(true).setNotifyId(998).setParser(new IUpdateParser() {
        @Override
        public UpdateInfo parse(String source) throws Exception {
            //定制解析过程
            UpdateInfo info = UpdateInfo.parse(source);
            L.i("url=" + info.url);
            return info;
        }
    }).setOnNotificationDownloadListener(new NotificationDownloadListener(getContext(), 998))
            .check();
}`

maxTimes配置没用

RT,lib里面的maxTimes没有别的地方引用,建议删除或者实现一下。
非常感谢👍

3010校验失败

后台存储的md5值是根据update这个库的方法算出的么?

mIsManual

mIsManual参数是做什么用的

手动更新和自动更新问题!!

看见有个isManual boolean类型的变量,我的理解是true表示用户手动检查更新,false是自动触发更新,不知道对不对,如果是这样理解,那么当当前为false则表示检测更新的一系列操作对用户是不可感知的,除非有更新则提示。那么3000以下的错误提示是不是不应该给出。

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.