激励视频广告

This commit is contained in:
renhaoting 2025-12-18 13:36:59 +08:00
parent 867c075794
commit c981ffe950
4 changed files with 85 additions and 17 deletions

View File

@ -4,7 +4,6 @@ import android.app.Activity
import android.content.Intent import android.content.Intent
import android.os.CountDownTimer import android.os.CountDownTimer
import android.view.LayoutInflater import android.view.LayoutInflater
import androidx.activity.addCallback
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
@ -17,7 +16,6 @@ import com.gamedog.vididin.VididinEvents
import com.gamedog.vididin.beans.WatchAdNotifyBean import com.gamedog.vididin.beans.WatchAdNotifyBean
import com.gamedog.vididin.main.interfaces.OnTabStyleListener import com.gamedog.vididin.main.interfaces.OnTabStyleListener
import com.gamedog.vididin.manager.WithdrawItemBean import com.gamedog.vididin.manager.WithdrawItemBean
import com.remax.bill.ads.AdResult
import com.remax.bill.ads.ext.AdShowExt import com.remax.bill.ads.ext.AdShowExt
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -51,11 +49,13 @@ class WatchAdActivity : AppViewsEmptyViewModelActivity<ViewBinding>(), OnTabStyl
} }
override fun ViewBinding.initListeners() { override fun ViewBinding.initListeners() {
onBackPressedDispatcher.addCallback(this@WatchAdActivity) { /*onBackPressedDispatcher.addCallback(this@WatchAdActivity) {
AndroidUtil.showToast("Can't exit while watching video") AndroidUtil.showToast("Can't exit while watching video")
} }*/
stateCounter() stateCounter()
showVideoAd()
} }
@ -120,7 +120,7 @@ class WatchAdActivity : AppViewsEmptyViewModelActivity<ViewBinding>(), OnTabStyl
} }
private fun stateCounter() { private fun stateCounter() {
mCountDownTimer = object : CountDownTimer(3000, 1000) { mCountDownTimer = object : CountDownTimer(50* 1000, 1000) {
override fun onTick(millisUntilFinished: Long) { override fun onTick(millisUntilFinished: Long) {
val secondsRemaining = millisUntilFinished / 1000 val secondsRemaining = millisUntilFinished / 1000
binding.tvAdCounter.text = "${secondsRemaining}" binding.tvAdCounter.text = "${secondsRemaining}"
@ -156,16 +156,22 @@ class WatchAdActivity : AppViewsEmptyViewModelActivity<ViewBinding>(), OnTabStyl
} }
private fun showVideoAd(callback: () -> Unit) { private fun showVideoAd() {
lifecycleScope.launch { lifecycleScope.launch {
try { try {
AdShowExt.showRewardedVideoAd(this@WatchAdActivity, null)
} catch (e: Exception) {
e.printStackTrace()
}
/*try {
when (val result = AdShowExt.showInterstitialAd(this@WatchAdActivity)) { when (val result = AdShowExt.showInterstitialAd(this@WatchAdActivity)) {
is AdResult.Success -> { is AdResult.Success -> {
callback.invoke() //callback.invoke()
} }
is AdResult.Failure -> { is AdResult.Failure -> {
callback.invoke() //callback.invoke()
} }
AdResult.Loading -> { AdResult.Loading -> {
@ -173,12 +179,13 @@ class WatchAdActivity : AppViewsEmptyViewModelActivity<ViewBinding>(), OnTabStyl
} }
} catch (e: Exception) { } catch (e: Exception) {
callback.invoke() //callback.invoke()
} }*/
} }
} }
companion object { companion object {
private val KEY_TASK_TYPE = "KEY_TASK_TYPE" private val KEY_TASK_TYPE = "KEY_TASK_TYPE"
private val KEY_TASK_DATA = "KEY_TASK_DATA" private val KEY_TASK_DATA = "KEY_TASK_DATA"

View File

@ -17,6 +17,13 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<FrameLayout
android:id="@+id/ad_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
/>
<androidx.appcompat.widget.AppCompatTextView <androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_ad_counter" android:id="@+id/tv_ad_counter"
android:layout_width="wrap_content" android:layout_width="wrap_content"

View File

@ -1,7 +1,7 @@
package com.remax.bill.ads.bidding package com.remax.bill.ads.bidding
import android.app.Activity import android.app.Activity
import com.blankj.utilcode.util.ToastUtils import android.content.Context
import com.remax.base.report.DataReportManager import com.remax.base.report.DataReportManager
import com.remax.bill.BuildConfig import com.remax.bill.BuildConfig
import com.remax.bill.ads.RewardedAdController import com.remax.bill.ads.RewardedAdController
@ -12,7 +12,6 @@ import com.remax.bill.ads.util.AdmobReflectionUtil
import kotlinx.coroutines.async import kotlinx.coroutines.async
import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.coroutineScope
import java.util.Locale import java.util.Locale
import kotlin.text.toDouble
/** /**
* 激励广告竞价控制器 * 激励广告竞价控制器
@ -20,7 +19,7 @@ import kotlin.text.toDouble
object RewardedBiddingManager { object RewardedBiddingManager {
suspend fun bidding( suspend fun bidding(
activity: Activity, context: Context,
admobAdUnitId: String = BuildConfig.ADMOB_REWARDED_ID, admobAdUnitId: String = BuildConfig.ADMOB_REWARDED_ID,
pangleAdUnitId: String = BuildConfig.PANGLE_REWARDED_ID, pangleAdUnitId: String = BuildConfig.PANGLE_REWARDED_ID,
toponPlacementId: String = BuildConfig.TOPON_REWARDED_ID, toponPlacementId: String = BuildConfig.TOPON_REWARDED_ID,
@ -35,22 +34,22 @@ object RewardedBiddingManager {
AdSourceController.AdSource.TOPON -> BiddingWinner.TOPON AdSourceController.AdSource.TOPON -> BiddingWinner.TOPON
AdSourceController.AdSource.BIDDING -> { AdSourceController.AdSource.BIDDING -> {
// 不会执行到这里,但为了完整性保留 // 不会执行到这里,但为了完整性保留
performBidding(activity, admobAdUnitId, pangleAdUnitId, toponPlacementId) performBidding(context, admobAdUnitId, pangleAdUnitId, toponPlacementId)
} }
} }
} }
// 使用竞价逻辑 // 使用竞价逻辑
return performBidding(activity, admobAdUnitId, pangleAdUnitId, toponPlacementId) return performBidding(context, admobAdUnitId, pangleAdUnitId, toponPlacementId)
} }
private suspend fun performBidding( private suspend fun performBidding(
activity: Activity, context: Context,
admobAdUnitId: String, admobAdUnitId: String,
pangleAdUnitId: String, pangleAdUnitId: String,
toponPlacementId: String, toponPlacementId: String,
): BiddingWinner { ): BiddingWinner {
val context = activity.applicationContext val context = context.applicationContext
val admobController = RewardedAdController.getInstance() val admobController = RewardedAdController.getInstance()
val pangleController = PangleRewardedAdController.getInstance() val pangleController = PangleRewardedAdController.getInstance()
val toponController = TopOnRewardedAdController.getInstance() val toponController = TopOnRewardedAdController.getInstance()

View File

@ -4,6 +4,7 @@ import android.app.Activity
import android.content.Context import android.content.Context
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import com.google.android.gms.ads.rewarded.RewardItem
import com.remax.bill.BuildConfig import com.remax.bill.BuildConfig
import com.remax.bill.ads.AdResult import com.remax.bill.ads.AdResult
import com.remax.bill.ads.AppOpenAdController import com.remax.bill.ads.AppOpenAdController
@ -11,23 +12,27 @@ import com.remax.bill.ads.BannerAdController
import com.remax.bill.ads.FullScreenNativeAdController import com.remax.bill.ads.FullScreenNativeAdController
import com.remax.bill.ads.InterstitialAdController import com.remax.bill.ads.InterstitialAdController
import com.remax.bill.ads.NativeAdController import com.remax.bill.ads.NativeAdController
import com.remax.bill.ads.RewardedAdController
import com.remax.bill.ads.bidding.AppOpenBiddingManager import com.remax.bill.ads.bidding.AppOpenBiddingManager
import com.remax.bill.ads.bidding.BannerBiddingManager import com.remax.bill.ads.bidding.BannerBiddingManager
import com.remax.bill.ads.bidding.BiddingWinner import com.remax.bill.ads.bidding.BiddingWinner
import com.remax.bill.ads.bidding.FullScreenNativeBiddingManager import com.remax.bill.ads.bidding.FullScreenNativeBiddingManager
import com.remax.bill.ads.bidding.InterstitialBiddingManager import com.remax.bill.ads.bidding.InterstitialBiddingManager
import com.remax.bill.ads.bidding.NativeBiddingManager import com.remax.bill.ads.bidding.NativeBiddingManager
import com.remax.bill.ads.bidding.RewardedBiddingManager
import com.remax.bill.ads.log.AdLogger import com.remax.bill.ads.log.AdLogger
import com.remax.bill.ads.pangle.PangleAppOpenAdController import com.remax.bill.ads.pangle.PangleAppOpenAdController
import com.remax.bill.ads.pangle.PangleBannerAdController import com.remax.bill.ads.pangle.PangleBannerAdController
import com.remax.bill.ads.pangle.PangleFullScreenNativeAdController import com.remax.bill.ads.pangle.PangleFullScreenNativeAdController
import com.remax.bill.ads.pangle.PangleInterstitialAdController import com.remax.bill.ads.pangle.PangleInterstitialAdController
import com.remax.bill.ads.pangle.PangleNativeAdController import com.remax.bill.ads.pangle.PangleNativeAdController
import com.remax.bill.ads.pangle.PangleRewardedAdController
import com.remax.bill.ads.topon.TopOnBannerAdController import com.remax.bill.ads.topon.TopOnBannerAdController
import com.remax.bill.ads.topon.TopOnFullScreenNativeAdController import com.remax.bill.ads.topon.TopOnFullScreenNativeAdController
import com.remax.bill.ads.topon.TopOnInterstitialAdController import com.remax.bill.ads.topon.TopOnInterstitialAdController
import com.remax.bill.ads.topon.TopOnSplashAdController import com.remax.bill.ads.topon.TopOnSplashAdController
import com.remax.bill.ads.topon.TopOnNativeAdController import com.remax.bill.ads.topon.TopOnNativeAdController
import com.remax.bill.ads.topon.TopOnRewardedAdController
import com.remax.bill.ui.FullScreenNativeAdActivity import com.remax.bill.ui.FullScreenNativeAdActivity
import com.remax.bill.ui.NativeAdStyle import com.remax.bill.ui.NativeAdStyle
import com.remax.bill.ui.pangle.PangleFullScreenNativeAdActivity import com.remax.bill.ui.pangle.PangleFullScreenNativeAdActivity
@ -275,4 +280,54 @@ object AdShowExt {
TopOnInterstitialAdController.getInstance().isAdShowing() || TopOnInterstitialAdController.getInstance().isAdShowing() ||
TopOnFullScreenNativeAdController.getInstance().isAdShowing() TopOnFullScreenNativeAdController.getInstance().isAdShowing()
} }
// ==================== 原生广告 ====================
/**
* 在容器中展示原生激励视频广告带竞价
* @param activity Context
* @param container 广告容器
* @param style 广告样式
* @return Boolean 是否展示成功
*/
suspend fun showRewardedVideoAd(
activity: Activity,
rewardCallback: ((RewardItem) -> Unit)? = null
): AdResult<Unit> {
AdLogger.d("激励视频广告竞价开始")
val winner = RewardedBiddingManager.bidding(activity)
AdLogger.d("激励视频广告竞价结果: $winner")
return when (winner) {
BiddingWinner.ADMOB -> {
AdLogger.d("使用 AdMob 展示激励视频广告")
RewardedAdController.getInstance().showAd(
activity,
"",
rewardCallback
)
}
BiddingWinner.PANGLE -> {
AdLogger.d("使用 Pangle 展示激励视频广告")
PangleRewardedAdController.getInstance().showAd(
activity,
"",
null
)
}
BiddingWinner.TOPON -> {
AdLogger.d("使用 TopOn 展示激励视频广告")
TopOnRewardedAdController.getInstance().showAd(
activity,
"",
null
)
}
}
}
} }