这里先附上谷歌AdMob API官方说明文档的地址,如果有不明白或者想详细了解的可以点击进入 查看学习:https://developers.google.com/admob/android/rewarded-video

顺便附上广告请求错误码对应原因查看的网址: https://developers.google.com/android/reference/com/google/android/gms/ads/AdRequest
话不多说,在项目里面需要用到的加载谷歌广告的地方比较多,重复代码多次写没有必要,所以封装了一个工具类,直接调用方法就行,你在使用时可以更加细节封装优化一下~
LoadGoogleAd.kt代码:

import android.app.Activity
import android.util.Log
import android.widget.Toast
import com.google.android.gms.ads.AdListener
import com.google.android.gms.ads.AdRequest
import com.google.android.gms.ads.InterstitialAd
import com.google.android.gms.ads.MobileAds
import com.google.android.gms.ads.reward.RewardItem
import com.google.android.gms.ads.reward.RewardedVideoAd
import com.google.android.gms.ads.reward.RewardedVideoAdListener
import com.wj.R/*** @time 2018/6/11* @author JunJieW* @since 1376881525@qq.com* @description  谷歌广告加载封装工具类*/
class LoadGoogleAd  {private val TAG = "LoadGoogleAd"private var activity: Activity? = nullinternal var mInterstitialAd: InterstitialAd? = nulllateinit var mRewardedVideoAd: RewardedVideoAdconstructor(activity: Activity, adType: String) {this.activity = activity//google ad 初始化MobileAds.initialize(activity,activity.resources.getString(R.string.google_app_id))if (adType == "inster") {// 插屏admInterstitialAd = InterstitialAd(activity)initInterstitialAdListener()mInterstitialAd!!.adUnitId = activity.resources.getString(R.string.google_ad_interstitial_unit_id)mInterstitialAd!!.loadAd( AdRequest.Builder().build())Log.d(TAG, "The InterstitialAd")} else if (adType == "video") {// 视频admRewardedVideoAd = MobileAds.getRewardedVideoAdInstance(activity)initVideoAdListener()mRewardedVideoAd.loadAd(activity.resources.getString(R.string.google_ad_video_unit_id), AdRequest.Builder().build())Log.d(TAG, "The VideoAd")}}private fun initVideoAdListener() {mRewardedVideoAd.rewardedVideoAdListener = object :RewardedVideoAdListener{override fun onRewarded(reward: RewardItem) {Toast.makeText(activity, "onRewarded! currency: ${reward.type} amount: ${reward.amount}",Toast.LENGTH_SHORT).show()// Reward the user.做奖励用户的操作}override fun onRewardedVideoAdLeftApplication() {Log.d(TAG, "onRewardedVideoAdLeftApplication")}override fun onRewardedVideoAdClosed() {Log.d(TAG, "onRewardedVideoAdClosed")mRewardedVideoAd.loadAd(activity!!.resources.getString(R.string.google_ad_video_unit_id), AdRequest.Builder().build())}override fun onRewardedVideoAdFailedToLoad(errorCode: Int) {Log.d(TAG, "onRewardedVideoAdFailedToLoad")}override fun onRewardedVideoAdLoaded() {Log.d(TAG, "onRewardedVideoAdLoaded")}override fun onRewardedVideoAdOpened() {Log.d(TAG, "onRewardedVideoAdOpened")}override fun onRewardedVideoStarted() {Log.d(TAG, "onRewardedVideoStarted")}override fun onRewardedVideoCompleted() {Log.d(TAG, "onRewardedVideoCompleted")}}}private fun initInterstitialAdListener() {//记录插屏广告展示的次数,每间隔三次才进行展示var showInterstitialAdNum = SharedPreferencesUnitls.getParam2(activity,"showInterstitialAdNum")if (StringUtils.StringIsNull(showInterstitialAdNum)){}else{SharedPreferencesUnitls.setParam(activity,"showInterstitialAdNum","1")}mInterstitialAd!!.adListener = object: AdListener() {override fun onAdLoaded() {Log.d(TAG, "The interstitial onAdLoaded")}override fun onAdFailedToLoad(errorCode: Int) {Log.d(TAG, "The interstitial onAdFailedToLoad;errorCode==$errorCode")}override fun onAdOpened() {Log.d(TAG, "The interstitial onAdOpened")}override fun onAdLeftApplication() {Log.d(TAG, "The interstitial onAdLeftApplication")}override fun onAdClosed() {Log.d(TAG, "The interstitial onAdClosed")mInterstitialAd!!.loadAd(AdRequest.Builder().build())}}}//Show the ad  插屏广告fun showInterstitialAd() {//记录插屏广告展示的次数,每间隔三次才进行展示var showInterstitialAdNum = SharedPreferencesUnitls.getParam2(activity,"showInterstitialAdNum")if (StringUtils.StringIsNull(showInterstitialAdNum)){if (showInterstitialAdNum.toInt()%4==0){if (mInterstitialAd!!.isLoaded){mInterstitialAd!!.show()}}SharedPreferencesUnitls.setParam(activity,"showInterstitialAdNum",(showInterstitialAdNum.toInt()+1).toString())}else{SharedPreferencesUnitls.setParam(activity,"showInterstitialAdNum","1")}}//Show the ad  video广告fun showRewardedVideoAd(){//记录插屏广告展示的次数,每间隔三次才进行展示var showInterstitialAdNum = SharedPreferencesUnitls.getParam2(activity,"showVideoAdNum")if (StringUtils.StringIsNull(showInterstitialAdNum)){if (showInterstitialAdNum.toInt()%4==0){if (mRewardedVideoAd.isLoaded) {mRewardedVideoAd.show()}}SharedPreferencesUnitls.setParam(activity,"showVideoAdNum",(showInterstitialAdNum.toInt()+1).toString())}else{SharedPreferencesUnitls.setParam(activity,"showVideoAdNum","1")}}}

调用关键代码:

//第一步 声明工具类变量
private LoadGoogleAd googleAdUti_intes = null;
private LoadGoogleAd googleAdUti_video = null;//第二步 在onCreate方法中初始化,传递广告类型的标识googleAdUti_intes = new LoadGoogleAd(getActivity(), "inster");googleAdUti_video = new LoadGoogleAd(getActivity(), "video");//第三步 在你想展示广告的地方调用展示广告的方法//加载打开文章的google插屏广告googleAdUti_intes.showInterstitialAd();//加载的google视频广告googleAdUti_video.showRewardedVideoAd();

至此加载谷歌广告就已经不是问题了!
插屏广告加载效果图:

视频广告加载效果图:

最后值得一提的是,谷歌广告官方建议为了客户体验好,加载广告的时候不用太长时间,避免用户不愉快体验,应该在需要调用展示广告的activity或者fragment中,提前将广告请求建立,只不过不show出来,然后当你需要展示的时候只需要判断当前广告对象是否是加载完成状态,如果是则show出来,这样速度很快,我做时就被这里坑过,当用户点击列表的一个item时才初始化一个广告请求,然后加载一个插屏广告,竟然耗时能超过3秒多有时候,体验巨差,自己都不能忍,后来优化为现在的activity或者fragment创建时就初始化广告请求只是不show出来,当需要展示的时候直接show方法调用就行,还要记得在广告关闭的时候重新发起下一个广告请求的创建,只是不show展示出来就行~

过了一段时间,再做别的项目的时候又遇到了一些新的问题,也挺坑的,在这里补充一下作为爬坑记录,以防长时间不用了再遇到忘记。
异常1:W/Ads: Failed to load ad: errorcode == 3
完整的异常日志输出:

09-12 11:02:43.932 7914-7914/com.mobile I/Ads: Starting ad request.
09-12 11:02:43.932 7914-7914/com.mobile I/Ads: This request is sent from a test device.
09-12 11:02:44.067 7914-8007/com.mobile W/Ads: Invoke Firebase method getInstance error.
09-12 11:02:44.067 7914-8007/com.mobile W/Ads: The Google Mobile Ads SDK will not integrate with Firebase. Admob/Firebase integration requires the latest Firebase SDK jar, but Firebase SDK is either missing or out of date
09-12 11:02:45.596 7914-8016/com.mobile I/Ads: No fill from ad server.
09-12 11:02:49.336 7914-7914/com.mobile W/Ads: Failed to load ad: 3

造成原因:这个错误的描述是:ERROR_CODE_NO_FILL,广告没有填充。而造成的原因可能是:
1.正式版的没有发布,在app没有上线之前,都是测试的广告位id,没有正式的广告位id,所以可以直接使用官方给的测试广告位id,这里附上官方链接:https://developers.google.com/admob/android/test-ads
解决方案:使用官方给的测试广告位id,这里附上各种广告类型的官方给的测试id的截图,可以各自对号入座找自己适合的,我这里是Rewarded Video的

// 修改前
mRewardedVideoAd!!.loadAd(resources.getString(R.string.google_ad_video_unit_id), AdRequest.Builder()
// 修改后 把这里的正式id换位官方给的测试广告位idmRewardedVideoAd!!.loadAd("ca-app-pub-3940256099942544/5224354917", AdRequest.Builder().build())

2.你不是测试设备
解决方案:添加自己的测试设备号,需要从log日志里面寻找,如下图

代码贴出来:

        mRewardedVideoAd!!.loadAd("ca-app-pub-3940256099942544/5224354917", AdRequest.Builder().addTestDevice("176998C7DFA2CC4F0FDC2C42DD42ACF8")  // An example device ID  ,this code you should get from your log info and replace it ,after soon you can run and for a test。.build())

哈哈,注释写成英文了,不过相信你一定能看懂我这傻瓜式的英文注释,哈哈

AdMob Android谷歌广告接入(精简版)相关推荐

  1. 酷安应用市场php源码,酷安应用市场 v11.0.3-999 去广告极限精简版

    酷安,真实有趣的数码社区.酷安app,国内安卓应用市场客户端,应用资源丰富,应用开发者水准高,应用无首发Logo,原汁原味上架,得到了安卓用户群广泛认可.有人说现在的酷安市场(酷安网)没有以前那么纯粹 ...

  2. android banner广告接入,仅涉及技术

    google 广告接入,admob 官网地址: http://developer.android.com/intl/zh-cn/google/play-services/setup.html 配置: ...

  3. Android 穿山甲广告接入教程

    穿山甲广告接入教程 相信大家都有碰到过在应用内加广告的需求,大部分的做法都是在开屏页加广告吸引用户点击跳转.目前市面上的广告sdk有很多,今天我们就来介绍一下穿上甲广告的简单集成接入 sdk资源集成地 ...

  4. 子弹短信 android,子弹短信精简版

    游戏简介 子弹短信app精简版是一款拒绝低效率社交沟通交流的手机应用,语音与文字完美结合高效聊天效率,无需进入聊天页面即可快速回复消息极速交互,赶快下载子弹短信app精简版体验高速列车般的高效聊天效率 ...

  5. 迅雷(SVIP不限速)去广告绿色精简版for mac/win

    迅雷11于2020年8月推出,是继迅雷X之后的换代版PC迅雷客户端.迅雷11重新设计了主界面框架,将下载与云盘合二为一,在迅雷云盘里,可以流畅的观看视频 ,从云盘取回文件的速度,号称将前所未有的快!迅 ...

  6. Android 应用广告接入- 穿山甲

    广告平台接入无非是:于己赚点钱养活自己:于他人增加广告软件曝光 1. 展示广告方式 支持Banner,信息流广告 开屏.插屏广告 Banner轮播,视频广告 激励视频广告 2. 接入SDK步骤 1. ...

  7. Android 穿山甲广告接入注意事项

    1.广告位ID独立配置,与AppId无关,与初始化流程无关 2.开屏广告尺寸: 默认: adSlot = new AdSlot.Builder().setCodeId(mCodeId).setSupp ...

  8. android系统精简,高通支持Android 8.1精简版,专为512MB或1GB内存设计

    往的搭载骁龙处理器的老旧手机终于有救啦!高通宣布将支持Android Go系统,也就是Android 8.1的精简版,专门为512MB或1GB内存的手机设计的,未来老手机也可以流畅运行. 对于谷歌而言 ...

  9. 深度迅雷5.8.3.556无广告绿色超级精简版【迅雷6核心文件】-绿软下载

    深度迅雷5.8.3.556无广告绿色超级精简版[迅雷6核心文件] 软件介绍: 迅雷(Thunder) V5.8.3.556 无广告绿色精简奥运版 本程序由迅雷官方版本5.8.3.556精简制作,其中部 ...

最新文章

  1. 多媒体容器格式概述①
  2. oracle 常用语句
  3. 分子生物学之蛋白质概述
  4. php网站发布工具_7款本地搭建PHP环境工具推荐
  5. php数据库缓存服务器配置,php缓存技术(减少数据库服务器压力)
  6. 学.net还是php,ASP.NET和php哪个更容易学
  7. promise.all_所有您需要了解的Promise.all
  8. 《Power Designer系统分析与建模实战》——2.1 需求模型简介
  9. markdown备忘
  10. redis运维常用的server端命令
  11. 楼天成 中国大学生编程第一人
  12. 【Proteus仿真】BME280温湿度气压传感器数据串口输出
  13. 拼图游戏 java_Java拼图游戏源码
  14. 团队管理经典书籍推荐:《团队管理必读12篇》
  15. 2200p如何连接wifi打印_柯尼卡美能达2200P打印机使用介绍
  16. intel32/ctor.dll mysql_ctor.dll,下载,简介,描述,修复,等相关问题一站搞定_DLL之家
  17. 关于在Idea里面修改html代码后,打开网页没改变的问题
  18. 2022年——CSDN有一个充满活力的【红目香薰】
  19. Linux下调整屏幕分辨率
  20. window系统杀死进程方法

热门文章

  1. Linux(Ubuntu16)下gedit自动补齐代码功能
  2. nw362 linux 驱动下载,支持OpenGL 3.2 NVIDIA全新Linux驱动官方发布
  3. 红雪iOS6.1.3不完美越狱教程
  4. java memory copy_Java Unsafe.copyMemory java.lang.IllegalArgumentException
  5. 点击欺诈或将“点死”搜索引擎广告业
  6. 住在宝马对面的苦逼程序员
  7. 10kv电缆为什么要做耐压试验? 有什么意义吗?
  8. Windows Server 2016-Active Directory域服务端口汇总
  9. python投票程序
  10. Orchestrator部署