激励广告
激励广告是一种受欢迎的全屏广告格式,用户观看广告后会获得奖励。
这种广告类型的显示由用户激活,例如,为了在游戏中获得奖励或额外生命。
高度的用户积极性使得这种广告格式成为免费应用中最受欢迎和最具盈利性的广告格式。
外观
本指南将展示如何将激励广告集成到 Android 应用中。除了代码示例和说明之外,它还包含特定格式的建议和其他资源的链接。
前提条件
- 按照 快速入门 中描述的 SDK 集成步骤进行操作。
- 提前 初始化 您的广告 SDK。
- 确保您运行的是最新的 Yandex Mobile Ads SDK 版本。如果您使用聚合,请同时确保您运行的是最新版本的 统一构建。
实施
集成激励广告的关键步骤:
- 创建并配置 RewardedAdLoader广告加载器。
- 注册广告加载回调方法的监听器:RewardedAdLoadListener。
- 加载广告。
- 为广告事件回调方法注册 RewardedAdEventListener监听器。
- 呈现 RewardedAd。
- 奖励观看广告的用户。
激励广告集成的特点
- 
所有调用 Yandex Mobile Ads SDK 方法的操作必须在主线程中完成。 
- 
如果您在 onAdFailedToLoad()回调中收到错误,请不要尝试再次加载新广告。如果没有其他选项,请限制广告加载重试次数。这将有助于避免出现限制时持续出现不成功的请求和连接问题。
- 
我们建议在承载与广告交互的屏幕的生命周期内,始终保持对加载器和广告的强引用。 
- 
我们建议对所有广告加载使用 RewardedAdLoader的单个实例,以提高性能。
加载广告
要加载激励广告,请创建并设置 RewardedAdLoader 对象。
为此,您需要活动或应用程序上下文。
要在广告加载或加载失败时发出通知,请为 RewardedAdLoader 对象设置 RewardedAdLoadListener 回调方法监听器。
要加载广告,您需要来自 Yandex Advertising Network 界面 (adUnitId) 的广告单元标识符。
您可以通过 AdRequestConfiguration.Builder() 传递用户兴趣、上下文应用数据、位置详细信息或其他数据来扩展广告请求参数。在请求中提供额外的上下文数据可以显著提高您的广告质量。请参阅广告定位版块了解更多信息。
广告加载后(通过调用  onAdLoaded(rewardedAd: RewardedAd) 方法),在展示完成之前保存加载的 RewardedAd 的链接。
以下示例展示了如何从活动中加载激励广告:
class RewardedAdActivity : AppCompatActivity(R.layout.activity_rewarded_ad) {
    private var rewardedAd: RewardedAd? = null
    private var rewardedAdLoader: RewardedAdLoader? = null
    private lateinit var binding: ActivityRewardedAdBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityRewardedAdBinding.inflate(layoutInflater)
        setContentView(binding.root)
        // 激励广告加载应在 SDK 初始化后进行。
        // 尽早初始化 SDK,例如在 Application.onCreate 或 Activity.onCreate 中
        rewardedAdLoader = RewardedAdLoader(this).apply {
            setAdLoadListener(object : RewardedAdLoadListener {
                override fun onAdLoaded(rewardedAd: RewardedAd) {
                    this.rewardedAd = rewardedAd
                    // 广告加载成功。您现在可以展示广告。
                }
                override fun onAdFailedToLoad(adRequestError: AdRequestError) {
                    // 广告加载失败,出现 AdRequestError。
                    // 强烈建议不要尝试通过 onAdFailedToLoad() 方法加载新广告。
                }
            })
        }
        loadRewardedAd()
    }
    private fun loadRewardedAd() {
        val adRequestConfiguration = AdRequestConfiguration.Builder("your-ad-unit-id").build()
        rewardedAdLoader?.loadAd(adRequestConfiguration)
    }
}
public class RewardedAdActivity extends AppCompatActivity {
    @Nullable
    private RewardedAd mRewardedAd = null;
    @Nullable
    private RewardedAdLoader mRewardedAdLoader = null;
    private ActivityRewardedAdBinding mBinding;
    public RewardedAdActivity() {
        super(R.layout.activity_rewarded_ad);
    }
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mBinding = ActivityRewardedAdBinding.inflate(getLayoutInflater());
        setContentView(mBinding.getRoot());
        // 插屏广告加载应在 SDK 初始化后进行。
        // 尽早初始化 SDK,例如在 Application.onCreate 或 Activity.onCreate 中
        mRewardedAdLoader = new RewardedAdLoader(this);
        mRewardedAdLoader.setAdLoadListener(new RewardedAdLoadListener() {
            @Override
            public void onAdLoaded(@NonNull final RewardedAd rewardedAd) {
                mRewardedAd = rewardedAd;
                // 广告加载成功。您现在可以展示广告。
            }
            @Override
            public void onAdFailedToLoad(@NonNull final AdRequestError adRequestError) {
                // 广告加载失败,出现 AdRequestError。
                // 强烈建议不要尝试通过 onAdFailedToLoad() 方法加载新广告。
            }
        });
        loadRewardedAd();
    }
    private void loadRewardedAd() {
        if (mRewardedAdLoader != null ) {
            final AdRequestConfiguration adRequestConfiguration =
                new AdRequestConfiguration.Builder("your-ad-unit-id").build();
            mRewardedAdLoader.loadAd(adRequestConfiguration);
        }
    }
}
广告呈现
激励广告是一种基于激励的广告格式,允许用户因观看广告而获得奖励。奖励可能是额外的生命或在游戏中晋级到下一个级别。激励广告是在应用级别确定的。
跟踪激励广告生命周期并发放奖励,请为 RewardedAd 对象设置 RewardedAdEventListener 回调方法监听器。
要呈现广告,您需要将活动传递给已加载广告的展示方法:
private fun showAd() {
    rewardedAd?.apply {
        setAdEventListener(object : RewardedAdEventListener {
            override fun onAdShown() {
                // 广告展示时调用。
            }
            override fun onAdFailedToShow(adError: AdError) {
            	// RewardedAd 展示失败时调用
            }
            override fun onAdDismissed() {
                // 广告关闭时调用。
                // 广告关闭后清理资源
                rewardedAd?.setAdEventListener(null)
                rewardedAd = null
                // 现在您可以预加载下一个激励广告。
                loadRewardedAd()
            }
            override fun onAdClicked() {
                // 记录广告点击时调用。
            }
            override fun onAdImpression(impressionData: ImpressionData?) {
                // 记录广告展示次数时调用。
            }
            override fun onRewarded(reward: Reward) {
                // 当用户可以获得奖励时调用。
            }
        })
        show(this@Activity)
    }
}
private void showAd() {
    if (mRewardedAd != null) {
        mRewardedAd.setAdEventListener(new RewardedAdEventListener() {
            @Override
            public void onAdShown() {
                // 广告展示时调用。
            }
            @Override
            public void onAdFailedToShow(@NonNull final AdError adError) {
                // 当 InterstitialAd 未能显示时调用。
            }
            @Override
            public void onAdDismissed() {
                // 广告关闭时调用。
                // 广告关闭后清理资源
                if (mRewardedAd != null) {
                    mRewardedAd.setAdEventListener(null);
                    mRewardedAd = null;
                }
                // 现在您可以预加载下一个插屏广告。
                loadRewardedAd();
            }
            @Override
            public void onAdClicked() {
                // 记录广告点击时调用。
            }
            @Override
            public void onAdImpression(@Nullable final ImpressionData impressionData) {
                // 记录广告展示次数时调用。
            }
            @Override
            public void onRewarded(@NonNull final Reward reward) {
                // 当用户可以获得奖励时调用。
            }
        });
        mRewardedAd.show(this);
    }
}
释放资源
不要存储先前呈现的广告的链接。针对之前呈现的广告调用 setAdEventListener(null)。
如果不再使用加载器,请调用 setAdLoadListener(null)。
这可以释放资源并防止内存泄漏。
override fun onDestroy() {
    super.onDestroy()
    rewardedAdLoader.setAdLoadListener(null)
    rewardedAdLoader = null
    destroyRewardedAd()
}
private fun destroyRewardedAd() {
    rewardedAd?.setAdEventListener(null)
    rewardedAd = null
}
@Override
protected void onDestroy() {
    super.onDestroy();
    if (mRewardedAdLoader != null) {
        mRewardedAdLoader.setAdLoadListener(null);
        mRewardedAdLoader = null;
    }
    destroyRewardedAd();
}
private void destroyRewardedAd() {
    if (mRewardedAd != null) {
        mRewardedAd.setAdEventListener(null);
        mRewardedAd = null;
    }
}
测试激励广告集成
使用演示广告单元进行广告测试
我们建议使用测试广告来测试您的激励广告集成和应用本身。
为了保证为每个广告请求返回测试广告,我们创建了一个特殊的演示广告版位 ID。用它来检查您的广告集成。
演示广告单元 ID:demo-rewarded-yandex。
重要
在商店中发布您的应用程序之前,确保将演示版位 ID 替换为您在 Yandex Advertising Network 界面中获得的真实 ID。
您可以在 用于测试的演示广告单元 版块找到可用的演示广告版位 ID 列表。
测试广告集成
您可以使用 SDK 的内置分析器来测试激励广告集成。
该工具检查可确保您的激励广告正确集成,并向日志输出详细报告。 要查看报告,请在用于 Android 应用调试的 Logcat 工具中搜索“YandexAds”关键字。
adb logcat -v brief '*:S YandexAds'
如果集成成功,您将看到以下消息:
adb logcat -v brief '*:S YandexAds'
mobileads$ adb logcat -v brief '*:S YandexAds'
I/YandexAds(13719): [Integration] Ad type rewarded was integrated successfully
如果您在集成激励广告时遇到问题,您将获得有关问题的详细报告以及如何解决这些问题的建议。
其他资源
- 
GitHub 链接。