广告滑块

原生广告是一种布局可以在应用级别定义的广告类型。这一功能允许您根据应用设计的具体上下文更改广告的视觉风格以及投放位置。

广告呈现通过本地平台工具执行,从而提高广告效果和质量。

原生广告可以增强广告体验。因此,您可以在不失去用户兴趣的情况下展示更多广告。从长远来看,这确保了广告收入的最大化。

前提条件

  1. 按照 快速入门 中描述的 SDK 集成步骤进行操作。
  2. 提前 初始化 您的广告 SDK。
  3. 确保您运行的是最新的 Yandex Mobile Ads SDK 版本。如果您使用聚合,请同时确保您运行的是最新版本的 统一构建

实施

集成原生广告(滑块)的关键步骤:

  • 创建并配置 SliderAdLoader 广告加载器。
  • 注册广告加载器事件监听器:SliderAdLoadListener
  • 加载广告。
  • 显示加载的广告。

原生广告集成的特点

  1. 所有调用 Yandex Mobile Ads SDK 方法的操作必须在主线程中完成。

  2. 如果您在 onAdFailedToLoad() 回调中收到错误,请不要尝试再次加载新广告。如果没有其他选项,请限制广告加载重试次数。这将有助于避免出现限制时持续出现不成功的请求和连接问题。

  3. 我们建议在托管广告交互的屏幕的整个生命周期中保留对 SliderAd 广告对象及其加载器 SliderAdLoader 的强引用。

  4. 加载滑块后,您必须呈现其所有资产。您可以从 SliderAd 对象获取广告中可用的资产列表。

  5. 滑块包含一组广告,其中每个广告都需要显示。

  6. 滑块内的每个广告都包含一组资产。您可以从 NativeAd 广告对象获取广告中可用的组件列表。所有必需的广告资产均需要呈现。您可以在 原生广告资产页面找到广告资产的描述。

  7. 我们建议根据广告内容计算广告容器的大小。

  8. 滑块中的广告必须显示在同一个共享容器中:否则,广告展示次数将不会计入。

  9. 带有视频的广告通常效果更好。要显示视频广告,广告容器和 MediaView 组件的大小应至少为 300x160 dp(密度无关像素)。

  10. 我们建议您使用包含完整的可能资产集的布局。根据我们的经验,包含整套资产的布局转换效果更好。

加载滑块

要加载原生广告滑块,请创建一个 SliderAdLoader 对象。

广告请求参数使用 NativeAdRequestConfiguration.Builder 类对象进行配置。您可以使用广告单元 ID、加载图像的方法、年龄、性别以及其他可能提高广告选择质量的数据作为请求参数。

要接收有关广告加载结果的通知,请创建 SliderAdLoadListener 实例并将其设置为广告滑块加载器的事件监听器。

要加载广告,请调用 loadAd() 方法。

以下示例展示了如何从活动加载原生广告:

class SliderNativeAdActivity : AppCompatActivity(R.layout.activity_slider_native_ad) {

    private val nativeAdView get() = binding.nativeAd.root

    private var sliderAdLoader: SliderAdLoader? = null

    private lateinit var binding: ActivityCustomNativeAdBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityCustomNativeAdBinding.inflate(layoutInflater)
        setContentView(binding.root)

        sliderAdLoader = createSliderAdLoader()
        sliderAdLoader?.loadSlider(
            // 此处可以使用 NativeAdRequestConfiguration.Builder 类中的方法来指定各个选项设置。
            NativeAdRequestConfiguration.Builder("your-ad-unit-id").build()
        )
    }

    private fun createSliderAdLoader(): SliderAdLoader {
        return sliderAdLoader ?: SliderAdLoader(this).apply {
            setSliderAdLoadListener(object : SliderAdLoadListener {
                override fun onSliderAdLoaded(p0: SliderAd) {
                    // 滑块广告加载成功。现在您可以显示已加载的广告。
                }

                override fun onSliderAdFailedToLoad(p0: AdRequestError) {
                    // 广告加载失败,出现 AdRequestError。
                    // 强烈建议不要尝试通过 onAdFailedToLoad() 方法加载新广告。
                }
            })
        }
    }
}
class CustomSliderNativeAdActivity extends AppCompatActivity {
    private NativeAdView mNativeAdView = mBinding.nativeAd.getRoot();

    @Nullable
    private SliderAdLoader mSliderAdLoader = null;

    private ActivityCustomNativeAdBinding mBinding;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mBinding = ActivityCustomNativeAdBinding.inflate(getLayoutInflater());
        setContentView(mBinding.getRoot());

        mSliderAdLoader = createSliderAdLoader();
        if (mSliderAdLoader != null) {
            // 此处可以使用 NativeAdRequestConfiguration.Builder 类中的方法来指定各个选项设置。
            mSliderAdLoader.loadSlider(
                    new NativeAdRequestConfiguration.Builder("your-ad-unit-id").build()
            );
        }
    }

    private SliderAdLoader createSliderAdLoader() {
        if (mSliderAdLoader != null) {
            return mSliderAdLoader;
        }

        final SliderAdLoader newSliderAdLoader = new SliderAdLoader(this);

        newSliderAdLoader.setSliderAdLoadListener(new SliderAdLoadListener() {
            @Override
            public void onSliderAdLoaded(@NonNull SliderAd sliderAd) {
                // 滑块广告加载成功。现在您可以显示已加载的广告。
            }

            @Override
            public void onSliderAdFailedToLoad(@NonNull final AdRequestError error) {
                // 广告加载失败,出现 AdRequestError。
                // 强烈建议不要尝试通过 onAdFailedToLoad() 方法加载新广告。
            }
        });
        return mSliderAdLoader;
    }
}

呈现原生广告滑块

加载滑块后,您必须呈现其所有资产。

成功加载的滑块包含一个或多个具有相同上下文的原生广告。滑块中的广告必须显示在同一个共享容器中:否则,广告展示次数将不会计入。

配置滑块布局有两种方法:

  • 使用模板进行布局
  • 手动设置原生广告滑块的布局

使用模板进行布局

使用原生广告滑块的最简单方法是使用标准布局模板,您只需要在基本版本中添加几行代码。

该模板已经具有完整的所需资产集,并定义了它们之间的相对排列方式。该模板适用于任何受支持的原生广告类型。

使用模板制作滑块很容易。将 SliderAd 对象链接到根 NativeAdView 容器,并将滑块中的所有广告链接到模板。

代码示例
private fun showAd(sliderAd: SliderAd) {
    try {
        val sliderViewBinder = NativeAdViewBinder.Builder(sliderAdView).build()
        sliderAd.bindSliderAd(sliderViewBinder)
        val nativeAds = sliderAd.nativeAds
        for (nativeAd in nativeAds) {
            val nativeBannerView = NativeBannerView(this)
            nativeBannerView.setAd(nativeAd)
            sliderAdView.addView(nativeBannerView)
        }
    } catch (exception: NativeAdException) {
        //日志错误
    }
}
private void showAd(@NonNull final SliderAd sliderAd) {
    try {
        final NativeAdViewBinder sliderViewBinder = new NativeAdViewBinder.Builder(mSliderAdView).build();
        sliderAd.bindSliderAd(sliderViewBinder);

        final List<NativeAd> nativeAds = sliderAd.getNativeAds();
        for (final NativeAd nativeAd : nativeAds) {
            final NativeBannerView nativeBannerView = new NativeBannerView(this);
            nativeBannerView.setAd(nativeAd);
            mSliderAdView.addView(nativeBannerView);
        }
    } catch (final NativeAdException exception) {
        //日志错误
    }
}

您可以自定义原生广告滑块模板。您可以在 使用模板设置布局 中阅读更多相关信息。

手动设置原生广告滑块的布局

当模板设置不足以满足您的需求时,您可以手动配置原生广告滑块的布局。

使用此方法,您可以通过相对定位广告组件来安排原生广告的滑块。您的广告可能包含强制和可选的显示资产。您可以在 原生广告资产 中找到它们的完整列表。

提示

对于滑块中的每个广告,我们建议使用包含一整套可能资产的布局。经验表明,具有完整资产集的布局更易被点击。

SliderAd 对象链接到根 NativeAdView 对象,并将滑块中的每个广告链接到子 NativeAdView 对象。

滑块中的每个广告均使用标准原生广告 布局方法 进行布局。

代码示例
private fun showAd(sliderAd: SliderAd) {
    try {
        val sliderViewBinder = NativeAdViewBinder.Builder(sliderAdView).build()
        sliderAd.bindSliderAd(sliderViewBinder)
        val nativeAds = sliderAd.nativeAds
        for (nativeAd in nativeAds) {
            val nativeAdView: NativeAdView =
                mLayoutInflater.inflate(R.layout.widget_native_ad, sliderAdView, false)
            val viewBinder = NativeAdViewBinder.Builder(nativeAdView)
                .setAgeView(age)
                .setBodyView(body)
                .setCallToActionView(callToAction)
                .setDomainView(domain)
                .setFaviconView(favicon)
                .setFeedbackView(feedback)
                .setIconView(icon)
                .setMediaView(media)
                .setPriceView(price)
                .setRatingView(rating)
                .setReviewCountView(reviewCount)
                .setSponsoredView(sponsored)
                .setTitleView(title)
                .setWarningView(warning)
                .build()
            nativeAd.bindNativeAd(viewBinder)
            sliderAdView.addView(nativeAdView)
        }
    } catch (exception: NativeAdException) {
        //日志错误
    }
}
private void showAd(@NonNull final SliderAd sliderAd) {
    try {
        final NativeAdViewBinder sliderViewBinder = new NativeAdViewBinder.Builder(mSliderAdView).build();
        sliderAd.bindSliderAd(sliderViewBinder);
        final List<NativeAd> nativeAds = sliderAd.getNativeAds();
        for (final NativeAd nativeAd : nativeAds) {
            final NativeAdView nativeAdView = mLayoutInflater.inflate(R.layout.widget_native_ad, mSliderAdView, false);
            final NativeAdViewBinder viewBinder = new NativeAdViewBinder.Builder(nativeAdView)
                    .setAgeView(age)
                    .setBodyView(body)
                    .setCallToActionView(callToAction)
                    .setDomainView(domain)
                    .setFaviconView(favicon)
                    .setFeedbackView(feedback)
                    .setIconView(icon)
                    .setMediaView(media)
                    .setPriceView(price)
                    .setRatingView(rating)
                    .setReviewCountView(reviewCount)
                    .setSponsoredView(sponsored)
                    .setTitleView(title)
                    .setWarningView(warning)
                    .build();

            nativeAd.bindNativeAd(viewBinder);
            mSliderAdView.addView(nativeAdView);
        }
    } catch (final NativeAdException exception) {
        //日志错误
    }
}

测试原生广告滑块的集成

使用演示广告单元进行广告测试

我们建议使用测试广告来测试您的原生广告滑块集成和应用本身。

为了保证为每个滑块请求返回测试广告,我们创建了一个特殊的演示广告版位 ID。用它来检查您的广告集成。

原生广告滑块的演示 adUnitIddemo-native-slider-yandex

重要

在商店中发布应用之前,请确保将演示广告单元 ID 替换为从 Partner Interface 获取的真实 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] Slider native ad was integrated successfully

如果您在集成原生广告滑块时遇到问题,您将获得有关问题的详细报告以及如何解决这些问题的建议。