由于项目里接入了广告,包括但不限于穿山甲sdk和广点通sdk,视频广告是收益比较高的广告,项目里面出现的地方比较多。流程一般都是UI上有个按钮,点击按钮,请求到激励视频广告,然后直接打开该广告,也就是跳转到广告视频页面,等广告播放结束后,会有关闭按钮,点击关闭按钮,广告sdk会触发暴露出来的回调;如果请求广告失败,我们自己也会处理;这两种情况我们都是可以掌控的,也就是说这两种情况,我们都会有方法接收到事件,我们可以根据相应的事件,做出下一步的处理,比如给用户发奖励,或者重新请求广告。

打开广告激励视频的方法如下
穿山甲 :   nativeAd.showRewardVideoAd(activity);   // nativeAd 是 TTRewardVideoAd 类型
广点通 :   rewardVideoAD.showAD();  //  rewardVideoAD 是 RewardVideoAD 类型

上面方法都是 sdk 提供的方法,我们直接调用即可。但问题也来了,如果广告获取到了,同时也调用了该方法,如果广告页面没打开怎么办?上面两个方法都是 void 类型,如果说广告页面打开失败,但是没有回调事件,那么我们的UI界面由于没有接到下一步的指示,可能会一直固定在当前页面,甚至给人一种卡死的感觉,这种体验无意是很差的。

怎么办?sdk没提供方法,这就需要我们自己额外用些方法来检查了,加些防护。

这种场景比较好复现,比如说我们请求了广告,此时把app切到后台,比如说回到桌面,1秒后广告接口有广告返回,此时触发了 showRewardVideoAd(activity) 或 showAD() 方法,注意这时候app还在后台,不可见的状态,有些手机比如 oppp ,此时就不会跳转到广告页面,即使此时重新计入app,也不行。我们怎么处理呢?最简单的方式,用 Handler 延迟方法,我们在调用广告打开的方法的同时,用 Handler 延迟3秒执行段代码,检测app此时打开的Activity中,是否有当前打开的广告页面,比如 广点通的 Activity : PortraitADActivity,穿山甲的 Activity:TTRewardVideoActivity 或 TTRewardExpressVideoActivity。 老样子,
Application 的 registerActivityLifecycleCallbacks() 方法再次被用到,根据它的回调方法,来储存当前所有的 Activity, 方法如下

public class GlobalActivityLifecycle implements Application.ActivityLifecycleCallbacks {private static GlobalActivityLifecycle sInstance;public static void register(Application app) {if (sInstance == null) {synchronized (GlobalActivityLifecycle.class) {if (sInstance == null) {sInstance = new GlobalActivityLifecycle();app.registerActivityLifecycleCallbacks(sInstance);}}}}private static HashSet<String> mActivityNameSet = new HashSet<>();@Overridepublic void onActivityCreated(Activity activity, Bundle savedInstanceState) {mActivityNameSet.add(activity.getClass().getSimpleName());}@Overridepublic void onActivityStarted(Activity activity) {}@Overridepublic void onActivityResumed(Activity activity) {}@Overridepublic void onActivityPaused(Activity activity) {}@Overridepublic void onActivityStopped(Activity activity) {}@Overridepublic void onActivitySaveInstanceState(Activity activity, Bundle outState) {}@Overridepublic void onActivityDestroyed(Activity activity) {mActivityNameSet.remove(activity.getClass().getSimpleName());}public static boolean isContainActivity(String activitySimpleName){return mActivityNameSet.contains(activitySimpleName);}public static boolean isContainActivity(String ... names){for(String name : names){if(mActivityNameSet.contains(name)){return true;}}return false;}}

上面是工具类,下面是调用方法

    Handler mHandler = new Handler(Looper.getMainLooper());/*** 穿山甲*/public void showRewardVideoAd(Activity activity, TTRewardVideoAd nativeAd) {nativeAd.showRewardVideoAd(activity);mHandler.postDelayed(new Runnable() {@Overridepublic void run() {if(!GlobalActivityLifecycle.isContainActivity("TTRewardVideoActivity", "TTRewardExpressVideoActivity")){// TODO: 在 这个里面做一些告知UI的操作,意思是界面打开失败了}}}, 3000);}/*** 广点通*/public void tryShowRewardVideo(RewardVideoAD rewardVideoAD) {rewardVideoAD.showAD();mHandler.postDelayed(new Runnable() {@Overridepublic void run() {if(!GlobalActivityLifecycle.isContainActivity("PortraitADActivity")){// TODO: 在 这个里面做一些告知UI的操作,意思是界面打开失败了}}}, 3000);}

以上是思路,具体的大家可以通过扩展方法的形参,添加回调,或者使用观察者模式发送通知,总之符合自己项目的业务逻辑即可。上面的方法是通过集合来检查 Activity 的名字,可能有人会问,为什么不直接用 App里最 top 的Activity 来检测?假如说我们成功的打开了激励视频页面,这时候我们切入了后台,或者点击了视频广告,又打开了一个新的广告页面,这样最顶端的Activity就不是激励视频广告页面了,这样就误判了。

以上只是提供一个思路,希望起到抛砖引玉的作用。

穿山甲和广点通激励视频广告打开失败的异常处理相关推荐

  1. uniapp 小程序 加载显示激励视频广告

    uniapp激励广告文档:uni-app官网https://uniapp.dcloud.io/api/a-d/rewarded-video微信官网激励广告文档:激励视频广告 | 微信开放文档微信开发者 ...

  2. cocos creator 微信小游戏 封装banner、原生格子、插屏、激励视频广告

    创建WxPlatform.ts文件 封装bannger广告 class WxPlatform {//banner广告banner: BannerAd;showBanner() {if (cc.sys. ...

  3. cocos creator对接字节跳动(抖音)小游戏激励视频广告注意事项(审核不通过,次数不一致和重复获得奖励等)

    首先是官方文档里的对接方式:(https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/api/open-inter ...

  4. Android 接入穿山甲激励视频广告步骤与错误总结

    1.先去穿山甲官网,注册登录账号 2.侧边栏->广告变现->流量->应用->新建应用 3.侧边栏->广告变现->流量->代码位->新建代码位 4. 侧边 ...

  5. 穿山甲sdk激励视频广告关闭按钮引发的bug排查及解决

    项目中接入了穿山甲广告,其中包括图文广告和视频广告,后期发现一个偶现的问题,就是看完激励视频广告后,点击视频页面的关闭按钮,此时回到了app源生页面,UI卡住了,本来看完视频有个加分操作,现在没了.排 ...

  6. 小游戏内测激励视频广告,然而小程序最大的潜力是电商

    4月25日,微信发布公告,宣布"为支持小游戏开发者更好将游戏场景与广告融合,现面向部分小游戏开发者启动激励式视频广告组件测试."这是去年3月小游戏与耐克尝试合作"基座广告 ...

  7. 微信小程序接入广告(banner广告 激励视频广告 插屏广告)

    1.banner广告 <ad unit-id="{{ adUnitId }}"></ad> 2.视频广告 <ad unit-id="{{ a ...

  8. 《波利大冒险》如何用激励视频广告优化游戏体验?

    如今移动游戏爆款频出,可在智能手机尚未普及时,十年前的<QQ农场>也曾火遍全网,掀起了"全民偷菜"的现象级风潮:无独有偶,同期社交游戏公司Zynga以facebook作 ...

  9. cocos creator 接QQ小游戏小程序RewardedVideoAd 激励视频广告sdk

    cocos creator 接QQ小游戏小程序RewardedVideoAd 激励视频广告sdk 开发者工具 0.1.26 版本开始支持调试广告组件 话说你们看完为什么不留言点赞? 首先,你需要初始化 ...

最新文章

  1. Spring MVC框架有哪些优点
  2. **汇总CodeIgniter(CI)的数据库操作函数
  3. ANSYS报错Accelerations are exceeding internal limit解决方法
  4. html字体颜色代码表
  5. 【opencv4】opencv视频教程 C++ 6、图像混合、线性混合、混合权重相加addWeighted()、混合加add()、混合乘multiply()
  6. 神经网络中常用的激活函数
  7. Spring Data JPA教程:简介
  8. Java开发高性能网站需要关注的事
  9. math.asin_JavaScript中带有示例的Math.asin()方法
  10. ajax div iframe,【转】用AJAX模仿IFRAME 在指定DIV打开页面
  11. 当前时间时间戳以及10分钟后的时间戳
  12. C++控制CPU核的使用
  13. 如何用python写程序设置当前打印机为默认打印机,从Python打印到标准打印机?
  14. MySQL 经典练习 50 题(完美解答版)
  15. PB AcceptText()函数
  16. 《使用Python进行自然语言处理》学习笔记四
  17. 【论文翻译】Cluster Contrast for Unsupervised Person Re-Identification(2021)
  18. java生成二维码到文件,java生成二维码转成BASE64
  19. 深入理解Same-Origin安全机制
  20. 美国国家气候数据中心(NCDC)数据下载与处理

热门文章

  1. 全基因组关联分析(Genome-Wide Association Study,GWAS)流程
  2. 共享锁(Shared Lock)
  3. 函数声明与函数表达式的区别
  4. Maven构建 —— groupId、artifactId、version概念
  5. 循证医学,什么是询证医学?
  6. 检测Chrome headless的技巧
  7. 一个能看懂的Redis思维导图
  8. Python的魔法方法总结
  9. mutations vuex 调用_vuex 怎么在actions中调用mutations中的函数?
  10. 大数据组件测试maven依赖(持续更新)