版本 8 迁移指南

Yandex Mobile Ads SDK 8.x 对 API 进行了多项调整,以改进开发者的使用体验。

主要变更

1. AdRequest 相关变更

已移除 AdRequestConfigurationNativeAdRequestConfiguration。所有广告类型请统一使用 AdRequest

状态

AdRequestConfiguration

已移除。请使用 AdRequest

NativeAdRequestConfiguration

已移除。请使用 AdRequestNativeAdOptions

示例

SDK 7

// Fullscreen & Native Ads, e.g. InterstitialAdLoader
val loader = InterstitialAdLoader(this)
val config = AdRequestConfiguration.Builder("R-M-XXXXX-YY").build()
loader.loadAd(config)

// Banner ads
val bannerView = findViewById<R.id.view_banner>(BannerAdView)
bannerView.setAdUnitId("R-M-XXXXX-YY")
val request = AdRequest.Builder().build()
bannerView.loadAd(request)

SDK 8

// Fullscreen & Native Ads, e.g. InterstitialAdLoader
val loader = InterstitialAdLoader(this)
val request = AdRequest.Builder("R-M-XXXXX-YY").build()
loader.loadAd(adRequest, listener)

// Banner ads
val bannerView = findViewById<R.id.view_banner>(BannerAdView)
val request = AdRequest.Builder("R-M-XXXXX-YY").build()
bannerView.loadAd(request)

SDK 7

void loadAd() {
    // Fullscreen & Native Ads, e.g. InterstitialAdLoader
    InterstitialAdLoader loader = new InterstitialAdLoader(this);
    AdRequestConfiguration config = new AdRequestConfiguration.Builder("R-M-XXXXX-YY")
            .build();
    loader.loadAd(config);

    // Banner ads
    BannerAdView bannerView = findViewById(R.id.view_banner);
    bannerView.setAdUnitId("R-M-XXXXX-YY");
    AdRequest request = new AdRequest.Builder().build();
    bannerView.loadAd(request);
}

SDK 8

void loadAd() {
    // Fullscreen & Native Ads, e.g. InterstitialAdLoader
    InterstitialAdLoader loader = new InterstitialAdLoader(this);
    AdRequest request = new AdRequest.Builder("R-M-XXXXX-YY")
            .build();
    loader.loadAd(request, listener);

    // Banner ads
    BannerAdView bannerView = findViewById(R.id.view_banner);
    AdRequest request = new AdRequest.Builder("R-M-XXXXX-YY").build();
    bannerView.loadAd(request);
}

2. Targeting API 变更

  • 已从 AdRequest.Builder 中移除字段 agegenderlocationcontextQuerycontextTags
  • 请使用新增类 AdTargeting 管理定向参数。

状态

AdTargeting

已添加

AdTargeting.Builder

已添加

方法

状态

AdRequest.Builder

setAge(String)

已移除,请使用 AdTargeting.Builder.setAge(String)AdRequest.Builder.setTargeting(AdTargeting)

setGender(String)

已移除,请使用 AdTargeting.Builder.setGender(String)AdRequest.Builder.setTargeting(AdTargeting)

setLocation(Location)

已移除,请使用 AdTargeting.Builder.setLocation(Location)AdRequest.Builder.setTargeting(AdTargeting)

setContextQuery(String)

已移除,请使用 AdTargeting.Builder.setContextQuery(String)AdRequest.Builder.setTargeting(AdTargeting)

setContextTags(List<String>)

已移除,请使用 AdTargeting.Builder.setContextTags(List<String>)AdRequest.Builder.setTargeting(AdTargeting)

setTargeting(AdTargeting)

已添加

AdTargeting.Builder

setAge(String)

已添加

setGender(String)

已添加

setLocation(Location)

已添加

setContextQuery(String)

已添加

setContextTags(List<String>)

已添加

示例

SDK 7

val adRequest = AdRequest.Builder()
    .setAge("25")
    .setGender(Gender.MALE)
    .setContextTags(listOf("news"))
    .build()

SDK 8

val targeting = AdTargeting.Builder()
    .setAge("25")
    .setGender(Gender.MALE)
    .setContextTags(listOf("news"))
    .build()

val adRequest = AdRequest.Builder(adUnitId)
    .setTargeting(targeting)
    .build()

SDK 7

void loadAd() {
    AdRequest adRequest = AdRequest.Builder()
            .setAge("25")
            .setGender(Gender.MALE)
            .setContextTags(listOf("news"))
            .build();
}

SDK 8

void loadAd() {
    AdTargeting targeting = new AdTargeting.Builder()
            .setAge("25")
            .setGender(Gender.MALE)
            .setContextTags(listOf("news"))
            .build();

    AdRequest adRequest = new AdRequest.Builder(adUnitId)
            .setTargeting(targeting)
            .build();
}

3. 广告加载 API 变更

注册回调监听器与加载广告的方法已调整。

方法

状态

InterstitialAdLoader

setAdLoadListener(InterstitialAdLoadListener)

已移除。请将 InterstitialAdLoadListener 传入 loadAd 方法参数。

loadAd(AdRequestConfiguration)

已移除。请使用 loadAd(AdRequest, InterstitialAdLoadListener)

loadAd(AdRequest, InterstitialAdLoadListener)

已添加

RewardedAdLoader

setAdLoadListener(RewardedAdLoadListener)

已移除。请将 RewardedAdLoadListener 传入 loadAd 方法参数。

loadAd(AdRequestConfiguration)

已移除。请使用 loadAd(AdRequest, RewardedAdLoadListener)

loadAd(AdRequest, RewardedAdLoadListener)

已添加

AppOpenAdLoader

setAdLoadListener(AppOpenAdLoadListener)

已移除。请将 AppOpenAdLoadListener 传入 loadAd 方法参数。

loadAd(AdRequestConfiguration)

已移除。请使用 loadAd(AdRequest, AppOpenAdLoadListener)

loadAd(AdRequest, AppOpenAdLoadListener)

已添加

NativeAdLoader

setNativeAdLoadListener(NativeAdLoadListener)

已移除。请将 NativeAdLoadListener 传入 loadAd 方法参数。

loadAd(NativeAdRequestConfiguration)

已移除。请使用 loadAd(AdRequest, NativeAdLoadListener)

loadAd(AdRequest, NativeAdOptions, NativeAdLoadListener)

已添加

loadAd(AdRequest, NativeAdLoadListener)

已添加

SliderAdLoader

setSliderAdLoadListener(SliderAdLoadListener)

已移除。请将 SliderAdLoadListener 传入 loadAd 方法参数。

loadSlider(NativeAdRequestConfiguration)

已移除。请使用 loadAd(AdRequest, SliderAdLoadListener)

loadSlider(AdRequest, NativeAdOptions, SliderAdLoadListener)

已添加

loadAd(AdRequest, NativeAdLoadListener)

已添加

NativeBulkAdLoader

setNativeBulkAdLoadListener(NativeBulkAdLoadListener)

已移除。请将 NativeBulkAdLoadListener 传入 loadAd 方法参数。

loadAds(NativeAdRequestConfiguration, Int)

已移除。请使用 loadAd(AdRequest, NativeAdLoadListener)

loadAds(AdRequest, NativeAdOptions, NativeBulkAdLoadListener)

已添加

loadAds(AdRequest, NativeBulkAdLoadListener)

已添加

示例

SDK 7

// Interstitial Ads
val interstitialAdLoader = InterstitialAdLoader(this)
interstitialAdLoader.setAdLoadListener(object : InterstitialAdLoadListener { /* ... */ })
interstitialAdLoader.loadAd(AdRequestConfiguration.Builder("R-M-XXXXX-YY").build())

// Rewarded Ads
val rewardedAdLoader = RewardedAdLoader(this)
rewardedAdLoader.setAdLoadListener(object : RewardedAdLoadListener { /* ... */ })
rewardedAdLoader.loadAd(AdRequestConfiguration.Builder("R-M-XXXXX-YY").build())

// AppOpen Ads
val appOpenAdLoader = AppOpenAdLoader(this)
appOpenAdLoader.setAdLoadListener(object : AppOpenAdLoadListener { /* ... */ })
appOpenAdLoader.loadAd(AdRequestConfiguration.Builder("R-M-XXXXX-YY").build())

// Native Ads
val nativeAdLoader = NativeAdLoader(this)
nativeAdLoader.setNativeAdLoadListener(object : NativeAdLoadListener { /* ... */ })
nativeAdLoader.loadAd(NativeAdRequestConfiguration.Builder("R-M-XXXXX-YY").build())

// Slider Ads
val sliderAdLoader = SliderAdLoader(this)
sliderAdLoader.setSliderAdLoadListener(object : SliderAdLoadListener { /* ... */ })
sliderAdLoader.loadSlider(NativeAdRequestConfiguration.Builder("R-M-XXXXX-YY").build())

// Native bulk ads
val nativeBulkAdLoader = NativeBulkAdLoader(this)
nativeBulkAdLoader.setNativeBulkAdLoadListener(object : NativeBulkAdLoadListener { /* ... */ })
nativeBulkAdLoader.loadAds(NativeAdRequestConfiguration.Builder("R-M-XXXXX-YY").build(), 1)

SDK 8

// Interstitial Ads
val interstitialAdLoader = InterstitialAdLoader(this)
interstitialAdLoader.loadAd(AdRequest.Builder("R-M-XXXXX-YY").build(), object : InterstitialAdLoadListener { /* ... */ })

// Rewarded Ads
val rewardedAdLoader = RewardedAdLoader(this)
rewardedAdLoader.loadAd(AdRequest.Builder("R-M-XXXXX-YY").build(), object : RewardedAdLoadListener { /* ... */ })

// AppOpen Ads
val appOpenAdLoader = AppOpenAdLoader(this)
appOpenAdLoader.loadAd(AdRequest.Builder("R-M-XXXXX-YY").build(), object : AppOpenAdLoadListener { /* ... */ })

// Native Ads
val nativeAdLoader = NativeAdLoader(this)
nativeAdLoader.loadAd(AdRequest.Builder("R-M-XXXXX-YY").build(), object : NativeAdLoadListener { /* ... */ })
// Or with NativeAdOptions
nativeAdLoader.loadAd(
    AdRequest.Builder("R-M-XXXXX-YY").build(),
    NativeAdOptions.Builder().build(),
    object : NativeAdLoadListener { /* ... */ })

// Slider Ads
val sliderAdLoader = SliderAdLoader(this)
sliderAdLoader.loadSlider(AdRequest.Builder("R-M-XXXXX-YY").build(), object : SliderAdLoadListener { /* ... */ })
// Or with NativeAdOptions
sliderAdLoader.loadSlider(
    AdRequest.Builder("R-M-XXXXX-YY").build(),
    NativeAdOptions.Builder().build(),
    object : SliderAdLoadListener { /* ... */ })

// Native Bulk Ads
val nativeBulkAdLoader = NativeBulkAdLoader(this)
nativeBulkAdLoader.loadAds(
    AdRequest.Builder("R-M-XXXXX-YY").build(),
    1,
    object : NativeBulkAdLoadListener { /* ... */ }
)
// Or with NativeAdOptions
nativeBulkAdLoader.loadAds(
    AdRequest.Builder("R-M-XXXXX-YY").build(),
    1,
    NativeAdOptions.Builder().build(),
    object : NativeBulkAdLoadListener { /* ... */ }
)

SDK 7

void loadAd() {
    // Interstitial Ads
    InterstitialAdLoader interstitialAdLoader = new InterstitialAdLoader(this);
    interstitialAdLoader.setAdLoadListener(new InterstitialAdLoadListener() { /* ... */ });
    interstitialAdLoader.loadAd(new AdRequestConfiguration.Builder("R-M-XXXXX-YY").build());

    // Rewarded Ads
    RewardedAdLoader rewardedAdLoader = new RewardedAdLoader(this);
    rewardedAdLoader.setAdLoadListener(new RewardedAdLoadListener() { /* ... */ });
    rewardedAdLoader.loadAd(new AdRequestConfiguration.Builder("R-M-XXXXX-YY").build());

    // AppOpen Ads
    AppOpenAdLoader appOpenAdLoader = new AppOpenAdLoader(this);
    appOpenAdLoader.setAdLoadListener(new AppOpenAdLoadListener() { /* ... */ });
    appOpenAdLoader.loadAd(new AdRequestConfiguration.Builder("R-M-XXXXX-YY").build());

    // Native Ads
    NativeAdLoader nativeAdLoader = new NativeAdLoader(this);
    nativeAdLoader.setNativeAdLoadListener(new NativeAdLoadListener() { /* ... */ });
    nativeAdLoader.loadAd(new NativeAdRequestConfiguration.Builder("R-M-XXXXX-YY").build());

    // Slider Ads
    SliderAdLoader sliderAdLoader = new SliderAdLoader(this);
    sliderAdLoader.setSliderAdLoadListener(new SliderAdLoadListener() { /* ... */ });
    sliderAdLoader.loadSlider(new NativeAdRequestConfiguration.Builder("R-M-XXXXX-YY").build());

    // Native Bulk Ads
    NativeBulkAdLoader nativeBulkAdLoader = new NativeBulkAdLoader(this);
    nativeBulkAdLoader.setNativeBulkAdLoadListener(new NativeBulkAdLoadListener() { /* ... */ });
    nativeBulkAdLoader.loadAds(new NativeAdRequestConfiguration.Builder("R-M-XXXXX-YY").build(), 1);
}

SDK 8

void loadAd() {
    // Interstitial Ads
    InterstitialAdLoader interstitialAdLoader = new InterstitialAdLoader(this);
    interstitialAdLoader.loadAd(new AdRequest.Builder("R-M-XXXXX-YY").build(),
            new InterstitialAdLoadListener() { /* ... */ }
    );

    // Rewarded Ads
    RewardedAdLoader rewardedAdLoader = new RewardedAdLoader(this);
    rewardedAdLoader.loadAd(new AdRequest.Builder("R-M-XXXXX-YY").build(),
            new RewardedAdLoadListener() { /* ... */ }
    );

    // AppOpen Ads
    AppOpenAdLoader appOpenAdLoader = new AppOpenAdLoader(this);
    appOpenAdLoader.loadAd(new AdRequest.Builder("R-M-XXXXX-YY").build(),
            new AppOpenAdLoadListener() { /* ... */ }
    );

    // Native Ads
    NativeAdLoader nativeAdLoader = new NativeAdLoader(this);
    nativeAdLoader.loadAd(new AdRequest.Builder("R-M-XXXXX-YY").build(),
            new NativeAdLoadListener() { /* ... */ }
    );
    // Or with NativeAdOptions
    nativeAdLoader.loadAd(new AdRequest.Builder("R-M-XXXXX-YY").build(),
            new NativeAdOptions.Builder().build(),
            new NativeAdLoadListener() { /* ... */ }
    );

    // Slider Ads
    SliderAdLoader sliderAdLoader = new SliderAdLoader(this);
    sliderAdLoader.loadSlider(new AdRequest.Builder("R-M-XXXXX-YY").build(),
            new SliderAdLoadListener() { /* ... */ }
    );
    // Or with NativeAdOptions
    sliderAdLoader.loadSlider(new AdRequest.Builder("R-M-XXXXX-YY").build(),
            new NativeAdOptions.Builder().build(),
            new SliderAdLoadListener() { /* ... */ }
    );

    // Native Bulk Ads
    NativeBulkAdLoader nativeBulkAdLoader = new NativeBulkAdLoader(this);
    nativeBulkAdLoader.loadAds(new AdRequest.Builder("R-M-XXXXX-YY").build(),
            1,
            new NativeBulkAdLoadListener() { /* ... */ }
    );
    // Or with NativeAdOptions
    nativeBulkAdLoader.loadAds(new AdRequest.Builder("R-M-XXXXX-YY").build(),
            1,
            new NativeAdOptions.Builder().build(),
            new NativeBulkAdLoadListener() { /* ... */ }
    );
}

3.1 Kotlin 协程支持

广告加载相关 API 新增 suspend 重载:

方法

状态

InterstitialAdLoader

suspend fun loadAd(AdRequest): InterstitialAdLoadResult

已添加

RewardedAdLoader

suspend fun loadAd(AdRequest): RewardedAdLoadResult

已添加

AppOpenAdLoader

suspend fun loadAd(AdRequest): AppOpenAdLoadResult

已添加

NativeAdLoader

suspend fun loadAd(AdRequest, NativeAdOptions): NativeAdLoadResult

已添加

suspend fun loadAd(AdRequest): NativeAdLoadResult

已添加

SliderAdLoader

suspend fun loadAd(AdRequest): SliderAdLoadResult

已添加

suspend fun loadAd(AdRequest, NativeAdOptions): SliderAdLoadResult

已添加

NativeBulkAdLoader

suspend fun loadAds(AdRequest, Int): NativeBulkAdLoadResult

已添加

suspend fun loadAds(AdRequest, Int, NativeAdOptions): NativeBulkAdLoadResult

已添加

示例

lifecycleScope.launch {
    // Interstitial Ads
    val interstitialAdLoader = InterstitialAdLoader(applicationContext)
    when(val result = interstitialAdLoader.loadAd(AdRequest.Builder("R-M-XXXXX-YY").build())) {
        is InterstitialAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is InterstitialAdLoadResult.Success -> TODO("Show interstitial ad: ${result.ad}")
    }

    // Rewarded Ads
    val rewardedAdLoader = RewardedAdLoader(applicationContext)
    when(val result = rewardedAdLoader.loadAd(AdRequest.Builder("R-M-XXXXX-YY").build())) {
        is RewardedAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is RewardedAdLoadResult.Success -> TODO("Show rewarded ad: ${result.ad}")
    }

    // AppOpen Ads
    val appOpenAdLoader = AppOpenAdLoader(applicationContext)
    when(val result = appOpenAdLoader.loadAd(AdRequest.Builder("R-M-XXXXX-YY").build())) {
        is AppOpenAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is AppOpenAdLoadResult.Success -> TODO("Show appOpen ad: ${result.ad}")
    }

    // Native Ads
    val nativeAdLoader = NativeAdLoader(applicationContext)
    val nativeAdRequest = AdRequest.Builder("R-M-XXXXX-YY").build()
    when(val result = nativeAdLoader.loadAd(nativeAdRequest)) {
        is NativeAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is NativeAdLoadResult.Success -> TODO("Show native ad: ${result.ad}")
    }

    // Or with NativeAdOptions
    when(val result = nativeAdLoader.loadAd(nativeAdRequest, NativeAdOptions.Builder().build())) {
        is NativeAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is NativeAdLoadResult.Success -> TODO("Show native ad: ${result.ad}")
    }

    // Slider Ads
    val sliderAdLoader = SliderAdLoader(applicationContext)
    val sliderAdRequest = AdRequest.Builder("R-M-XXXXX-YY").build()
    when(val result = sliderAdLoader.loadAd(sliderAdRequest)) {
        is SliderAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is SliderAdLoadResult.Success -> TODO("Show slider ad: ${result.ad}")
    }

    // Or with NativeAdOptions
    when(val result = sliderAdLoader.loadAd(sliderAdRequest, NativeAdOptions.Builder().build())) {
        is SliderAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is SliderAdLoadResult.Success -> TODO("Show slider ad: ${result.ad}")
    }

    // Native Bulk Ads
    val nativeBulkAdLoader = NativeBulkAdLoader(applicationContext)
    val builkAdRequest = AdRequest.Builder("R-M-XXXXX-YY").build()
    when(val result = nativeBulkAdLoader.loadAds(builkAdRequest, 1)) {
        is NativeBulkAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is NativeBulkAdLoadResult.Success -> TODO("Show bulk ad: ${result.ads}")
    }

    // Or with NativeAdOptions
    when(val result = nativeBulkAdLoader.loadAds(builkAdRequest, 1, NativeAdOptions.Builder().build())) {
        is NativeBulkAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is NativeBulkAdLoadResult.Success -> TODO("Show bulk ad: ${result.ads}")
    }
}

4. Banner API 变更

已从 BannerAdView 移除 setAdUnitIdadUnitId 在每次加载广告时传入。创建 BannerAdSize 的工厂方法已重命名。

方法

状态

BannerAdView

setAdUnitId(String)

已移除。加载广告前请在 AdRequest 构造函数中传入 adUnitId

BannerAdSize

stickySize

已移除。请使用 BannerAdSize.sticky

inlineSize

已移除。请使用 BannerAdSize.inline

示例

SDK 7

val banner = findViewById<R.id.banner>(BannerAdView)
val stickySize = BannerAdSize.stickySize(this, screenWidth)
val inlineSizeSize = BannerAdSize.inlineSize(this, screenWidth, 300)
banner.setAdUnitId("R-M-XXXXX-YY")
banner.setAdSize(stickySize)
banner.loadAd(AdRequest.Builder().build())

SDK 8

val banner = findViewById<R.id.banner>(BannerAdView)
val stickySize = BannerAdSize.sticky(this, screenWidth)
val inlineSizeSize = BannerAdSize.inline(this, screenWidth, 300)
banner.setAdSize(stickySize)
banner.loadAd(AdRequest.Builder("R-M-XXXXX-YY").build())

SDK 7

void loadAd() {
    BannerAdView banner = findViewById(R.id.banner);
    BannerAdSize stickySize = BannerAdSize.stickySize(this, screenWidth);
    BannerAdSize inlineSizeSize = BannerAdSize.inlineSize(this, screenWidth, 300);
    banner.setAdUnitId("R-M-XXXXX-YY");
    banner.setAdSize(stickySize);
    banner.loadAd(new AdRequest.Builder().build());
}

SDK 8

void loadAd() {
    BannerAdView banner = findViewById(R.id.banner);
    BannerAdSize stickySize = BannerAdSize.sticky(this, screenWidth);
    BannerAdSize inlineSizeSize = BannerAdSize.inline(this, screenWidth, 300);
    banner.setAdSize(stickySize);
    banner.loadAd(new AdRequest.Builder("R-M-XXXXX-YY").build());
}

5. AdInfo API 变更

获取广告素材信息的方式由方法改为属性,并移除了部分附加字段:

方法/字段

状态

BannerAdView, InsterstitialAd, RewardedAd, AppOpenAd, NativeAd

info

已移除。请使用 adInfo

adAttributes

已移除。请使用 adInfo

NativeAd

creativeId

已移除。请使用 Creative.creativeId

campaignId

已移除。请使用 Creative.campaignId

AdInfo

data

已移除

adSize

已移除

creatives

已添加

extraData

已添加

partnerText

已添加

Creative

placeId

已添加

offerId

已添加

示例

SDK 7

// BannerAdView
val extraData = banner.info
val adUnitId = banner.adInfo.adUnitId
val extraData2 = banner.adInfo.data
val width = banner.adInfo.adSize?.width
val height = banner.adInfo.adSize?.height
val creativeId = banner.adInfo.creatives.first().creativeId
val campaignId = banner.adInfo.creatives.first().campaignId
val creativeId2 = banner.adAttributes.first().bannerId
val campaignId2 = banner.adAttributes.first().campaignId
val placeId = banner.adAttributes.first().placeId

// InterstitialAd, RewardedAd, AppOpenAd
val extraData = fullscreenAd.info.data
val adUnitId = fullscreenAd.info.adUnitId
val width = fullscreenAd.info.adSize?.width
val height = fullscreenAd.info.adSize?.height
val creativeId = fullscreenAd.info.creatives.first().creativeId
val campaignId = fullscreenAd.info.creatives.first().campaignId
val creativeId2 = fullscreenAd.adAttributes.first().bannerId
val campaignId2 = fullscreenAd.adAttributes.first().campaignId
val placeId = fullscreenAd.adAttributes.first().placeId

// NativeAd
val extraData = nativeAd.info
val creativeId = nativeAd.creativeId
val campaignId = nativeAd.campaignId
val creativeId2 = nativeAd.adAttributes?.bannerId
val campaignId2 = nativeAd.adAttributes?.campaignId
val placeId = nativeAd.adAttributes?.placeId

SDK 8

// BannerAdView
val extraData = banner.adInfo.extraData
val partnerText = banner.adInfo.partnerText
val creativeId = banner.adInfo.creatives.first().creativeId
val campaignId = banner.adInfo.creatives.first().campaignId
val placeId = banner.adInfo.creatives.first().placeId
val adUnitId = banner.adInfo.adUnitId
val width = banner.adSize?.width
val height = banner.adSize?.height

// InterstitialAd, RewardedAd, AppOpenAd
val extraData = fullscreenAd.adInfo.extraData
val partnerText = fullscreenAd.adInfo.partnerText
val adUnitId = fullscreenAd.adInfo.adUnitId
val creativeId = fullscreenAd.adInfo.creatives.first().creativeId
val campaignId = fullscreenAd.adInfo.creatives.first().campaignId
val placeId = fullscreenAd.adInfo.creatives.first().placeId

// NativeAd
val extraData = nativeAd.adInfo.extraData
val partnerText = nativeAd.adInfo.partnerText
val adUnitId = nativeAd.adInfo.adUnitId
val creativeId = nativeAd.adInfo.creatives.first().creativeId
val campaignId = nativeAd.adInfo.creatives.first().campaignId
val placeId = nativeAd.adInfo.creatives.first().placeId

SDK 7

// BannerAdView
String extraData = banner.getInfo();
String adUnitId = banner.getAdInfo().getAdUnitId();
String extraData2 = banner.getAdInfo().getData();
int width = banner.getAdInfo().getAdSize().getWidth();
int height = banner.getAdInfo().getAdSize().getHeight();
String creativeId = banner.getAdInfo().getCreatives().get(0).getCreativeId();
String campaignId = banner.getAdInfo().getCreatives().get(0).getCampaignId();
String creativeId2 = banner.getAdAttributes().get(0).getBannerId();
String campaignId2 = banner.getAdAttributes().get(0).getCampaignId();
String placeId = banner.getAdAttributes().get(0).getPlaceId();

// InterstitialAd, RewardedAD, AppOpenAd
String extraData = fullscreenAd.getInfo().getData();
String adUnitId = fullscreenAd.getInfo().getAdUnitId();
int width = fullscreenAd.getInfo().getAdSize().getWidth();
int height = fullscreenAd.getInfo().getAdSize().getHeight();
String creativeId = fullscreenAd.getInfo().getCreatives().get(0).getCreativeId();
String campaignId = fullscreenAd.getInfo().getCreatives().get(0).getCampaignId();
String creativeId2 = fullscreenAd.getAdAttributes().get(0).getBannerId();
String campaignId2 = fullscreenAd.getAdAttributes().get(0).getCampaignId();
String placeId = fullscreenAd.getAdAttributes().get(0).getPlaceId();

// NativeAd
String extraData = nativeAd.getInfo();
String creativeId = nativeAd.getCreativeId();
String campaignId = nativeAd.getCampaignId();
String creativeId2 = nativeAd.getAdAttributes().getBannerId();
String campaignId2 = nativeAd.getAdAttributes().getCampaignId();
String placeId = nativeAd.getAdAttributes().getPlaceId();

SDK 8

// BannerAdView
String extraData = banner.getAdInfo().getExtraData();
String partnerText = banner.getAdInfo().getPartnerText();
String creativeId = banner.getAdInfo().getCreatives().get(0).getCreativeId();
String campaignId = banner.getAdInfo().getCreatives().get(0).getCampaignId();
String placeId = banner.getAdInfo().getCreatives().get(0).getPlaceId();
String adUnitId = banner.getAdInfo().getAdUnitId();
int width = banner.getAdSize().getWidth();
int height = banner.getAdSize().getHeight();

// InterstitialAd, RewardedAd, AppOpenAd
String extraData = fullscreenAd.getAdInfo().getExtraData();
String partnerText = fullscreenAd.getAdInfo().getPartnerText();
String adUnitId = fullscreenAd.getAdInfo().getAdUnitId();
String creativeId = fullscreenAd.getAdInfo().getCreatives().get(0).getCreativeId();
String campaignId = fullscreenAd.getAdInfo().getCreatives().get(0).getCampaignId();
String placeId = fullscreenAd.getAdInfo().getCreatives().get(0).getPlaceId();

// NativeAd
String extraData = nativeAd.getAdInfo().getExtraData();
String partnerText = nativeAd.getAdInfo().getPartnerText();
String adUnitId = nativeAd.getAdInfo().getAdUnitId();
String creativeId = nativeAd.getAdInfo().getCreatives().get(0).getCreativeId();
String campaignId = nativeAd.getAdInfo().getCreatives().get(0).getCampaignId();
String placeId = nativeAd.getAdInfo().getCreatives().get(0).getPlaceId();

6. 原生广告 API 变更

  • NativeAd.bindNativeAdSliderAd.bindSliderAd() 现返回绑定结果 AdBindingResult,不再抛出异常。
  • warning 字段类型由 String? 改为 NativeAdWarning?。为符合广告法规要求,新类除 warning 素材文案外,还包含该素材相对整则广告面积所需的最小占比(百分比)。
  • NativeAdMedia 新增 hasVideo 字段,表示当前广告是否包含视频素材。

状态

AdBindingResult

已添加

NativeAdWarning

已添加

方法/字段

状态

NativeAd

bindNativeAd

增加返回值 AdBindingResult。方法不再抛出异常。

SliderAd

bindSliderAd

增加返回值 AdBindingResult。方法不再抛出异常。

NativeAdAssets

warning

类型变更:StringNativeAdWarning

NativeAdWarning

value

已添加

minimumRequiredArea

已添加

NativeAdMedia

hasVideo

已添加

示例

SDK 7

val warning = nativeAd.adAssets.warning
try {
    nativeAd.bindNativeAd(binder)
} catch (e: NativeAdException) {
    val message = e.message
}

SDK 8

val warningAsset = nativeAd.adAssets.warning
val warning = warningAsset?.value
val warningMinArea = warningAsset?.minimumRequiredArea
val hasVideo = nativeAd.adAssets.media?.hasVideo
when (val result = nativeAd.bindNativeAd(binder)) {
    is AdBindingResult.Failure -> {
        val missingAssetName = result.missingAssetName
        val message = result.exception.message
    }
    AdBindingResult.Success -> Unit
}

SDK 7

void bindAd(NativeAd nativeAd) {
    String warning = nativeAd.getAdAssets().getWarning();
    try {
        nativeAd.bindNativeAd(binder);
    } catch (NativeAdException e) {
        String message = e.getMessage();
    }
}

SDK 8

void bindNativeAd(NativeAd nativeAd) {
    NativeAdWarning warningAsset = nativeAd.getAdAssets().getWarning();
    String warning = warningAsset.getValue();
    float minWarningArea = warningAsset.getMinimumRequiredArea();
    boolean hasVideo = nativeAd.getAdAssets().getMedia().getHasVideo();
    AdBindingResult result = nativeAd.bindNativeAd(binder);
    if (result instanceof AdBindingResult.Failure) {
        String missingAssetName = ((AdBindingResult.Failure) result).getMissingAssetName();
        String message = ((AdBindingResult.Failure) result).getException().getMessage();
    }
}

6.1 原生广告模板 API

基于模板集成原生广告的工具已移除。请使用标准原生广告组件完成集成。

状态

NativeBannerView

已移除

SizeConstraint

HorizontalOffset

NativeTemplateAppearance

TextAppearance

BannerAppearance

ButtonAppearance

RatingAppearance

7. 广告对象部分回调的移除

  • 已移除接口 ClosableBannerAdEventListenerClosableNativeAdEventListener
  • 已移除方法 onLeftApplicationonReturnToApplication

状态

ClosableBannerAdEventListener

已移除

ClosableNativeAdEventListener

已移除

方法

状态

BannerAdEventListener, NativeAdEventListener

onLeftApplication

已移除

onReturnToApplication

已移除

示例

SDK 7

bannerAd?.setBannerAdEventListener(object : ClosableBannerAdEventListener {
    override fun closeBannerAd() { /* ... */ }
    override fun onAdClicked() { /* ... */ }
    override fun onAdFailedToLoad(error: AdRequestError) { /* ... */ }
    override fun onAdLoaded() { /* ... */ }
    override fun onImpression(impressionData: ImpressionData?) { /* ... */ }
    override fun onLeftApplication() { /* ... */ }
    override fun onReturnedToApplication() { /* ... */ }
})

SDK 8

// ClosableAdEventListener as well as
// onAdClosed callback are not available anymore
bannerAdView?.setBannerAdEventListener(object : BannerAdEventListener {
    override fun onAdClicked() { /* ... */ }
    override fun onAdFailedToLoad(error: AdRequestError) { /* ... */ }
    override fun onAdLoaded() { /* ... */ }
    override fun onImpression(impressionData: ImpressionData?) { /* ... */ }
})

SDK 7

void setEventListener(BannerAdView bannerView) {
    bannerView.setBannerAdEventListener(
    new ClosableBannerAdEventListener() {
            @Override
            public void closeBannerAd() { /* ... */ }
            @Override
            public void onAdLoaded() { /* ... */ }
            @Override
            public void onAdFailedToLoad(@NotNull AdRequestError adRequestError) { /* ... */ }
            @Override
            public void onAdClicked() { /* ... */ }
            @Override
            public void onLeftApplication() { /* ... */ }
            @Override
            public void onReturnedToApplication() { /* ... */ }
            @Override
            public void onImpression(@Nullable ImpressionData impressionData) { /* ... */ }
        }
    );
}

SDK 8

void setEventListener(BannerAdView bannerView) {
// ClosableAdEventListener as well as
// onAdClosed callback are not available anymore
    bannerView.setBannerAdEventListener(
        new BannerAdEventListener() {
            @Override
            public void onAdLoaded() { /* ... */ }
            @Override
            public void onAdFailedToLoad(@NotNull AdRequestError adRequestError) { /* ... */ }
            @Override
            public void onAdClicked() { /* ... */ }
            @Override
            public void onImpression(@Nullable ImpressionData impressionData) { /* ... */ }
        }
    );
}

8. SDK 主入口类变更

  • SDK 主类已重命名为 YandexAds
  • 部分隐私相关设置方法已重命名。

状态

YandexAds

已添加

MobileAds

已移除。请使用 YandexAds

方法

状态

MobileAds

setAgeRestrictedUser(Boolean)

已移除。请使用 YandexAds.setAgeRestricted(Boolean)

setLocationConsent(Boolean)

已移除。请使用 YandexAds.setLocationTracking(Boolean)

YandexAds

setAgeRestricted(Boolean)

已添加

setLocationTracking(Boolean)

已添加

示例

SDK 7

import com.yandex.mobile.ads.common.MobileAds

MobileAds.setUserConsent(true)
MobileAds.setAgeRestrictedUser(false)
MobileAds.setLocationConsent(true)
MobileAds.initialize(context) { /* ... */ }
MobileAds.enableDebugErrorIndicator(true)
MobileAds.enableLogging(true)
MobileAds.setAppAdAnalyticsReporting(true)
MobileAds.showDebugPanel(this)
MobileAds.libraryVersion

SDK 8

import com.yandex.mobile.ads.common.YandexAds

YandexAds.setUserConsent(true)
YandexAds.setAgeRestricted(false)
YandexAds.setLocationTracking(true)
YandexAds.initialize(context) { /* ... */ }
YandexAds.enableDebugErrorIndicator(true)
YandexAds.enableLogging(true)
YandexAds.setAppAdAnalyticsReporting(true)
YandexAds.showDebugPanel(this)
YandexAds.libraryVersion

SDK 7

import com.yandex.mobile.ads.common.MobileAds;

void initSdk() {
    MobileAds.setUserConsent(true);
    MobileAds.setAgeRestrictedUser(false);
    MobileAds.setLocationConsent(true);
    MobileAds.initialize(this, () -> { /* ... */ });
    MobileAds.getLibraryVersion();
    MobileAds.enableDebugErrorIndicator(true);
    MobileAds.enableLogging(true);
    MobileAds.setAppAdAnalyticsReporting(true);
    MobileAds.showDebugPanel(this);
}

SDK 8

import com.yandex.mobile.ads.common.YandexAds;

void initSdk() {
    YandexAds.setUserConsent(true);
    YandexAds.setAgeRestricted(false);
    YandexAds.setLocationTracking(true);
    YandexAds.initialize(this, () -> { /* ... */ });
    YandexAds.getLibraryVersion();
    YandexAds.enableDebugErrorIndicator(true);
    YandexAds.enableLogging(true);
    YandexAds.setAppAdAnalyticsReporting(true);
    YandexAds.showDebugPanel(this);
}

Instream API 变更

1. 包名与依赖结构

主要类名已调整,以匹配新的 SDK 结构。

状态

com.yandex.mobile.ads.instream.InstreamAdBinder

已移至 com.yandex.mobile.ads.instream.binder.InstreamAdBinder

com.yandex.mobile.ads.instream.InstreamAdRequestConfiguration

已重命名为 com.yandex.mobile.ads.instream.InstreamAdRequest

com.yandex.mobile.ads.instream.InstreamAdBreak

已重命名为 com.yandex.mobile.ads.instream.adbreak.AdBreakData

com.yandex.mobile.ads.instream.inroll.Inroll, com.yandex.mobile.ads.instream.pauseroll.Pauseroll

已由 com.yandex.mobile.ads.instream.adbreak.InstreamAdBreak 取代

示例

SDK 7

import com.yandex.mobile.ads.instream.InstreamAdBinder
import com.yandex.mobile.ads.instream.InstreamAdRequestConfiguration
import com.yandex.mobile.ads.instream.InstreamAdBreak
import com.yandex.mobile.ads.instream.inroll.Inroll
import com.yandex.mobile.ads.instream.pauseroll.Pauseroll

SDK 8

import com.yandex.mobile.ads.instream.binder.InstreamAdBinder
import com.yandex.mobile.ads.instream.InstreamAdRequest
import com.yandex.mobile.ads.instream.adbreak.AdBreakData
import com.yandex.mobile.ads.instream.adbreak.InstreamAdBreak

SDK 7

import com.yandex.mobile.ads.instream.InstreamAdBinder;
import com.yandex.mobile.ads.instream.InstreamAdRequestConfiguration;
import com.yandex.mobile.ads.instream.InstreamAdBreak;
import com.yandex.mobile.ads.instream.inroll.Inroll;
import com.yandex.mobile.ads.instream.pauseroll.Pauseroll;

SDK 8

import com.yandex.mobile.ads.instream.binder.InstreamAdBinder;
import com.yandex.mobile.ads.instream.InstreamAdRequest;
import com.yandex.mobile.ads.instream.adbreak.AdBreakData;
import com.yandex.mobile.ads.instream.adbreak.InstreamAdBreak;

2. AdRequest 变更

InstreamAdRequestConfiguration 已重命名为 InstreamAdRequest

状态

InstreamAdRequestConfiguration

已移除。请使用 InstreamAdRequest

InstreamAdRequest

已添加

InstreamAdBreakRequest

已添加

示例

SDK 7

val loader = InstreamAdLoader(this)
val config = InstreamAdRequestConfiguration.Builder("XXXXXX").build()
loader.loadInstreamAd(this, config)

SDK 8

val loader = InstreamAdLoader(this)
val config = InstreamAdRequest.Builder("XXXXXX").build()
loader.loadInstreamAd(this, config)

SDK 7

void loadAd() {
    InstreamAdLoader loader = new InstreamAdLoader(this);
    InstreamAdRequestConfiguration config = new InstreamAdRequestConfiguration.Builder("XXXXXX").build();
    loader.loadInstreamAd(this, config);
}

SDK 8

void loadAd() {
    InstreamAdLoader loader = new InstreamAdLoader(this);
    InstreamAdRequest config = new InstreamAdRequest.Builder("XXXXXX").build();
    loader.loadInstreamAd(this, config);
}

3. 广告加载 API 变更

  • 注册回调与加载广告的方法已调整。
  • 新增 InstreamAdBreakLoader 用于加载广告插播。
  • onInstreamAdFailedToLoad 签名变更:由字符串参数 reason 改为 InstreamAdRequestError 对象。

状态

InstreamAdBreakLoadListener

已添加

InstreamAdBreakLoader

已添加

方法

状态

InstreamAdLoader

setInstreamAdLoadListener(InstreamAdLoadListener)

已移除。请将 InstreamAdLoadListener 传入 loadAd 方法参数。

loadAd(InstreamAdRequestConfiguration)

已移除。请将 InstreamAdLoadListener 传入 loadAd 方法参数。

loadAd(InstreamAdRequest, InstreamAdLoadListener)

已移除。请将 InstreamAdLoadListener 传入 loadAd 方法参数。

InstreamAdLoadListener

onInstreamAdFailedToLoad(String)

已移除。请使用 onInstreamAdFailedToLoad(InstreamAdRequestError)

onInstreamAdFailedToLoad(InstreamAdRequestError)

已添加

InstreamAdBreakLoader

loadAd(InstreamAdBreakRequest, InstreamAdBreakLoadListener)

已添加

示例

SDK 7

val instreamAdLoader = InstreamAdLoader(this)
instreamAdLoader.setInstreamAdLoadListener(object : InstreamAdLoadListener {
    override fun onInstreamAdLoaded(instreamAd: InstreamAd) {
        // ...
    }

    override fun onInstreamAdFailedToLoad(reason: String) {
        println("Instream ad failed to load: $reason")
    }
})
val config = InstreamAdRequestConfiguration.Builder("XXXXXX").build()
instreamAdLoader.loadInstreamAd(this, config)

SDK 8

val instreamAdLoader = InstreamAdLoader(this)
val config = InstreamAdRequest.Builder("XXXXXX").build()
instreamAdLoader.loadAd(config, object : InstreamAdLoadListener {
    override fun onInstreamAdLoaded(instreamAd: InstreamAd) {
        // ...
    }

    override fun onInstreamAdFailedToLoad(error: InstreamAdRequestError) {
        println("Instream ad failed to load: ${error.reason}")
    }
})

SDK 7

void loadInstreamAd() {
    InstreamAdLoader instreamAdLoader = new InstreamAdLoader(this);
    instreamAdLoader.setInstreamAdLoadListener(new InstreamAdLoadListener() {
        @Override
        public void onInstreamAdLoaded(InstreamAd instreamAd) {
            // ...
        }

        @Override
        public void onInstreamAdFailedToLoad(String reason) {
            System.out.println("Instream ad failed to load: " + reason);
        }
    });
    InstreamAdRequestConfiguration config = new InstreamAdRequestConfiguration.Builder("XXXXXX").build();
    instreamAdLoader.loadInstreamAd(this, config);
}

SDK 8

void loadInstreamAd() {
    InstreamAdLoader instreamAdLoader = new InstreamAdLoader(this);
    InstreamAdRequest config = new InstreamAdRequest.Builder("XXXXXX").build();
    instreamAdLoader.loadAd(config, new InstreamAdLoadListener() {
        @Override
        public void onInstreamAdLoaded(InstreamAd instreamAd) {
            // ...
        }

        @Override
        public void onInstreamAdFailedToLoad(InstreamAdRequestError error) {
            System.out.println("Instream ad failed to load: " + error.getReason());
        }
    });
}

3.1 Kotlin 协程支持

InstreamAdLoaderInstreamAdBreakLoader 新增用于加载广告的 suspend 重载。

方法

状态

InstreamAdLoader

suspend fun loadAd(InstreamAdRequest): InstreamAdLoadResult

已添加

InstreamAdBreakLoader

suspend fun loadAd(InstreamAdBreakRequest): InstreamAdBreakLoadResult

已添加

示例

lifecycleScope.launch {
    val instreamAdLoader = InstreamAdLoader(applicationContext)
    when(val result = instreamAdLoader.loadAd(InstreamAdRequest.Builder("XXXXXX").build())) {
        is InstreamAdLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is InstreamAdLoadResult.Success -> TODO("Show instream ad: ${result.ad}")
    }

    val adBreakLoader = InstreamAdBreakLoader(applicationContext)
    when (val result = adBreakLoader.loadAd(InstreamAdBreakRequest.Builder("XXXXXX", "YY").build())) {
        is InstreamAdBreakLoadResult.Failure -> TODO("Handle error: ${result.error.description}")
        is InstreamAdBreakLoadResult.Success -> TODO("Show adBreak : ${result.adBreak}")
    }
}

4. In-roll 与 Pause-roll

  • 广告插播管理逻辑更加灵活。
  • 已移除专用队列提供者 InrollQueueProviderPauserollQueueProvider;所有插播可直接从 InstreamAd 获取并按类型筛选。

若通过 InstreamAdBinder 自动渲染,请仅从 instreamAdBreaks 集合中选取类型为 INROLLPAUSEROLL 的插播。

状态

InrollQueueProvider

已移除。请使用 instreamAd.instreamAdBreaks 并按 InstreamAdBreakType.INROLL 过滤

PauserollQueueProvider

已移除。请使用 instreamAd.instreamAdBreaks 并按 InstreamAdBreakType.PAUSEROLL 过滤

示例

SDK 7

// 1. Get In-roll queue from loaded ad
val inrollQueueProvider = InrollQueueProvider(context, instreamAd)
val instreamAdBreakQueue = inrollQueueProvider.queue

// 2. Prepare specific ad break
val currentInroll = instreamAdBreakQueue.poll()
currentInroll?.setListener(object : InstreamAdBreakEventListener {
    override fun onInstreamAdBreakPrepared() {
        // 3. Show prepared ad break
        currentInroll.play(instreamAdView)
    }
    // ... other listener methods
})
currentInroll?.prepare(instreamAdPlayer)

SDK 8

// 1. Get list of all ad breaks directly from InstreamAd
val inrolls = instreamAd.instreamAdBreaks.filter {
    it.adBreakData.type == InstreamAdBreakType.INROLL
}

// 2. Prepare and show
val inrollIndex = 0 // Manage the index yourself
val currentInroll = inrolls.getOrNull(inrollIndex)

currentInroll?.setListener(object : InstreamAdBreakEventListener {
    override fun onInstreamAdBreakPrepared() {
        // 3. Show prepared ad break
        currentInroll.play(instreamAdView)
    }
})
currentInroll?.prepare(instreamAdPlayer)

SDK 7

void loadAdBreak() {
// 1. Get In-roll queue from loaded ad
    InrollQueueProvider inrollQueueProvider = new InrollQueueProvider(context, instreamAd);
    Queue<Inroll> instreamAdBreakQueue = inrollQueueProvider.getQueue();

// 2. Prepare specific ad break
    Inroll currentInroll = instreamAdBreakQueue.poll();
    if (currentInroll != null) {
        currentInroll.setListener(new InstreamAdBreakEventListener() {
            @Override
            public void onInstreamAdBreakPrepared() {
                // 3. Show prepared ad break
                currentInroll.play(instreamAdView);
            }
            // ... other listener methods
        });
        currentInroll.prepare(instreamAdPlayer);
    }
}

SDK 8

void loadAdBreak() {
    // 1. Get list of all ad breaks directly from InstreamAd
    List<InstreamAdBreak> inrolls = new ArrayList<>();
    for (InstreamAdBreak adBreak : instreamAd.getInstreamAdBreaks()) {
        if (adBreak.getAdBreakData().getType() == InstreamAdBreakType.INROLL) {
            inrolls.add(adBreak);
        }
    }

    // 2. Prepare and show
    int inrollIndex = 0; // Manage the index yourself
    InstreamAdBreak currentInroll = inrollIndex < inrolls.size() ? inrolls.get(inrollIndex) : null;

    if (currentInroll != null) {
        currentInroll.setListener(new InstreamAdBreakEventListener() {
            @Override
            public void onInstreamAdBreakPrepared() {
                // 3. Show prepared ad break
                currentInroll.play(instreamAdView);
            }
        });
        currentInroll.prepare(instreamAdPlayer);
    }
}

5. 默认播放器

用于渲染视频的播放器参数现为可选。传入 null 时,由 SDK 完全接管视频渲染。

方法

状态

InstreamAdBinder

构造函数

instreamAdPlayer 参数已为可选,可传入 null

InstreamAdBreak

prepare(instreamAdPlayer)

已移除。请使用无参 prepare()

prepare()

已添加

示例

SDK 7

// Automatic launch (InstreamAdBinder)
val instreamAdBinder = InstreamAdBinder(
    context,
    instreamAd,
    instreamAdPlayer, // Player was required
    contentPlayer
)

// Manual launch (InstreamAdBreak)
val adBreak: InstreamAdBreak
adBreak.prepare(instreamAdPlayer)

SDK 8

// Automatic launch (InstreamAdBinder)
val instreamAdBinder = InstreamAdBinder(
    context,
    instreamAd,
    null, // Pass null to use default player
    contentPlayer
)

// Manual launch (InstreamAdBreak)
val adBreak: InstreamAdBreak
adBreak.prepare()

SDK 7

void showAd() {
    // Automatic launch (InstreamAdBinder)
    InstreamAdBinder instreamAdBinder = new InstreamAdBinder(
            context,
            instreamAd,
            instreamAdPlayer, // Player was required
            contentPlayer
    );

    // Manual launch (InstreamAdBreak)
    InstreamAdBreak adBreak;
    adBreak.prepare(instreamAdPlayer);
}

SDK 8

void showAd() {
    // Automatic launch (InstreamAdBinder)
    InstreamAdBinder instreamAdBinder = new InstreamAdBinder(
            context,
            instreamAd,
            null, // Pass null to use default player
            contentPlayer
    );

    // Manual launch (InstreamAdBreak)
    InstreamAdBreak adBreak;
    adBreak.prepare();
}

6. InstreamAdPlayer 接口变更

InstreamAdPlayer 已更新:新增 supportedMimeTypes 属性以优化视频格式选择,并新增 bindPlayerView 方法,用于在视频上方正确定位广告元素。

方法

状态

InstreamAdPlayer

supportedMimeTypes: List<String>

已添加。便于 SDK 选择合适视频格式(例如 DASH 替代 MP4)。

bindPlayerView(container: FrameLayout)

已添加。需将 videoPlayerView 铺满传入的容器。

示例

SDK 7

class InstreamAdPlayerImpl : InstreamAdPlayer {
    // ... methods (prepareAd, playAd, pauseAd, etc.)
}

SDK 8

class InstreamAdPlayerImpl : InstreamAdPlayer {

    // 1. List of MIME types supported by the player
    override val supportedMimeTypes: List<String>
        get() = listOf(InstreamAdMimeTypes.MP4, InstreamAdMimeTypes.WEBM)

    // 2. Place videoPlayerView inside container on the entire space
    override fun bindPlayerView(container: FrameLayout) {
        container.addView(playerView)
    }

    // ... other methods (prepareAd, playAd, pauseAd, etc.)
}

SDK 7

public class InstreamAdPlayerImpl implements InstreamAdPlayer {
    // ... methods (prepareAd, playAd, pauseAd, etc.)
}

SDK 8

public class InstreamAdPlayerImpl implements InstreamAdPlayer {

    // 1. List of MIME types supported by the player
    @Override
    public List<String> getSupportedMimeTypes() {
        return Arrays.asList(InstreamAdMimeTypes.MP4, InstreamAdMimeTypes.WEBM);
    }

    // 2. Place videoPlayerView inside container on the entire space
    @Override
    public void bindPlayerView(FrameLayout container) {
        container.addView(playerView);
    }

    // ... other methods (prepareAd, playAd, pauseAd, etc.)
}

广告联盟(mediation)API 变更

1. 传递联盟网络数据的新 API

对联盟适配器而言,适配器标识已拆分为独立方法。

状态

AdapterIdentity

已添加

方法

状态

YandexAds

setAdapterIdentity(AdapterIdentity)

已添加。请在 YandexAds.initialize 之前调用,替代在广告请求中附加适配器参数。

示例

SDK 7

YandexAds.initialize(context, listener)

val parameters = mapOf(
    "adapter_network_name" to "AdNetwork",
    "adapter_network_version" to "1.2.3",
    "adapter_version" to "1.0.0"
)

val adRequest = AdRequest.Builder()
    .setParameters(parameters)
    .build()

bannerAd.loadAd(adRequest)

SDK 8

val identity = AdapterIdentity("AdNetwork", "1.0.0", "1.2.3")
YandexAds.setAdapterIdentity(identity) // Call before initialize()
YandexAds.initialize(context, listener)

// No need to pass additional parameters
val adRequest = AdRequest.Builder("R-M-XXXXX-YY").build()
bannerAd.loadAd(adRequest)

SDK 7

void loadAd() {
    Map<String, String> parameters = new HashMap<>();
    parameters.put("adapter_network_name", "AdNetwork");
    parameters.put("adapter_network_version", "1.2.3");
    parameters.put("adapter_version", "1.0.0");

    AdRequest adRequest = new AdRequest.Builder()
            .setParameters(parameters)
            .build();

    bannerView.loadAd(adRequest);
}

SDK 8

void loadAd() {
    AdapterIdentity adapterIdentity = new AdapterIdentity("AdNetwork", "1.0.0", "1.2.3");
    YandexAds.setAdapterIdentity(adapterIdentity); // Call before initialize()
    YandexAds.initialize(this, () -> { /* ... */ });

    // No need to pass additional parameters
    AdRequest adRequest = new AdRequest.Builder("R-M-XXXXX-YY").build();

    bannerView.loadAd(adRequest);
}

2. BidderTokenRequest 重命名与简化

  • BidderTokenLoader 新增构造函数;loadBidderToken 由静态方法改为实例方法。
  • BidderTokenRequestConfiguration 已重命名为 BidderTokenRequest 并调整结构。
  • 创建实例时,请使用工厂方法 bannerinterstitialrewardedappOpenAdnative,替代 Builder(AdType)

状态

BidderTokenRequestConfiguration

已移除。请使用 BidderTokenRequest

BidderTokenRequestConfiguration.Builder

已移除。请使用 BidderTokenRequest 中的工厂方法

BidderTokenRequest

已添加

构造函数/方法

状态

BidderTokenLoader

BidderTokenLoader(Context)

已添加构造函数

loadBidderToken

已变更:由静态方法改为 BidderTokenLoader 实例方法

BidderTokenRequestConfiguration.Builder

setBannerAdSize(BannerAdSize)

已移除。请将 BannerAdSize 传入 BidderTokenRequest.banner(BannerAdSize)

setParameters(Map<String, String>)

已移除。请将参数传入工厂方法参数

BidderTokenRequest

banner(BannerAdSize)

已添加

banner(BannerAdSize, AdTargeting)

已添加

banner(BannerAdSize, AdTargeting, Map<String, String>)

已添加

interstitial()

已添加

interstitial(AdTargeting)

已添加

interstitial(AdTargeting, Map<String, String>)

已添加

rewarded()

已添加

rewarded(AdTargeting)

已添加

rewarded(AdTargeting, Map<String, String>)

已添加

appOpenAd()

已添加

appOpenAd(AdTargeting)

已添加

appOpenAd(AdTargeting, Map<String, String>)

已添加

native()

已添加

native(AdTargeting)

已添加

native(AdTargeting, Map<String, String>)

已添加

示例

SDK 7

void loadToken() {
    Map<String, String> parameters = new HashMap<>();
    parameters.put("a", "b");

    BidderTokenRequestConfiguration bidderTokenRequest =
            new BidderTokenRequestConfiguration.Builder(AdType.INTERSTITIAL)
                    .setBannerAdSize(BannerAdSize.stickySize(this, screenWidth))
                    .setParameters(parameters)
                    .build();

    BidderTokenLoader.loadBidderToken(
            this,
            bidderTokenRequest,
            new BidderTokenLoadListener() { /* ... */ }
    );
}

SDK 8

void loadToken() {
    Map<String, String> parameters = new HashMap<>();
    parameters.put("a", "b");

    BidderTokenLoader bidderTokenLoader = new BidderTokenLoader(this);
    bidderTokenLoader.loadBidderToken(
            BidderTokenRequest.banner(BannerAdSize.inline(this, screenWidth), null, parameters),
            new BidderTokenLoadListener() { /* ... */ }
    );

    bidderTokenLoader.loadBidderToken(BidderTokenRequest.interstitial(),
            new BidderTokenLoadListener() { /* ... */ }
    );
}

Jetpack Compose 集成

已支持通过 Jetpack Compose 集成。示例见 Jetpack Compose 章节:

使用 AI 工具迁移

为简化从 SDK 7.x 迁移到 8.x,可使用内置迁移技能的 AI 助手。

使用方法

  1. 加载技能

    迁移技能位于 GitHub Yandex Ads SDK Android

    • 适用于 Claude Desktop

      将技能文件夹复制到代理的 skills 目录,例如:

      cp -r Skills/migrate-yandex-ads-sdk-from-7-to-8 .claude/skills/
      
    • 适用于 Cursor IDE

      将技能文件夹复制到项目,并通过 @ 引用 SKILL.md,例如:

      @migrate-yandex-ads-sdk-from-7-to-8/SKILL.md
      
    • 其他方式

      SKILL.md 及相关文件内容粘贴到 AI 对话中(可能超出消息长度限制)。

  2. 使用提示词

    加载技能后,在对话中使用如下提示:

    将我的项目从 Yandex Mobile Ads SDK 7.x 迁移到 8.x
    

请务必仔细审阅 AI 生成的变更。

技能有助于 AI 正确执行任务,但您仍需自行验证代理引入的每一处修改。AI 可能出错,代码必须经过人工复核。

环境要求

  • Gradle:7.0 及以上
  • Android Gradle Plugin:8.3.2 及以上
  • Android SDK:21(Android 5.0)及以上
  • Kotlin:1.9.0 及以上
  • Java:8 及以上