---
metadata:
  - name: generator
    content: Diplodoc Platform v5.50.6
alternate:
  - https://ads.yandex.com/helpcenter/en/dev/android/feed-ad.md
  - https://ads.yandex.com/helpcenter/ru/dev/android/feed-ad.md
  - https://ads.yandex.com/helpcenter/zh/dev/android/feed-ad.md
---
> **Documentation Index:** Fetch the complete configuration index at https://ads.yandex.com/helpcenter/zh/llms.txt

# 广告信息流

<!-- source: zh/dev/_includes/feed-ad.md -->
广告信息流是由一系列广告组成的单元。信息流可以作为应用的主要内容添加，或者添加到现有内容之后。信息流可能包含数十条广告，而这些广告会按顺序加载（一次加载多个广告）。
<!-- endsource: zh/dev/_includes/feed-ad.md -->

本指南介绍了将广告信息流集成到 Android 应用的过程。除了代码示例和说明之外，它还包含特定格式的建议以及指向其他资源的链接。

{% cut "外观" %}

<img src="https://yastatic.net/s3/doc-binary/src/docs/support/mobile-ads/zh/monetization/_images/feed-zh-ex.png" width="200">

{% endcut %}

## 前提条件 {#pre}

<!-- source: zh/dev/_includes/pre-android-feed.md -->
1. 按照 [快速入门](https://ads.yandex.com/helpcenter/zh/dev/android/quick-start.md) 中描述的 SDK 集成步骤进行操作。
2. 首先，您需要 [初始化](https://ads.yandex.com/helpcenter/zh/dev/android/quick-start.md#init) 广告 SDK。
3. 确保您使用的是 [最新版本的 Yandex Mobile Ads SDK](https://ads.yandex.com/helpcenter/zh/dev/android/changelog-android.md)。
<!-- endsource: zh/dev/_includes/pre-android-feed.md -->

## 实施 {#implement}

集成广告信息流的关键步骤：

* 使用 `FeedAdAppearance` 对象配置广告信息流的外观。
* 使用 `AdRequest` 对象创建并设置请求配置。
* 创建名为 `FeedAd` 的广告信息流对象，并为广告加载回调方法注册一个 `FeedAdLoadListener`。
* 通过调用 `feedAd.preloadAd()` 尽快预加载您的广告。
* 创建名为 `FeedAdAdapter` 的适配器，并为事件回调方法注册一个 `FeedAdEventListener`。
* 在 `RecyclerView.adapter` 设置 `FeedAdAdapter`。

### 关键步骤

1. 创建名为 `FeedAdAppearance` 的广告信息流的外观配置对象。

   可用的参数如下：

   * `cardWidth`（必需）：以 dp（密度无关像素）为单位设置所投放广告的宽度。根据屏幕宽度减去所需的侧边距来计算参数值。
   * `cardCornerRadius`：以 dp（密度无关像素）为单位设置所投放广告的圆角半径。

   {% list tabs %}

   - Kotlin

      ```kotlin
      val feedMarginDp = 24
      val screenWidthDp = (screenWidth / resources.displayMetrics.density).roundToInt()
      val cardWidthDp = screenWidthDp - 2 * feedMarginDp
      val cardCornerRadiusDp = 16.0

      val feedAdAppearance = FeedAdAppearance.Builder(cardWidthDp)
                .setCardCornerRadius(cardCornerRadiusDp)
                .build()
      ```

   - Java

      ```java
      DisplayMetrics displayMetrics = getResources().getDisplayMetrics();

      int feedMarginDp = 24;
      int screenWidthDp = Math.round(displayMetrics.widthPixels / displayMetrics.density);
      val cardWidthDp = screenWidthDp - 2 * feedMarginDp;
      double cardCornerRadius = 16.0;

      FeedAdAppearance feedAdAppearance = new FeedAdAppearance.Builder(cardWidth)
          .setCardCornerRadius(cardCornerRadius)
          .build();
      ```

   {% endlist %}

2. 创建并配置 `AdRequest` 对象。

   您将需要来自 Yandex Advertising Network 界面 (`AD_UNIT_ID`) 的广告单元 ID。

   您可以通过在广告请求的 `Builder` 方法中提供有关用户兴趣、页面上下文、位置和其他附加数据的信息来扩展广告请求参数。在广告请求中添加额外的上下文信息可以极大地提高广告质量。请参阅[广告定位](https://ads.yandex.com/helpcenter/zh/dev/android/target.md)版块了解更多信息。

   {% list tabs %}

   - Kotlin

      ```kotlin
      val AD_UNIT_ID = "R-M-XXXXXX-Y" // 为了进行调试，您可以使用 "demo-feed-yandex"
      val adRequest = AdRequest.Builder(AD_UNIT_ID).build()
      ```

   - Java

      ```java
      String AD_UNIT_ID = "R-M-XXXXXX-Y"; // 为了进行调试，您可以使用 "demo-feed-yandex"
      AdRequest adRequest = new AdRequest.Builder(AD_UNIT_ID).build();
      ```

   {% endlist %}

3. 创建名为 `FeedAd` 的广告信息流对象，并为广告加载回调方法注册一个 `FeedAdLoadListener`。

   {% list tabs %}

   - Kotlin

      ```kotlin
      val feedAdLoadListener = object : FeedAdLoadListener {

          override fun onAdLoaded() {
      	       // 当收到额外的广告以供展示时调用
          }

          override fun onAdFailedToLoad(error: AdRequestError) {
      	       // 当额外的广告请求失败时调用
          }
      }

      val feedAd = FeedAd.Builder(context, adRequest, feedAdAppearance).build()
      feedAd.loadListener = feedAdLoadListener
      ```

   - Java

      ```java
      FeedAdLoadListener feedAdLoadListener = new FeedAdLoadListener() {
          @Override
          public void onAdLoaded() {
              // 当收到额外的广告以供展示时调用
          }

          @Override
          public void onAdFailedToLoad(AdRequestError error) {
              // 当额外的广告请求失败时调用
          }
      };

      FeedAd feedAd = new FeedAd.Builder(context, adRequest, feedAdAppearance).build();
      feedAd.setLoadListener(feedAdLoadListener);
      ```

   {% endlist %}

4. 使用 `FeedAd` 对象的 `preloadAd()` 方法尽快预加载您的广告。广告信息流预加载完成后，就会调用其中一个 `FeedAdLoadListener` 方法。

   {% list tabs %}

   - Kotlin

      ```kotlin
      feedAd.preloadAd()
      ```

   - Java

      ```java
      feedAd.preloadAd();
      ```

   {% endlist %}

5. 创建名为 `FeedAdAdapter` 的适配器，并为事件回调方法注册一个 `FeedAdEventListener`。

   {% list tabs %}

   - Kotlin

      ```kotlin
      val feedAdEventListener = object : FeedAdEventListener {

          override fun onAdClicked() {
      	       // 当用户点击广告时调用
          }

          override fun onAdImpression(impressionData: ImpressionData?) {
      	       // 计为广告展示时调用
          }
      }

      val feedAdAdapter = FeedAdAdapter(feedAd)
      feedAdAdapter.eventListener = feedAdEventListener
      ```

   - Java

      ```java
      FeedAdEventListener feedAdEventListener = new FeedAdEventListener() {
          @Override
          public void onAdClicked() {
              // 当用户点击广告时调用
          }

          @Override
          public void onAdImpression(ImpressionData impressionData) {
              // 计为广告展示时调用
          }
      };

      FeedAdAdapter feedAdAdapter = new FeedAdAdapter(feedAd);
      feedAdAdapter.setEventListener(feedAdEventListener);
      ```

   {% endlist %}

6. 展示广告信息流。

   {% list tabs %}

   - 作为主列表

      在 `RecyclerView.adapter` 中设置已创建的 `FeedAdAdapter`。

      * Kotlin

         ```kotlin
         binding.feedRecyclerView.layoutManager = LinearLayoutManager(context)
         binding.feedRecyclerView.adapter = feedAdAdapter
         ```
      * Java

         ```java
         binding.feedRecyclerView.setLayoutManager(new LinearLayoutManager(context));
         binding.feedRecyclerView.setAdapter(feedAdAdapter);
         ```

   - 除了现有列表之外

      要将广告信息流添加到现有的 `RecyclerView` 列表，请使用 [ConcatAdapter](https://developer.android.com/reference/androidx/recyclerview/widget/ConcatAdapter)。

      [ConcatAdapter](https://developer.android.com/reference/androidx/recyclerview/widget/ConcatAdapter) 允许您将现有列表的 `RecyclerView` 适配器与广告信息流适配器进行合并。向 [ConcatAdapter](https://developer.android.com/reference/androidx/recyclerview/widget/ConcatAdapter) 构建器传递参数的顺序决定了显示各个适配器列表的顺序。

      * Kotlin

         ```kotlin
         val screenContentDataAdapter = ScreenContentDataAdapter() // 您自己实施的 RecyclerView.Adapter
         val concatAdapter = ConcatAdapter(listOf(screenContentDataAdapter, feedAdAdapter))

         binding.feedRecyclerView.layoutManager = LinearLayoutManager(context)
         binding.feedRecyclerView.adapter = concatAdapter
         ```
      * Java

         ```java
         ScreenContentDataAdapter screenContentDataAdapter = new ScreenContentDataAdapter(); // 您自己实施的 RecyclerView.Adapter
         ConcatAdapter concatAdapter = new ConcatAdapter(Arrays.asList(screenContentDataAdapter, feedAdAdapter));

         binding.feedRecyclerView.setLayoutManager(new LinearLayoutManager(context));
         binding.feedRecyclerView.setAdapter(concatAdapter);
         ```

   {% endlist %}

## 广告信息流集成的具体细节{#features}

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

### 测试广告信息流集成 {#test}

<!-- source: zh/dev/_includes/test-android-feed-ad.md -->
### 使用演示广告单元进行广告测试 {#demo-blocks}

使用测试广告来检查您的广告信息流集成和应用本身。

为了确保每个广告请求都返回测试广告，我们创建了一个特殊的演示广告版位 ID，旨在帮助您测试广告的集成情况。

演示 adUnitId：`demo-feed-yandex`。

{% note warning %}

在商店中发布您的应用程序之前，确保将演示版位 ID 替换为您在 Yandex Advertising Network 界面中获得的真实 ID。

{% endnote %}

您可以在 [用于测试的演示广告单元](https://ads.yandex.com/helpcenter/zh/dev/android/demo-blocks.md) 中找到所有可用的演示广告版位 ID 列表。

### 测试广告集成 {#test-int}

您可以使用 SDK 的内置分析器检查广告信息流是否正确集成。

该工具检查广告是否已正确启用，并向日志输出详细报告。
要查看报告，请在 [Logcat](https://developer.android.com/studio/command-line/logcat) 中使用“YandexAds”关键字进行搜索，Logcat 是一款用于调试 Android 应用的工具。

```bash
adb logcat -v brief '*:S YandexAds'
```

如果集成成功，则返回以下消息：
```bash
adb logcat -v brief '*:S YandexAds'
mobileads$ adb logcat -v brief '*:S YandexAds'
I/YandexAds(13719): [Integration] Ad type feed was integrated successfully
```

如果存在任何广告集成问题，您将获得详细的问题报告和故障排除建议。
<!-- endsource: zh/dev/_includes/test-android-feed-ad.md -->

