没想到简易新闻系列博客已经写到了第二十系列,距离写的第一篇《使用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就是我们要用的:
添加权限如下:
<!-- 必选-->
<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-data
android: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() {
@Override
public void onNoUpdateAvailable() {
}
@Override
public 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() {
@Override
public 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 返回的权限数据
*/
@Override
public 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 16
targetSdkVersion 28
//默认是1 和1.0 我们改成2 和 2.0之后sync一下并且打包然后上传
versionCode 2
versionName "2.0"
multiDexEnabled true
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true
}
上传之后我们再把这个versionCode改成1 versionName改成1.0然后运行就会有更新的提示啦,如下:
好了,到此本篇到此结束,关于简易新闻前传请传送至android新闻客户端的实现或者android新闻app。有问题欢迎评论,关于源码的事情我已经放到了这两个博客的评论或者文章末尾了。