Android简易新闻客户端自动升级 简易新闻(二十)

  • 关于
  • 说明
  • 第一步,添加引用
  • 第二步,注册蒲公英账号
  • 第三步,添加AndroidManifest.xml配置
  • 初始化
  • 最后一步
  • 打包上传

关于

没想到简易新闻系列博客已经写到了第二十系列,距离写的第一篇《使用Fragment+ViewPager +TabLayout自制简易新闻 app主要框架(简易新闻 一)》已经快有一年之久了,最近也有一段时间(2个月)没写博客了,今天突然心血来潮,想着说把之前的简易新闻加个自动更新功能吧,多余的不是,下面进入正题。

说明

此功能分为两种实现办法,第一种(调用三方),借助其成熟技术,我们调用sdk实现封装好的功能即可。第二种自己要有后台接口,然后有对应的接口包括版本号,更新内容啥的。然后我们在自己下载安装(难点在于后台接口、安装时候的权限以及android版本问题)。
第二种方法我暂时先不写博客了,现在先讲第一种方法(毕竟只是自己的项目,调用的三方虽然有次数限制也问题不大)。

第一步,添加引用

项目是在gradle3.2下的,下一步将会将项目更新到3.5全面兼容9.0+。
这里我用的第三方是蒲公英,当然最近还接触到Bugly,Bugly除了自动更新(可以说没有次数限制)还有热更新服务。
首先在工程的根目录下的build.gradle文件中添加仓库引用:

allprojects {repositories {google()jcenter()mavenCentral()//第三方更新提示maven { url "https://raw.githubusercontent.com/Pgyer/mvn_repo_pgyer/master" } //主要是这一行maven { url 'https://www.jitpack.io' }}
}

然后在项目的目录下的build.gradle中添加如下:

//蒲公英更新提示implementation 'com.pgyersdk:sdk:2.8.1'

sync一下,如果没有报错,那你真幸运。
如果报错了也不用担心,虽然我忘记截图了,不过大概内容是这样(后面补上了截图):

ERROR: Unable to resolve dependency for ':frametest@debug/compileClasspath': Could not resolve com.pgyersdk:sdk:2.8

然后我试着clean一下项目,然后报错内容变了如下:

清理缓存之后发现一样没有用,这个时候在Terminal中输入一下代码查看详细报错日志:

gradlew processDebugManifest -stacktrace


这个问题困扰了我好多天,现在附上解决办法解决Error:Could not resolve com.pgyersdk:sdk:2.8.1问题。
现在我们继续下一步。

第二步,注册蒲公英账号

我们需要在蒲公英平台注册账号并且个人认证一下:

然后我们选择内侧分发,选择发布新应用(添加空白应用),我们上传自己项目早期的包作为获取key的来源。如下:

然后点击添加应用。在接下来的页面中的App Key就是我们要用的:

第三步,添加AndroidManifest.xml配置

添加权限如下:

<!-- 必选-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 获取网络状态 -->
<uses-permission android:name="android.permission.INTERNET" /> <!-- 网络通信-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />  <!-- 获取设备信息 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 获取MAC地址-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 读写sdcard,storage等等 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <!-- 允许程序录制音频 -->
<uses-permission android:name="android.permission.GET_TASKS"/><!-- 可选-->
<uses-permission android:name="android.permission.READ_LOGS" /> <!-- 获取logcat日志 -->

添加我们的key到application里面:

 <!-- 必选-->//value里面放我们添加应用时候获得的key<meta-dataandroid:name="PGYER_APPID"android:value="c37b6b7b20ac0313968e190d123721e4" ></meta-data>

初始化

在application里面注册:

 PgyCrashManager.register(this);

最后一步

加上定义:

 static Context mContext;//第三方的实体类private AppBean appBean;

在我们想要展示更新的页面中添加更新检查方法,在oncreate方法里面新增更新检查初始化:

 mContext = MainActivity.this;initMap();

然后对应方法体:

    private void initUpdate() {PgyUpdateManager.register(MainActivity.this, new UpdateManagerListener() {@Overridepublic void onNoUpdateAvailable() {}@Overridepublic void onUpdateAvailable(String result) {System.out.println("获取版本信息:"+result);// 将新版本信息封装到AppBean中// final AppBean appBean = getAppBeanFromString(result);appBean = getAppBeanFromString(result);final SweetAlertDialog MyDialog = new SweetAlertDialog(mContext, SweetAlertDialog.NORMAL_TYPE).setTitleText("更新").setContentText(appBean.getReleaseNote()).setConfirmText("确定").setCancelText("取消").setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() {@Overridepublic void onClick(SweetAlertDialog sweetAlertDialog) {sweetAlertDialog.dismiss();if (Build.VERSION.SDK_INT>22){if (ContextCompat.checkSelfPermission(mContext,Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){//先判断有没有权限 ,没有就在这里进行权限的申请ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE},991);}else {//说明已经获取到存储权限了 想干嘛干嘛startDownloadTask(MainActivity.this,appBean.getDownloadURL());}}else {//这个说明系统版本在6.0之下,不需要动态获取权限。//说明已经获取到储存权限了 想干嘛干嘛startDownloadTask(MainActivity.this,appBean.getDownloadURL());}}});MyDialog.show();}});}

加上对存储权限请求的返回:

  /*** 高版本动态获取存储权限* @param requestCode 请求码* @param permissions 请求的权限* @param grantResults 返回的权限数据*/@Overridepublic void onRequestPermissionsResult(int requestCode,String[] permissions,int[] grantResults) {switch (requestCode){case 991:if (grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){//这里已经获取到了存储的权限,想干嘛干嘛了可以startDownloadTask(MainActivity.this,appBean.getDownloadURL());}else {//这里是拒绝给APP存储权限,给个提示什么的说明一下都可以。Toast.makeText(MainActivity.this,"请手动打开存储权限",Toast.LENGTH_SHORT).show();}break;default:break;}}

当然了这里就已经集成好了更新方法。

打包上传

我们在打包之前需要将版本增加一点,使这个上传到蒲公英平台的apk高于我们当前使用测试的版本,这样才会有更新提示,修改项目的build.gradle:

  defaultConfig {applicationId "com.example.frametest"minSdkVersion 16targetSdkVersion 28//默认是1 和1.0 我们改成2 和 2.0之后sync一下并且打包然后上传versionCode 2versionName "2.0"multiDexEnabled truetestInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"vectorDrawables.useSupportLibrary = true}

上传之后我们再把这个versionCode改成1 versionName改成1.0然后运行就会有更新的提示啦,如下:

好了,到此本篇到此结束,关于简易新闻前传请传送至android新闻客户端的实现或者android新闻app。有问题欢迎评论,关于源码的事情我已经放到了这两个博客的评论或者文章末尾了。

Android简易新闻客户端自动升级 简易新闻(二十)相关推荐

  1. 喧喧 2.5 发布,新增客户端自动升级,优化界面交互性能

    喧喧是由然之协同团队推出的一款轻量级的开源企业聊天软件.提供企业内部通讯交流.企业通讯录.协同办公通讯交流.企业IM解决方案. 喧喧官网: https://xuan.im/ 更新明细 新增 客户端自动 ...

  2. android自动更新列表,Android数据库表结构自动升级

    Android App开发如果涉及过数据库的朋友们肯定会碰到数据库升级的工作,Android官方的建议办法是override public void onUpgrade(SQLiteDatabase ...

  3. 如何使用GeneralUpdte构建客户端自动升级功能

    一.概要 本篇文章将向各位小伙伴介绍GeneralUpdate组件的使用,帮助第一次接触开发者快速上手应用在自己或企业项目中.如果本篇文章对您有帮助,希望帮忙点一下star.感谢各位开发者的支持. 帮 ...

  4. 【C#】C#客户端自动升级技术简析

    升级程序为独立的exe程序,由客户端程序调用实现. 客户端调用部分 /* 客户端代码中,调用更新程序部分 */ static bool CheckUpdate() {try{//string tmpF ...

  5. 网易新闻客户端iOS版本中新闻详情页(UIWebView)技术实现的分析探讨

    参考地址:http://blog.csdn.net/shaobo8910/article/details/51719673 本篇博客背景: 1:本人是网易新闻app的忠实用户,大约每天有2~3个小时的 ...

  6. android app无感知自动升级,Android中实现用户无感知处理后台崩溃

    正所谓,要想没有bug,就一行代码也不写.App到了用户的手里,肯定是崩溃越少越好.Android中的崩溃处理和iOS不太一样,iOS崩溃通常是闪退,而安卓会出现如下的蹩脚的对话框 image.png ...

  7. flutter 获取android 还是ios_Flutter完整开发实战详解(二十、 Android PlatformView 和键盘问题)...

    作为系列文章的第二十篇,本篇将结合官方的技术文档科普 Android 上 PlatformView 的实现逻辑,并且解释为什么在 Android 上 PlatformView 的键盘总是有问题. 为什 ...

  8. 初学Android,图形图像之使用Canvas,Paint绘图(二十五)

    下面是一个画各种图形的例子,具体的画图方法不用特别解释,看API就可以了 先定义一个继承自View的类DrawView package WangLi.Graphics.MyView;import an ...

  9. Android详细教程(基础篇):二十八、Android 广播机制BroadcastReceiver

    广播机制(BroadcastReceiver) 11.1. BroadcastReceiver简介 在实际应用中,我们常需要等,等待系统抑或其他应用发出一道指令,为自己的应用擦亮明灯指明方向.而这种等 ...

最新文章

  1. JSON 之父新作,JavaScript “葵花宝典”参悟 JS 之道
  2. OpenERP里面继承的用法
  3. [css] 请说说你对vh、vw的理解以及它们的运用场景是什么?
  4. rofl用什么播放_ROFL的完整形式是什么?
  5. vite新建vue3项目采坑,官网流程之路,vite+vue3+elementpuls
  6. bzoj3442学习小组
  7. docker pull理解误区
  8. Spring MVC浅入浅出——不吹牛逼不装逼
  9. 单台服务器最大支持多少连接数
  10. BZOJ 3509 分块FFT
  11. cmd运行javac解析中文乱码
  12. 双臂Matlab仿真建模:正运动学
  13. cameraLink
  14. 前端主流框架双向绑定实现原理简述
  15. 数据库实验第七周【集合查询数据更新】
  16. 论文笔记Doubly Stochastic Variational Inference for Deep Gaussian Processes深度高斯过程的双重随机变分推理
  17. 头条极速版问答自动化教程
  18. 单片机__LED点阵学习收获
  19. svn: Failed to add directory '../target': an unversioned directory of the same name already exis
  20. linux下启动fastDFS

热门文章

  1. Linux access函数讲解
  2. 苹果怎么关闭自动更新系统_如何关闭系统自动更新?
  3. 公钥密码学中的简单数学基础
  4. Java数组详解(超全)
  5. python设置画布的大小_Python tkinter框架画布调整大小
  6. 针对Echarts图表存在数据缓存问题的解决方法
  7. 有一家,使命愿景驱动的互联网公司
  8. 用endnote在word中添加注释
  9. git 提交代码 到 gitee 或 github仓库指定文件夹中
  10. 为什么程序员找不到女朋友?