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一下项目,然后报错内容变了如下:

Android Studio 实现一个新闻app项目源代码 android设计简易版新闻应用_android studio


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

gradlew processDebugManifest -stacktrace

Android Studio 实现一个新闻app项目源代码 android设计简易版新闻应用_上传_02


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

现在我们继续下一步。

第二步,注册蒲公英账号

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

Android Studio 实现一个新闻app项目源代码 android设计简易版新闻应用_java_03


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

Android Studio 实现一个新闻app项目源代码 android设计简易版新闻应用_上传_04


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

Android Studio 实现一个新闻app项目源代码 android设计简易版新闻应用_android_05

第三步,添加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-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 Studio 实现一个新闻app项目源代码 android设计简易版新闻应用_android_06


好了,到此本篇到此结束。