根据上一章内容:https://blog.csdn.net/jiaxunnanling/article/details/90448454
有几个关键点
对SDK初始化抽象的一个单例TTAdManagerHolder
Reward Vedio广告初始化流程分五个步骤,详细内容可以参考说明文档
1.持有管理对象,初始化
TTAdManager ttAdManager = TTAdManagerHolder.get();
2.申请权限
TTAdManagerHolder.get().requestPermissionIfNecessary(this);
3.持有广告请求接口
mTTAdNative = ttAdManager.createAdNative(getApplicationContext());
4.对广告请求属性的配置,详细参数内容参考说明文档
AdSlot adSlot = new AdSlot.Builder() .setCodeId(codeId) .setSupportDeepLink(true) .setImageAcceptedSize(1080, 1920) .setRewardName("金币") //奖励的名称 .setRewardAmount(3) //奖励的数量 .setUserID("user123")//用户id,必传参数 .setMediaExtra("media_extra") //附加参数,可选 .setOrientation(orientation) //必填参数,期望视频的播放方向:TTAdConstant.HORIZONTAL 或 TTAdConstant.VERTICAL .build();
5.发送广告请求,并监听各种回调TTAdNative.RewardVideoAdListener
mTTAdNative.loadRewardVideoAd(adSlot, new TTAdNative.RewardVideoAdListener() {...});
通过TTRewardVideoAd对象的方法showRewardVideoAd显示视频内容,视频内容的缓存在请求高广告回调中能确定是否加载完成。
通过扩展Unity的MainActivity接入广告服务内容,关于扩展Unity的MainActivity,可以参考:https://blog.csdn.net/jiaxunnanling/article/details/90201312
新建Android工程,添加模块Advertisement
引入Unity内置的Jar包
根据广告说明文档,导入两个文件
根据说明文档,修改模块build.gradle内容如下
新建一个对象,编写初始化的内容,或者把之前提到过的 TTAdManagerHolder移植到模块中
package com.huowu.advertisement; import android.content.Context; import com.bytedance.sdk.openadsdk.TTAdConfig; import com.bytedance.sdk.openadsdk.TTAdConstant; import com.bytedance.sdk.openadsdk.TTAdManager; import com.bytedance.sdk.openadsdk.TTAdSdk; /** * 可以用一个单例来保存TTAdManager实例,在需要初始化sdk的时候调用 */ public class TTAdManagerHolder { private static boolean sInit; public static TTAdManager get() { if (!sInit) { throw new RuntimeException("TTAdSdk is not init, please check."); } return TTAdSdk.getAdManager(); } public static void init(Context context) { doInit(context); } //step1:接入网盟广告sdk的初始化操作,详情见接入文档和穿山甲平台说明 private static void doInit(Context context) { if (!sInit) { TTAdSdk.init(context, buildConfig(context)); sInit = true; } } private static TTAdConfig buildConfig(Context context) { return new TTAdConfig.Builder() .appId("5001121") .useTextureView(true) //使用TextureView控件播放视频,默认为SurfaceView,当有SurfaceView冲突的场景,可以使用TextureView .appName("APP测试媒体") .titleBarTheme(TTAdConstant.TITLE_BAR_THEME_DARK) .allowShowNotify(true) //是否允许sdk展示通知栏提示 .allowShowPageWhenScreenLock(true) //是否在锁屏场景支持展示广告落地页 .debug(true) //测试阶段打开,可以通过日志排查问题,上线时去除该调用 .directDownloadNetworkType(TTAdConstant.NETWORK_STATE_WIFI, TTAdConstant.NETWORK_STATE_3G) //允许直接下载的网络状态集合 .supportMultiProcess(false) .build(); } }
新建一个MainActivity对象,并继承于UnityPlayerActivity,内容如下
package com.huowu.advertisement; import android.content.Context; import android.os.Bundle; import android.widget.Toast; import com.bytedance.sdk.openadsdk.AdSlot; import com.bytedance.sdk.openadsdk.TTAdConstant; import com.bytedance.sdk.openadsdk.TTAdManager; import com.bytedance.sdk.openadsdk.TTAdNative; import com.bytedance.sdk.openadsdk.TTAppDownloadListener; import com.bytedance.sdk.openadsdk.TTRewardVideoAd; import com.unity3d.player.UnityPlayer; import com.unity3d.player.UnityPlayerActivity; import java.net.ContentHandler; public class MainActivity extends UnityPlayerActivity { //广告接口持有者 private TTAdNative mTTAdNative; //视频播放持有者 private TTRewardVideoAd mttRewardVideoAd; //是否加载完成 private boolean mHasShowDownloadActive = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //Unity启动活动的时候,初始化SDK TTAdManagerHolder.init(this); } //初始化广告配置 public void Init() { //step1:初始化sdk TTAdManager ttAdManager = TTAdManagerHolder.get(); //step2:(可选,强烈建议在合适的时机调用):申请部分权限,如read_phone_state,防止获取不了imei时候,下载类广告没有填充的问题。 TTAdManagerHolder.get().requestPermissionIfNecessary(this); //step3:创建TTAdNative对象,用于调用广告请求接口 mTTAdNative = ttAdManager.createAdNative(getApplicationContext()); } //加载横条广告 public void LoadHorizontalAD() { loadAd("901121430", TTAdConstant.HORIZONTAL); } //加载竖条广告 public void LoadVerticalAD() { loadAd("901121365", TTAdConstant.VERTICAL); } //加载完成,显示广告内容 public void ShowVedio() { //在Android的UI线程显示 runOnUiThread(new Runnable() { @Override public void run() { if (mttRewardVideoAd != null) { //step6:在获取到广告后展示 TToast(MainActivity.this,"加载成功显示"); mttRewardVideoAd.showRewardVideoAd(MainActivity.this); TToast(MainActivity.this,"显示调用完成"); mttRewardVideoAd = null; } else { TToast(MainActivity.this,"请先加载广告"); } } }); } //TToast显示信息 public void TToast(final Context context, final String msg) { //在Android的UI线程显示 runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(context,msg,Toast.LENGTH_SHORT).show(); } }); } //配置广告配置,请求广告。 private void loadAd(String codeId, int orientation) { //step4:创建广告请求参数AdSlot,具体参数含义参考文档 AdSlot adSlot = new AdSlot.Builder() .setCodeId(codeId) .setSupportDeepLink(true) .setImageAcceptedSize(1080, 1920) .setRewardName("金币") //奖励的名称 .setRewardAmount(3) //奖励的数量 .setUserID("user123")//用户id,必传参数 .setMediaExtra("media_extra") //附加参数,可选 .setOrientation(orientation) //必填参数,期望视频的播放方向:TTAdConstant.HORIZONTAL 或 TTAdConstant.VERTICAL .build(); //step5:请求广告 mTTAdNative.loadRewardVideoAd(adSlot, new TTAdNative.RewardVideoAdListener() { @Override public void onError(int code, String message) { TToast(MainActivity.this, message); } //视频广告加载后,视频资源缓存到本地的回调,在此回调后,播放本地视频,流畅不阻塞。 @Override public void onRewardVideoCached() { TToast(MainActivity.this, "rewardVideoAd video cached"); } //视频广告的素材加载完毕,比如视频url等,在此回调后,可以播放在线视频,网络不好可能出现加载缓冲,影响体验。 @Override public void onRewardVideoAdLoad(TTRewardVideoAd ad) { TToast(MainActivity.this, "rewardVideoAd loaded"); mttRewardVideoAd = ad; // mttRewardVideoAd.setShowDownLoadBar(false); mttRewardVideoAd.setRewardAdInteractionListener(new TTRewardVideoAd.RewardAdInteractionListener() { @Override public void onAdShow() { TToast(MainActivity.this, "rewardVideoAd show"); } @Override public void onAdVideoBarClick() { TToast(MainActivity.this, "rewardVideoAd bar click"); } @Override public void onAdClose() { TToast(MainActivity.this, "rewardVideoAd close"); } //视频播放完成回调 @Override public void onVideoComplete() { TToast(MainActivity.this, "rewardVideoAd complete"); } @Override public void onVideoError() { TToast(MainActivity.this, "rewardVideoAd error"); } //视频播放完成后,奖励验证回调,rewardVerify:是否有效,rewardAmount:奖励梳理,rewardName:奖励名称 @Override public void onRewardVerify(boolean rewardVerify, int rewardAmount, String rewardName) { TToast(MainActivity.this, "verify:" + rewardVerify + " amount:" + rewardAmount + " name:" + rewardName); } }); mttRewardVideoAd.setDownloadListener(new TTAppDownloadListener() { @Override public void onIdle() { mHasShowDownloadActive = false; } @Override public void onDownloadActive(long totalBytes, long currBytes, String fileName, String appName) { if (!mHasShowDownloadActive) { mHasShowDownloadActive = true; TToast(MainActivity.this, "下载中,点击下载区域暂停"); } } @Override public void onDownloadPaused(long totalBytes, long currBytes, String fileName, String appName) { TToast(MainActivity.this, "下载暂停,点击下载区域继续"); } @Override public void onDownloadFailed(long totalBytes, long currBytes, String fileName, String appName) { TToast(MainActivity.this, "下载失败,点击下载区域重新下载"); } @Override public void onDownloadFinished(long totalBytes, String fileName, String appName) { TToast(MainActivity.this, "下载完成,点击下载区域重新下载"); } @Override public void onInstalled(String fileName, String appName) { TToast(MainActivity.this, "安装完成,点击下载区域打开"); } }); } }); } }
供给Unity使用的方法,初始化广告Init,以及请求横屏广告LoadHorizontalAD(),竖屏广告LoadVerticalAD(),显示广告内容ShowVedio()。
修改AdroidManifest,如下
导出Arr包,供给Unity使用
使用7z压缩器,打开Arr包,把AndroidManifest复制一份出来,用于替换Unity默认的AndroidManifest。
把Arr包与AndroidManifest放入Unity工程的Plugins/Android目录下(不存在则创建目录)
由于导出的Arr包并没有把open_ad_sdk.aar包封装进去,所以open_ad_sdk.aar包也要放入Plugings/Android目录下
搭建UI界面
新建脚本TTAdHolder,并挂载到UI的Gameobject身上,内容如下
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class TTAdHolder : MonoBehaviour { ///
/// Android类型 /// private AndroidJavaClass androidJavaClass; ////// Android对象实例 /// private AndroidJavaObject currentActivity; ////// 初始化按钮 /// public Button initBtn; ////// 加载横条广告按钮 /// public Button horizontalBtn; ////// 加载竖屏广告按钮 /// public Button verticalBtn; ////// 显示广告内容视频按钮 /// public Button showVedioBtn; public void Awake() { #if UNITY_ANDROID //获取Unity的MainActivity的固定写法 androidJavaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); currentActivity = androidJavaClass.GetStatic("currentActivity"); #endif //注册事件 initBtn.onClick.AddListener(InitBtnClick); horizontalBtn.onClick.AddListener(HorizontalBtnClick); verticalBtn.onClick.AddListener(VerticalBtnClick); showVedioBtn.onClick.AddListener(ShowVedioBtnClick); } /// /// 初始化广告服务 /// public void InitBtnClick() { if (currentActivity != null) { currentActivity.Call("Init"); } } ////// 加载横条广告 /// public void HorizontalBtnClick() { if (currentActivity != null) { currentActivity.Call("LoadHorizontalAD"); } } ////// 加载竖屏广告 /// public void VerticalBtnClick() { if (currentActivity != null) { currentActivity.Call("LoadVerticalAD"); } } ////// 显示广告视频内容 /// public void ShowVedioBtnClick() { if (currentActivity != null) { currentActivity.Call("ShowVedio"); } } }
配置好脚本的按钮的引用,打包APK,在模拟器运行如下
点击初始化,加载横条广告
显示视频内容
接入Android的SDK,从Demo出发,再配合说明文档,了解SDK的执行流程。
从Demo中分析几个关键流程,初始化或者一些其他配置等。
从Demo中寻找有用的的工具,例如 TTAdManagerHolder。
AndroidStudio导出的Arr包不含有引入的Arr内容,例如 open_ad_sdk.aar需要导入到Unity中