Android简易新闻客户端自动升级 简易新闻(二十)
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简易新闻客户端自动升级 简易新闻(二十)相关推荐
- 喧喧 2.5 发布,新增客户端自动升级,优化界面交互性能
喧喧是由然之协同团队推出的一款轻量级的开源企业聊天软件.提供企业内部通讯交流.企业通讯录.协同办公通讯交流.企业IM解决方案. 喧喧官网: https://xuan.im/ 更新明细 新增 客户端自动 ...
- android自动更新列表,Android数据库表结构自动升级
Android App开发如果涉及过数据库的朋友们肯定会碰到数据库升级的工作,Android官方的建议办法是override public void onUpgrade(SQLiteDatabase ...
- 如何使用GeneralUpdte构建客户端自动升级功能
一.概要 本篇文章将向各位小伙伴介绍GeneralUpdate组件的使用,帮助第一次接触开发者快速上手应用在自己或企业项目中.如果本篇文章对您有帮助,希望帮忙点一下star.感谢各位开发者的支持. 帮 ...
- 【C#】C#客户端自动升级技术简析
升级程序为独立的exe程序,由客户端程序调用实现. 客户端调用部分 /* 客户端代码中,调用更新程序部分 */ static bool CheckUpdate() {try{//string tmpF ...
- 网易新闻客户端iOS版本中新闻详情页(UIWebView)技术实现的分析探讨
参考地址:http://blog.csdn.net/shaobo8910/article/details/51719673 本篇博客背景: 1:本人是网易新闻app的忠实用户,大约每天有2~3个小时的 ...
- android app无感知自动升级,Android中实现用户无感知处理后台崩溃
正所谓,要想没有bug,就一行代码也不写.App到了用户的手里,肯定是崩溃越少越好.Android中的崩溃处理和iOS不太一样,iOS崩溃通常是闪退,而安卓会出现如下的蹩脚的对话框 image.png ...
- flutter 获取android 还是ios_Flutter完整开发实战详解(二十、 Android PlatformView 和键盘问题)...
作为系列文章的第二十篇,本篇将结合官方的技术文档科普 Android 上 PlatformView 的实现逻辑,并且解释为什么在 Android 上 PlatformView 的键盘总是有问题. 为什 ...
- 初学Android,图形图像之使用Canvas,Paint绘图(二十五)
下面是一个画各种图形的例子,具体的画图方法不用特别解释,看API就可以了 先定义一个继承自View的类DrawView package WangLi.Graphics.MyView;import an ...
- Android详细教程(基础篇):二十八、Android 广播机制BroadcastReceiver
广播机制(BroadcastReceiver) 11.1. BroadcastReceiver简介 在实际应用中,我们常需要等,等待系统抑或其他应用发出一道指令,为自己的应用擦亮明灯指明方向.而这种等 ...
最新文章
- JSON 之父新作,JavaScript “葵花宝典”参悟 JS 之道
- OpenERP里面继承的用法
- [css] 请说说你对vh、vw的理解以及它们的运用场景是什么?
- rofl用什么播放_ROFL的完整形式是什么?
- vite新建vue3项目采坑,官网流程之路,vite+vue3+elementpuls
- bzoj3442学习小组
- docker pull理解误区
- Spring MVC浅入浅出——不吹牛逼不装逼
- 单台服务器最大支持多少连接数
- BZOJ 3509 分块FFT
- cmd运行javac解析中文乱码
- 双臂Matlab仿真建模:正运动学
- cameraLink
- 前端主流框架双向绑定实现原理简述
- 数据库实验第七周【集合查询数据更新】
- 论文笔记Doubly Stochastic Variational Inference for Deep Gaussian Processes深度高斯过程的双重随机变分推理
- 头条极速版问答自动化教程
- 单片机__LED点阵学习收获
- svn: Failed to add directory '../target': an unversioned directory of the same name already exis
- linux下启动fastDFS