第015天:将APP发布到应用商店(完结)

  • Post author:
  • Post category:其他





应用已经开发出来了,下一步我们需要思考推广方面的工作。那么如何才能让更多的用户知 道并使用我们的应用程序呢?在手机领域,最常见的做法就是将程序发布到某个应用商店中,这 样用户就可以通过商店找到我们的应用程序,然后轻松地进行下载和安装。


说到应用商店,在Android


领域真的可以称得上是百家争鸣,除了谷歌官方推出的


GooglePlay


之外,在中国还有像


360


、豌豆荚、百度、应用宝等知名的应用商店。当然,这些商店所提供的功能都是比较类似的,发布应用的方法也大同小异,因此这里我们就只学习如何将应用发布到


360


应用商店,其他应用商店的发布方法相信你完全可以自己摸索出来。








15.1



生成正式签名的


APK


文件


之前我们一直都是通过Android Studio


来将程序安装到手机上的,而它背后实际的工作流程是,


Android Studio


会将程序代码打包成一个


APK


文件,然后将这个文件传输到手机上,最后再执行安装操作。


Android


系统会将所有的


APK


文件识别为应用程序的安装包,类似于


Windows


系统上的


EXE


文件。


但并不是所有的APK


文件都能成功安装到手机上,


Android


系统要求只有签名后的


APK


文件才可以安装,因此我们还需要对生成的


APK


文件进行签名才行。那么你可能会有疑问了,直接通过


Android Studio


来运行程序的时候好像并没有进行过签名操作啊,为什么还能将程序安装到手机上呢?这是因为


Android Studio


使用了一个默认的


keystore


文件帮我们自动进行了签名。点击


Android Studio


右侧工具栏的


Gradle~~





项目名





>:app—>Tasks—>android


,


双击


signingReport


,


结果如图


15.1


所示。


也就是说,我们所有通过Android Studio来运行的程序都是使用了这个debug.keystore


文件来进行签名的。不过这仅仅适用于开发阶段而已,现在酷欧天气已经快要发布了,要使用一个正式的


keystore


文件来进行签名才行。下面我们就来学习一下,如何生成一个带有正式签名的


APK


文件。








15.1.1



使用


Android Studio


生成


先学习一下如何使用Android Studio


来生成正式签名的


APK


文件。点击


Android Studio


导航栏上的


Build^Generate Signed APK,


首次点击可能会提示让我们输入操作系统的密码,如图


15.2


所示。


输入密码之后点击0K,则会弹出如图15.3所示的创建签名


APK


对话框。


由于目前我们还没有一个正式的keystore文件,所以应该点击Create new按钮,然后会弹出一个新的对话框来让我们填写创建


keystore


文件所必要的信息。根据自己的实际情况进行填写就行了,如图


15.4


所示。


这里需要注意,在Validity那一栏填写的是key store


文件的有效时长,单位是年,一般建议 时间可以填得长一些,比如我填了


30


年。然后点击


0K,


这时我们刚才填写的信息会自动填充到 创建签名


APK


对话框当中,如图


15.5


所示。


如果你希望以后都不用再输keystore


的密码了,可以将


Remember passwords


选项勾上。然后 点击


Next,


这时就要选择


APK


文件的输出地址了,如图


15.6


所示。


这里默认是将APK文件生成到项目的根目录下,我就不做修改了。现在点击Finish,然后 稍等一段时间,


APK


文件就都会生成好了,并且会在右上角弹出一个如图


15.7


所示的提示。


我们点击提示上的Show in Explorer


可以立刻查看生成的


APK


文件,如图


15.8


所示。


这里的app-release.apk


就是带有正式签名的


APK


文件了。








15.1.2



使用


Gradle


生成


上一小节中我们使用了 Android Studio


提供的可视化工具来生成带有正式签名的


APK


文件, 除此之外,


Android Studio


其实还提供了另外一种方式  用


Gradle


生成,下面我们就来学习 一下。


Gradle是一个非常先进的项目构建工具,在


Android Studio


中开发的所有项目都是使用它来 构建的。在之前的项目中,我们也体验过了


Gradle


带来的很多便利之处,比如说当需要添加依 赖库的时候不需要自己再去手动下载了,而是直接在


dependencies


闭包中添加一句引用声明就可 以了。


不过这里我要提醒你一句,如果你想将Gradle


完全精通的话,这个难度就比较大了。


Gradle


的用法极为丰富,想要完全掌握它的用法,其复杂程度并不亚于学习一门新的语言(


Gradle


是使 用


Groovy


语言编写的)。而


Android


中主要只是使用


Gradle


来构建项目而已,因此这里我们掌握 一些它的基本用法就好了,重点还是要放在功能开发上面,不要本末倒置了。当然,如果你对


Gradle


非常感兴趣,也可以到网上去查询它的更多用法。


下面我们开始学习如何使用Gradle


来生成带有正式签名的


APK


文件。编辑


app/build.gradle


文件,在


android


闭包中添加如下内容.


这里在android


闭包中添加了一个


signingConfigs


闭包,然后在


signingConfigs


闭 包中又添加了一个


config


闭包。接着在


config


闭包中配置


keystore


文件的各种信息,


storeFile


用 于指定


keystore


文件的位置,


storePassword


用于指定密码,


keyAlias


用于指定别名,


keyPassword


用于指定别名密码。


将签名信息都配置好了之后,接下来只需要在生成正式版APK


的时候去应用这个配置就可 以了。继续编辑


app/build,gradle


文件,如下所示:

android {

    buildTypes { release { minifyEnabled false proguardFiles         
    getDefaultProguardFile(1proguard-android.txt'), 'proguard-rules.pro'

    signingConfig signingConfigs・ config
    }
]
}


这里我们在buildTypes


下面的


release


闭包中应用了刚才添加的签名配置,这样当生成正式版


APK


文件的时候就会自动使用我们刚才配置的签名信息来进行签名了。


现在build.gradle


文件已经配置完成,那么我们如何才能生成


APK


文件呢?其实非常简单,


Android Studio


中内置了很多的


Gradle Tasks,


其中就包括了生成


APK


文件的


Task





点击右侧工 具栏的


Gradle~>


项目名





>:app—>Tasks-^build


,


如图


15.9


所示。


其中assembleDebug


用于生成测试版的


APK


文件,


assembleRelease


用于生成正式版的


APK


文件,


assemble


用于同时生成测试版和正式版的


APK


文件。在生成


APK


之前,先要双击


clean


这个


Task


来清理一下当前项目,然后双击


assembleRelease,


结果如图


15.10


所示。


可以看到,这里提示我们BUILD SUCCESSFUL,


说明


assembleRelease


执行成功了。


APK


文件会自动生成在


app/build/outputs/apk


目录下,如图


15.11


所示。


其中,app-release.apk


就是带有正式签名的


APK


文件了。另外还有一个


app-release-unaligned. apk,


这是一个没有经过对齐的正式版


APK


文件,我们直接忽略它就可以了。


虽说现在APK


文件已经成功生成了,不过还有一个小细节需要注意一下。目前


keystore


文 件的所有信息都是以明文的形式直接配置在


build.gradle


中的,这样就不太安全。


Android


推荐的 做法是将这类敏感数据配置在一个独立的文件里面,然后再在


build.gradle


中去读取这些数据。


下面我们来按照这种方式实现。Android Studio


项目的根目录下有一个


gradle.properties




文件,




它是专门用来配置全局键值对数据的,我们在


gradle.properties


文件中添加如下内容:

KEY_PATH=C:/Users/Administrator/Documents/guoHn. jks

KEY[PASS=1234567

ALIAS_NAME=guolindev ALIAS_PASS=1234567


可以看到,这里将keystore


文件的各种信息以键值对的形式进行了配置,然后我们在


build.gradle


中去读取这些数据就可以了。编辑


app/build.gradle


文件,如下所示:


android {


signingConfigs (


config {


storeFile file(KEY__PATH)


storePassword KEY_PASS


keyAlias




ALIAS_NAME



keyPassword




ALIAS_PASS



} _


}


}




这里只需要将原来的明文配置改成相应的键值,一切就完工了。这样直接查看build.gradle


文件是无法看到


keystore


文件的各种信息的,只有查看


gradle.properties


文件才能看得到。然后我 们只需要将gradle.properties文件保护好就行了,比如说将它从


Git


版本控制中排除。这样 gradle.properties文件就只会保留在本地,从而也就不用担心keystore文件的信息会泄漏了。








15.1.3



生成多渠道


APK


文件


现在你已经掌握了两种生成带有正式签名的APK


文件的方式,从简易程度上来讲,两种方 式差不多,基本都还是比较简单的,选择使用哪一种全凭你自己的喜好。


现在APK


文件已经生成好了,可能在大多数情况下,我们都只需要一个


APK


文件就足够了, 不过本小节中我们再来讨论一种比较特殊的情况——生成多渠道


APK


文件。


在本章的开头就已经提到过,目前Android


领域的应用商店非常多,不像苹果只有一个


App Store


0


当然我们完全可以使用同一个


APK


文件来上架不同的应用商店,但是如果你有一些特殊 需求的话,比如说针对不同的应用商店渠道来定制不同的界面,这就比较头疼了。


传统情况下,开发这种差异性需求非常痛苦,通常需要维护多份代码版本,然后逐个打成相 应渠道的APK


文件。一旦有任何功能变更就苦不堪言,因为每份代码版本里面都需要逐个修改 一遍。


幸运的是,现在Android Studi


。提供了一种非常方便的方法来应对这种差异性需求,极大程 度地解决了之前版本维护困难的问题,下面我们就来学习一下。


比如说这里我们准备生成360


和百度两个渠道的


APK


文件,那么修改


app/build.gradle


文件, 如下所示:

android (
compileSdkVersion buildToolsVersion defaultConfig { applicationld minSdkVersion
24
"24.0.2"
"com.coolweather.android
15
targetSdkVersion 24 versionCode 1 versionName "1.0" } productFlavors { qihoo { applicationld "com.coolweather.android.qihoo" } baidu {
applicationld "com・coolweather.android.baidu" }
}


可以看到,这里添加了一个productFlavors


闭包,然后在该闭包中添加所有的渠道配置就 可以了。注意


Gradle


中的配置规定不能以数字开头,因此这里我将


360


的渠道名配置成了


qihoo





渠道名的闭包中可以覆写


defaultConfig


中的任何一个属性,比如说这里将


applicationld


属性 进行了覆写,那么最终生成的各渠道


APK


文件的包名也将各不相同。


接下来我们开始针对不同渠道编写差异性需求。在app/src


目录下





main


的平级目录)新建 一个


baidu


目录,然后在


baidu


目录下再新建


java





res


这两个目录,如图


15.12


所示。


这样我们就可以在这里编写百度渠道特有的功能了,java目录用于存放代码,


res


目录用于 存放资源,如果需要覆写


AndroidManifest


文件中的内容,还可以在


baidu


目录下再新建一个


AndroidManifest.xml


文件。


当然,实际上我们并没有什么渠道差异性的需求,因此这里也只是为了演示一下,我们就给 不同渠道的APK


起一个不同的应用名吧。


应用名之前是定义在main/res/values/string.xml


文件中的,那么我们在


baidu


目录下也建立一 个相同的目录结构,然后将


baidu/res/values/string.xml


中的内容进行如下修改:


<resources>


<string name=”app_name”>


酷欧百度版


v/string>


</resources>


这样百度渠道的APK


就会使用


baidu/res/values/string.xml


中定义的应用名来覆盖原有的应用 名。同样的道理,我们再新建一个


qihoo


目录,然后在


qihoo


目录下也建立相同的目录结构,并 将


string.xml


中的内容进行如下修改:


<resources>


<string name=”app_name”>


酷欧


360





v/string> </resources>


这样我们就以一个简单的示例实现渠道差异性需求了,下面开始来生成多渠道的APK


文件。观 察右侧工具栏的


Gradle Tasks


列表,你会发现里面多出了几个新的


Task,


如图


15.13


所示。


其中,如果你只想生成百度渠道的APK文件,那么就执行assembleBaidu





如果你只想生成


360


渠道的


APK


文件,那么就执行


assembleQihoo





如果你想一次性生成所有渠道的


APK


文件, 那么就还是执行


assembleRelease


o


除了使用Gradle


的方式生成之外,使用


Android Studio


提供的可视化工具也是能生成多渠道


APK


文件的,如图


15.14


所示。


这里我们可以选择是生成百度渠道的APK文件,还是生成360


渠道的


APK


文件,如果你想 一次性生成多个渠道的


APK


文件,按住


CTRL


键就可以进行多选了。


接下来我们可以通过


adb install


命令将生成好的


APK


文件安装到模拟器上,如图


15.15


所示。


adb install命令的后面加上APK文件的路径,就可以将该


APK


文件安装到模拟器上了。 我们使用同样的方法将百度和


360


这两个渠道的


APK


文件都安装到模拟器上,结果如图


15.16


所示。


可以看到,目前模拟器上有3


个版本的酷欧天气,这是由于之前我们在


productFlavors


中覆 写了各渠道的


applicationld


属性,保证每个


APK


文件的包名都不相同,因而它们才能安装到 同一个设备上面。另外,从应用名上来看,渠道差异性开发工作也顺利完成了。


不过,上面的例子只是为了演示生成多渠道APK


功能而特意编写的,实际上我们并没有 这个需求。现在将


productFlavors


闭包删除,恢复成之前的


APK


文件,我们准备进行上架 操作。








15.2



申请


360


开发者账号


目前,酷欧天气的APK


安装包已经准备好了,但如果想要把它发布到


360


应用商店,还需 要去申请一个


360


开发者账号才行,申请地址是:


http://dev.360.cno


打开该网页,在页面顶部有登录和注册按钮。如果你还没有360


账号,则需要在这里注册一 个新的账号,如果你之前已经有


360


账号了,那么直接登录就可以了。


登录成功之后打开


http://dev.360.cn/mod/developer这个网址,来申请成为开发者,如图15.17

这个网址,来申请成为开发者,如图15.17

http://dev.360.cn/mod/developer这个网址,来申请成为开发者,如图15.17


所示。


这里可以选择是申请成为个人开发者还是企业开发者。很显然,我们是以个人的身份来发布 应用的,那么点击个人开发者就可以了。


接下来需要填写一些基本信息和联系方式,如图15.18


所示。


填写完基本信息之后向下滚动继续填写联系方式,全部填写完成之后,点击屏幕最下方的“同


意并注册开发者”按钮来完成注册,如图


15.19


所示。


这样你就成功成为一名360


开发者了!








15.3



发布应用程序


接下来我们开始发布酷欧天气这个应用,还是在浏览器访问地址:http://dev.360.cn,


你会在 界面上看到如图


15.20


所示的内容。


然后点击软件发布,就会显示如图


15.21


所示的界面。


我们需要选择是发布软件类应用还是电子书类应用,这里点击软件。接下来会弹岀一个新的 界面让我们上传APK以及填写应用信息。首先来上传APK吧,点击上传按钮,选择带有正式签 名的


APK


文件,然后就会自动开始上传了,上传完成之后会显示如图


15.22


所示的界面。


这个界面提醒我们,目前应用的安全系数较低,建议对APK


进行加固。实际上这个是


360


应用商店的特殊需求,并不是所有应用商店都要求进行加固的。但是我们还是得按照它的要求来 修改,不然审核可能会不通过。


这里点击立即加固按钮,360


会帮忙我们将原


APK


文件进行加固,并生成一个新的


APK


文 件,如图


15.23


所示。


不过这个加固后的APK


文件是没有经过签名的,也就是说我们还需要将它下载下来,然后 手动进行签名才行。


点击下载应用按钮,先将加固后的APK


文件下载下来。接下来的工作就有点烦琐了,因为


Android Studio


中并没有提供对一个未签名的


APK


直接进行签名的功能,因此我们只能通过最原 始的方式,使用


jarsigne


「命令来进行签名。


在命令行界面按照以下格式输入签名命令:


jarsigner -verbose -sigalg SHAlwithRSA -digestalg SHA1 -keystore [keystore


文件路径]


-storepass [keystore


文件密码][待签名


APK


路径]


[keystore


文件别名]


将[]


中的描述替换成


keystore


文件的具体信息就能签名成功了,注意


[]


符号是不需要的。接 着我们将签名后的


APK


文件重新上传就可以了。


APK±传成功之后,接下来需要选择应用的分类,如图


15.24


所示。


这里我们将应用分类选择成实用工具-


天气。下面还有一个上传版权证明的选项,这是一个 选填项,我们直接忽略就可以了。


接着向下滚动网页,设置支持的语言以及资费类型,如图15.25


所示。


继续滚动网页,下面需要填写应用简介以及当前版本介绍,如图15.26


所示。


在版本介绍的下面,360


还要求填写一项隐私权限说明,由于酷欧天气只申请了一个网络权 限,因此没什么需要说明的,我们直接忽略这一项就可以了。


继续向下滚动网页,接下来需要上传一张高分辨率的应用图标,图标要求是512×512


像素 的


PNG


格式图片,如图


15.27


所示。


上传好了图标,我们还需要提供5


张酷欧天气的屏幕截图,点击上传截图按钮,然后选择准 备好的图片即可,如图


15.28


所示。


继续向下滚动,还有一个审核辅助说明的选填项,我们也直接忽略就可以了。最后就是一些 额外的定制选项,如图15.29


所示。


这里我们选择不进行云测试,并在审核后立即发布。


激动人心的时刻终于到了,现在点击一下提交审核按钮就可以将酷欧天气发布到360


应用商 店了,这时会显示如图


15.30


所示的提示。


由于360


会对我们的应用程序进行审核,接下来又进入了等待当中。不过还好,根据


提木来


看,这次也许不需要等太久。


果不其然,过了几个小时之后在360


手机助手上搜索酷欧天气关键字,就可以看到这个应用 已经成功上线了,如图


15.31


所示。


点击进去可以查看应用的详情,如图15.32


所示。


到了这里,我们就将应用程序的发布工作全部完成了,之后你应该尽可能地多为你的应用进 行宣传,因为用户越多,你能得到的回报就越大。那么如何才能从我们辛辛苦苦编写的程序中得 到回报呢?方式有很多种,其中较为常见的做法就是通过广告来进行盈利,因此下一节我们就学 习一下,如何在应用程序中嵌入广告。








15.4



嵌入广告进行盈利


谷歌充分考虑到了可以在Android


应用程序中嵌入广告来让开发者获得收入,因此早早地就 收购了


AdMob


公司。


AdMob


创立于


2006


年,是全球最早致力于在移动设备上提供广告服务的 公司之一,如今成为了谷歌的子公司,


AdMob


的广告更加适合在


Android


系统以及


Google Play


上面进行投放。


不过对于国内开发者来说,AdMob


可能就不是那么适合了。因为


AdMob


平台上的广告大多 都是英文的,中文广告数有限,并且将


AdMob


账户中的钱提取到银行账户中也比较麻烦,因此 这里我们就不准备使用


AdMob T,


而是将眼光放在一些国内的移动广告平台上面。在国内的这 一领域,做得比较好的移动广告平台也不少,其中我个人认为腾讯广告联盟(原广点通)特别专 业,因此我们就选择它来为酷欧天气提供广告服务吧。








15.4.1



注册腾讯广告联盟账号


下面开始动手,首先第一步我们需要注册一个腾讯广告联盟的账号,注册地址为

http://​ :http://e.qq. com/dev/index.html ​

打开该网页,选择使用QQ


号登录,然后就会自动跳转到腾讯广告联盟的注册界面,如图


1


5.33


所示。图


15.33


中的所有内容都是必填项,我们按照实际情况来填写就可以了,填写完成之后点 击下一步,如图15.34所示。




15.4.2



新建媒体和广告位


审核通过之后,我们就可以进入到腾讯广告联盟的后台,开始给酷欧天气添加广告了。首先 需要进入媒体管理界面,点击新建媒体按钮,这时会显示一个页面来让你填写应用的相关信息, 我们根据提示一一填好即可,如图15.37


所示。


注意这里需要填写一个详情页地址,也就是酷欧天气在360


应用商店上的详情页地址。打开


http://zhushou.360.cn


,


在搜索框上输入


“酷


欧天气”,就能找到该地址了。


填写完成之后点击下一步,接下来需要下载SDK,


如图


15.38


所示。


点击Android SDKT


载按钮,先把


SDK


下载下来,我们稍后就会进行接入。继续点击下一 步,如图


15.39


所示。


这里要求填入一个APK


的下载的地址,我们直接就填入图


15.37


当中的详情页地址就可以



了。点击完成按钮,现在又会进入到审核等待当中。


为什么新建媒体也需要进行审核呢?这是因为腾讯为了防止某些开发者在垃圾软件上面投 放广告,因此要求开发者必须提交应用程序的APK


文件进行审核,只有审核通过的应用才允许 进行广告投放。那么我们只能继续等待。审核通过之后,在媒体管理界面查看新建媒体的状态, 如图


15.40


所示。


可以看到,联盟开通状态显示已开通,业务状态显示正常,说明新建的媒体已经通过审核了。 注意这里还自动生成了一个应用ID,


我们稍后就会用到。


现在点击新建广告位,就可以来创建一个广告位了,如图15.41


所示。


首先要输入广告位的名称,然后选择广告位的类型。腾讯广告联盟支持Banner.应用墙、插 屏和开屏这4种广告类型,具体每种广告类型的区别你可以通过查阅文档进行了解,这里我们选 择开屏广告。接下来还可以对一些敏感行业的广告进行屏蔽,选择完成之后点击创建按钮完成广 告位创建。


就能查看到我们刚刚新建的广告位了,如图15.42


所示。


其中,4010212448179536


是广告位


ID,


1105585573


是应用


ID





有了这两个数据之后,我们


就可以开始接入广告


SDK


To








15.4.3



接入广告


SDK


首先将刚才下载的广告SDK


压缩包解压,里面的内容非常简单,如图


15.43


所示。


其中resources


文件夹中放的是一些资源图片,我们使用不到。


GDTDEVguide.4.9.html


是广 告


SDK


的对接文档,


GDTUnionDemo.zip


是广告


SDK


的对接示例,


GDTUnionSDK49.533.min.jar


则是广告


SDK


中最主要的一个


Jai


•包文件了。


由于腾讯广告SDK


中的功能还是挺多的,这里不可能面面俱到,将每一个功能都进行详细 地讲解。因此我准备只讲解开屏广告这一种类型的广告用法,剩下的其他功能你可以通过阅读文 档来进行学习。


我们先将 GDTUnionSDK49.533.min.jar


复制到


app/libs


目录当中,并点击一下


Android Studio


顶部工具栏中的


Sync


按钮完成同步。


接着在AndroidManifest.xml


中声明以下权限,其中网络访问权限是之前声明过的,不需要声 明两遍。


注意,其中 READ PHONE STATE. ACCESS COARSE LOCATION





WRITE_EXTERNAL_STORAGE





3


个权限是危险权限,因此我们待会还需要进行运行时权限处理。


接下来在<application>


标签中添加如下内容:


<activity


android:


name=”com.qq.e.ads.ADActivity”


android


:


configChanges=


H


keyboard|keyboardHidden|orientation|screenSize” /> <service


android:name=”com.qq.e.comm.DownloadService”


android:exported=”false” />


这样就将配置工作完成了。


然后我们还需要创建一个用于显示开屏广告的活动,右击com.coolweather.android >New


Activity—>Empty Activity,


创建一个


SplashActivity


,


并将布局名指定成


activity splash.xml


o


修 改


activity splash.xml


中的代码,如下所示:


<RelativeLayout


xmlns


:


android=”


http://schemas.android.com/apk/res/android




android


:


id=


,,


(


a+id/container”


android:layout_width=”match_pa rent”


android


:


layout_height=”match_parent”>


</RelativeLayout>


这里只有一个空的RelativeLayout,


我们并不需要在


RelativeLayout


当中放入什么内容,但是 必须给它定义一个


id




接着修改


SplashActivity


中的代码,如下所示:


public class SplashActivity extends AppCompatActivity {


private RelativeLayout container;


/**


*


用于判断是否可以跳过广告,进入


MainActivity


*/


private boolean canJump;


^Override


protected void onCreate(Bundle savedlnstanceState) { super.onCreate(savedlnstanceState); setContentView(R.layout.activitysplash); container = (RelativeLayout) findViewByld(R.id.container);


//


进行运行时权限处理


List<String> permissionList = new ArrayList<>();


if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_ STATE) != PackageManager.PERMISSIONGRANTED) {



~


permissionList.add(Manifest.permission.READPHONESTATE);


}





~


if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_ COARSE LOCATION) != PackageManager.PERMISSION GRANTED) {



~


permissionList.add(Manifest.permission.ACCESSCOARSELOCATION);


}





~


if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_ EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {





permissionList.add(Manifest.permission.WRITEEXTERNALSTORAGE);


} ~ ~


if (!permissionList.isEmpty()) {


String [] permissions = permissionList.toArray(new String[permissionList. size()]);


ActivityCompat.requestPeemissions(this, permissions, 1);


} else {


requestAds();


}


}


/**


*


请求开屏广告


*/


private void requestAds() {


String appld =


n


1105585573″;







566






15


章 最后一步——将应用发布到


360


应用商店


String adld


= “4010212448179536”




new SplashADfthis, container, appld, adld, new SplashADListenerf) { ^Override public void onADDismissedf) (


//


广告显示完毕


forward();


}


(QOverride


public void onNoAD(int i) {


//


广告加载失败


forward();


}


(QOverride


public void onADPresent() {


//


广告加载成功


}


^Override


public void onADClicked() {


//广告被点击


}


})




}


@0verride


protected void onPause() {


super,onPause(); canjump = false;


}


(QOverride


protected void onResume() { super.onResume(); if (canJump) { forward();


}


canJump = true;


}


private void forward() {


if (canJump) {


//


跳转到


MainActivity


Intent intent = new Intent(this, MainActivity.class); startActivity(intent);


finish();


} else (


canJump = true;


}


}


(QOverride


public void onRequestPermissionsResult(int requestcode, String!] permissions, int[] grantResults) (


switch


(


requestcode) { case


1:


if (grantResults.length > 0) { for (int result


:


grantResults) { if (result != PackageManager.PERMISSION_GRANTED) { Toast ,makeText(this,


”必须同意所有权限


钎能


使用本程序”,


Toast.LENGTHSHORT).show();


finish(); return;


} } requestAds();


} else {


Toast. makeText( this,


”发生


未知错误”,


Toast. LENGTH_SHORT). show(); finishO;


} break;


default


:


}


}


}


可以看到,在onCreate(


)


方法中,我们先是获取到了


RelativeLayout


的实例,紧接着就开 始进行运行时权限处理。由于这里也是需要在运行时一次性申请多个权限,因此采用了和


11.3.2


小节同样的写法,相信你一定不会陌生吧。


当用户同意了所有的权限申请之后,就会调用requestAdsO


方法来请求广告数据。在


requestAdsO


方法中我们先是定义了


appld





adld


这两个变量,它们的值就是在腾讯广告联 盟后台生成的应用


ID


和广告位


ID,


然后创建


SplashAD


的实例来获取广告数据。


SplashAD


的构 造函数接收


5


个参数,第


1


个参数是当前活动的实例,第


2


个参数是


RelativeLayout


的实例,第


3


个参数是应用


ID,





4


个参数是广告位


ID,


相信前


4


个参数都没什么需要解释的。第


5


个参数 是一个


SplashADListener


的实例,用于监听广告数据的回调。其中


onADDismissed(


)


方法会在 广告显示完毕时回调,


onNoADO


方法会在广告加载失败时回调,


onADPresent()


方法会在广告 加载成功时回调,


onADClicked()


方法会在广告被点击时回调。当广告显示完毕或者广告加载失 败时,我们调用


forwardO


方法跳转到


MainActivity,


并将当前活动关闭即可。


另外注意这里还使用了一个canjump


变量用于对活动跳转进行控制。这是因为如果用户点 击了广告,会启动一个新的活动来展示广告的详细内容,这个时候即使回调了


onADDismissed()


方法,显然也不应该启动


MainActivity,


因此我们在


onPause(


)


方法中将


canJump


设置成了


false





然后在


forward(


)


方法中发现


canJump





false,


因此不会进行跳转,但是会将


canJump


设置成


true


o


最后,当用户看完了广告回到


SplashActivity


时,


onResume(


)


方法将会执行,这个时候发 现


canJump





true


,


因此就会调用


forward


()


方法来启动


MainActivity


o


整体流程大概就是这个样子了,接下来我们还需要将主活动设置成SplashActivity


而不再是


MainActivity,


否则广告界面将无法得到展示。修改


AndroidManifest.xml


中的代码,如下所示:


<manifest xmlns


:


android=”


http://schemas.android.com/apk/res/android


” package=”com.coolweather.android”>


<application


android:name=”org.litepal.LitePalApplication”


android:aflowBackup=”true”


android


:


icon=


,,


(


amipmap/logo”


android:label=”@string/app name”


android


:


supportsRfl=”true”


android :theme=”


(


astyle/AppTheme


,,


>


<activity android:name=”.MainActivity”>


</activity>


<activity android


:


name=”.SplashActivity”>




<intent-filter>





<action android






:






name=






u






android.intent.action.MAIN” /> <category android






:






name=”android.intent.category.LAUNCHER” /> </intent-filter>



</activity>


</application>


</manifest>


这样我们就将广告SDK


全部对接完成了,现在可以重新运行一下程序来看一看效果。不过 需要注意,广告在模拟器上是不会显示的,我们要用真正的手机测试才行。程序启动后首先会弹 岀运行时权限的申请对话框,全部都点击允许之后就能看到广告数据了,如图


15.44


所示。


开屏广告会持续5


秒钟时间,然后就会自动跳转到


MainActivity中,后面的流程就和之前是 完仝一样的了。








15.4.4



重新发布应用程序


现在我们已经成功在酷欧天气中接入了广告功能,那么是时候将这个新版本更新到360


应用 商店上了。


由于即将发布的会是新一版的酷欧天气,因此在生成安装包之前还需要修改一下应用程序的 版本号信息。编辑app/build.gradle


文件,如下所示:


android {


compileSdkVersion buildToolsVersion defaultConfig { applicationld minSdkVersion


targetSdkVersion 24




versionCode 2 versionName “1.1”



可以看到,这里将versionCode


改成了


2, versionName


改成了


l.l


o


需要注意的是,每个版 本的


versionCode





versionName


都不能和其他版本相同,且新版应用的版本号必须大于老版应 用的版本号。


接下来我们就可以使用在15.1


节学习的技术来生成新的


APK


文件,具体的步骤就不再重复 介绍了,最终会生成一个新的


app-release.apk


文件,下面我们将它重新发布到


360


应用商店。


打开360


开发者后台的管理中心页面,然后点击酷欧天气的更新管理按钮,如图


15.45


所示。


点击编辑与更新按钮,就能上传新的APK文件了。注意上传之后仍然会提醒应用的安全系 数较低,我们只需要使用和之前同样的方式进行加固就可以了。


另外,由于新版的酷欧天气中增加了一些敏感隐私权限,因此我们还需要在这一项上面做出 说明,如图15.46


所示。


现在只需要点击页面最下方的提交审核按钮,新版本的酷欧天气就发布成功了,当然还需要 通过360


的审核才行。以后每当有用户观看或点击了应用程序中的广告时,我们就能真正地得到 收益。在腾讯广告联盟的后台管理界面可以查看到每天的收益情况,如图


15.47


所示。


你的应用越成功,所获得的广告收益也会越多,因此赶快去编写更多优秀的应用程序来赚更 多的钱吧,相信通过整本书的学习,你已经有足够的能力做到了!








15.5



结束语


就这样,本书所有的内容你都学完了,现在你已经成功毕业,并且成为了一名合格的Android


开发者。但是如果想要成为一名出色的


Android


开发者,光靠本书中的这些理论知识以及少量的实 践还是不够的,你需要真正步入到工作岗位当中,通过更多的项目实战来不断地历练和提升自己。



版权声明:本文为m0_67474913原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。