文章目录
前言
项目接入广告已经是常见的现象了,但是还有很多朋友或者初学者没有接触过,或者没有接触过穿山甲,今天就来看一下,本人觉得穿山甲接入还是很简单的,先去官网注册新建项目,然后新建广告类型穿山甲官网。
一、效果图
还是老样子,先来张效果图稳定军心。
二、实现步骤
1.引入库
代码如下(示例):
kotlin
/******************** Project build.gradle ********************/
buildscript {
repositories {
maven {
url "https://artifact.bytedance.com/repository/pangle" //穿山甲融合SDK依赖
}
}
}
allprojects {
repositories {
maven {
url "https://artifact.bytedance.com/repository/pangle" //穿山甲融合SDK依赖
}
}
}
2.build.gradle依赖
代码如下(示例):
kotlin
//穿山甲融合SDK
implementation 'com.pangle.cn:mediation-sdk:7.0.1.2'
3.Application初始化
kotlin
//初始化聚合sdk
private fun initMediationAdSdk(context: Context) {
TTAdSdk.init(context, buildConfig(context))
TTAdSdk.start(object : TTAdSdk.Callback {
override fun success() {
//初始化成功
//在初始化成功回调之后进行广告加载
println("广告初始化成功")
}
override fun fail(code: Int, msg: String?) {
//初始化失败
println("广告初始化失败")
}
})
}
// 构造TTAdConfig
private fun buildConfig(context: Context): TTAdConfig {
return TTAdConfig.Builder()
.appId("") //APP ID
.appName("") //APP Name
.useMediation(true) //开启聚合功能
.debug(true) //关闭debug开关
.supportMultiProcess(true)
.themeStatus(0) //正常模式 0是正常模式;1是夜间模式;
/**
* 多进程增加注释说明:V>=5.1.6.0支持多进程,如需开启可在初始化时设置.supportMultiProcess(true) ,默认false;
* 注意:开启多进程开关时需要将ADN的多进程也开启,否则广告展示异常,影响收益。
* CSJ、gdt无需额外设置,KS、baidu、Sigmob、Mintegral需要在清单文件中配置各家ADN激励全屏xxxActivity属性android:multiprocess="true"
*/
.supportMultiProcess(true) //不支持
.customController(getTTCustomController()) //设置隐私权
.build()
}
//设置隐私合规
private fun getTTCustomController(): TTCustomController? {
return object : TTCustomController() {
override fun isCanUseLocation(): Boolean { //是否授权位置权限
return true
}
override fun isCanUsePhoneState(): Boolean { //是否授权手机信息权限
return true
}
override fun isCanUseWifiState(): Boolean { //是否授权wifi state权限
return true
}
override fun isCanUseWriteExternal(): Boolean { //是否授权写外部存储权限
return true
}
override fun isCanUseAndroidId(): Boolean { //是否授权Android Id权限
return true
}
override fun getMediationPrivacyConfig(): MediationPrivacyConfig? {
return object : MediationPrivacyConfig() {
override fun isLimitPersonalAds(): Boolean { //是否限制个性化广告
return false
}
override fun isProgrammaticRecommend(): Boolean { //是否开启程序化广告推荐
return true
}
}
}
}
}
3.开屏广告
kotlin
//调用
getScreenResolution()
//构造开屏广告的Adslot
fun buildSplashAdslot(width: Int, height: Int): AdSlot {
return AdSlot.Builder()
.setCodeId("") //广告位ID demo 102117864
.setImageAcceptedSize(width, height) //设置广告宽高 单位px
.setExpressViewAcceptedSize(width.toFloat(), height.toFloat())
.build()
}
//动态获取分辨率
fun getScreenResolution() {
val windowManager = getSystemService(WINDOW_SERVICE) as WindowManager
val display: Display = windowManager.defaultDisplay
val size: Point = Point()
display.getRealSize(size)
val width: Int = size.x
val height: Int = size.y
println("h获取宽高:${width} h:$height")
loadSplashAd(this@startActivity, width, height)
}
// 加载开屏广告
fun loadSplashAd(act: Activity, width: Int, height: Int) {
val adNativeLoader = TTAdSdk.getAdManager().createAdNative(act)
adNativeLoader.loadSplashAd(
buildSplashAdslot(width, height),
object : TTAdNative.CSJSplashAdListener {
override fun onSplashLoadSuccess(p0: CSJSplashAd?) {
//广告加载成功
println("广告加载成功--->")
}
override fun onSplashLoadFail(error: CSJAdError?) {
//广告加载失败
println("广告加载失败--->${error!!.msg}")
startActivity(Intent(this@startActivity, HomeActivity::class.java))
finish()
}
override fun onSplashRenderSuccess(csjSplashAd: CSJSplashAd?) {
println("广告渲染成功--->")
//广告渲染成功,在此展示广告
showSplashAd(csjSplashAd, framelayout); //注 :splashContainer为展示Banner广告的容器
}
override fun onSplashRenderFail(p0: CSJSplashAd?, p1: CSJAdError?) {
//广告渲染失败
println("广告渲染失败--->")
startActivity(Intent(this@startActivity, HomeActivity::class.java))
finish()
}
},
3000
)
}
//展示开屏广告
fun showSplashAd(ad: CSJSplashAd?, container: ViewGroup?) {
ad?.let {
it.setSplashAdListener(object : CSJSplashAd.SplashAdListener {
override fun onSplashAdShow(csjSplashAd: CSJSplashAd?) {
//广告展示
//获取展示广告相关信息,需要再show回调之后进行获取
var manager = it.mediationManager;
if (manager != null && manager.showEcpm != null) {
val ecpm = manager.showEcpm.ecpm //展示广告的价格
val sdkName = manager.showEcpm.sdkName //展示广告的adn名称
val slotId = manager.showEcpm.slotId //展示广告的代码位ID
}
println("广告开始了---->$manager")
}
override fun onSplashAdClick(csjSplashAd: CSJSplashAd?) {
//广告点击
}
override fun onSplashAdClose(csjSplashAd: CSJSplashAd?, closeType: Int) {
//广告关闭
println("广告关闭了---->")
if (closeType == CSJSplashCloseType.CLICK_SKIP) {//开屏广告点击跳过
startActivity(Intent(this@startActivity, HomeActivity::class.java))
finish()
//@[classname]
} else if (closeType == CSJSplashCloseType.COUNT_DOWN_OVER) {//开屏广告点击倒计时结束
startActivity(Intent(this@startActivity, HomeActivity::class.java))
finish()
//@[classname]
} else if (closeType == CSJSplashCloseType.CLICK_JUMP) {//广告点击
}
}
})
if (container != null) {
it.showSplashView(container) //展示开屏广告
}
}
}
4.插屏广告
kotlin
//调用
loadInterstitialFullAd(this)
//构造插全屏广告的Adlsot
fun buildInterstitialFullAdslot(): AdSlot {
return AdSlot.Builder()
.setCodeId("") //广告位ID
.setOrientation(TTAdConstant.VERTICAL) //设置方向
.setMediationAdSlot(
MediationAdSlot.Builder()
.setMuted(false)
.build()
)
.build()
}
//加载插全屏广告
fun loadInterstitialFullAd(act: Activity) {
val adNativeLoader = TTAdSdk.getAdManager().createAdNative(act)
adNativeLoader.loadFullScreenVideoAd(
buildInterstitialFullAdslot(), object : TTAdNative.FullScreenVideoAdListener {
override fun onError(code: Int, message: String?) {
//广告加载失败
println("广告插屏加载失败---->")
DialogUtils.hideLoadingDialog()
}
override fun onFullScreenVideoAdLoad(ad: TTFullScreenVideoAd?) {
//广告加载成功
println("广告插屏加载成功---->")
}
override fun onFullScreenVideoCached() {
//广告缓存成功,此回调已经废弃,请使用onFullScreenVideoCached(ad: TTFullScreenVideoAd?)
println("广告插屏缓存成功---->")
}
override fun onFullScreenVideoCached(ad: TTFullScreenVideoAd?) {
//广告缓存成功,在此回调中展示广告
showInterstitialFullAd(act, ad)
println("广告插屏缓存成功了---->")
}
})
}
//展示插全屏广告
fun showInterstitialFullAd(act: Activity, ad: TTFullScreenVideoAd?) {
ad?.let {
if (it.mediationManager.isReady) {
it.setFullScreenVideoAdInteractionListener(object :
TTFullScreenVideoAd.FullScreenVideoAdInteractionListener {
override fun onAdShow() {
DialogUtils.hideLoadingDialog()
//广告展示
var manager = it.mediationManager
//获取展示广告相关信息,需要再show回调之后进行获取
if (manager != null && manager.showEcpm != null) {
val ecpm = manager.showEcpm.ecpm //展示广告的价格
val sdkName = manager.showEcpm.sdkName //展示广告的adn名称
val slotId = manager.showEcpm.slotId //展示广告的代码位ID
}
}
override fun onAdVideoBarClick() {
//广告点击
println("广告插屏点击---->")
}
override fun onAdClose() {
//广告关闭
println("广告插屏关闭---->")
setDate("1")//2
// // 拦截关闭事件,显示确认对话框
// showCloseConfirmationDialog(act) { confirmed ->
// if (confirmed) {
// // 用户确认关闭,正常处理
// println("广告插屏关闭---->")
// } else {
// // 用户取消,重新展示广告(需SDK支持)
// it.showFullScreenVideoAd(act)
// }
// }
}
override fun onVideoComplete() {
//广告播放完成
println("广告插屏播放完毕---->")
setDate("1")
}
override fun onSkippedVideo() {
//广告跳过
println("广告插屏点击跳过---->")
setDate("1")//2
// // 拦截跳过事件,显示确认对话框
// showSkipConfirmationDialog(act) { confirmed ->
// if (confirmed) {
// println("广告插屏点击跳过---->")
// } else {
// // 继续播放广告
// }
// }
}
})
it.showFullScreenVideoAd(act) //展示插全屏广告
} else {
//TTFullScreenVideoAd is not ready
}
}
}
5.懒人做法
如果觉得看博客类的童鞋,直接用官方的可视化接入工具,但得自己慢慢去摸索,比如开屏页的适配工具是没有的。
总结
到此呢猜想各位童鞋已经学会了穿山甲广告的接入了,上述只贴了开屏和插屏广告,其他广告接法一样,但是,最重要的但是来了,每个广告类型的接法都不一样,这个要切记哦。