# Android 展示级收入集成

> 集成展示量级别收入(ILR) SDK API 可捕获每个展示量的实时广告收入数据，从而实现详细的 Monetization 见解并与第三方数据分析服务平台无缝集成。

## 先决条件##prerequisites

确保已将 LevelPlay SDK 9.5.0+ 正确集成到应用程序中。请参阅 [Android 集成核对](/grow/levelplay/sdk/android/integration-checklists.md)表。

## 实现 LevelPlayImpressionDataListener##implement-the-levelplayimpressiondatalistener

LevelPlay SDK 会触发回传以通知您显示的广告。LevelPlayImpressionDataListener 是一个可选监听器，可以实现该监听器来接收展示数据。此监听器将为您提供有关所有广告单位的信息，并且您可以使用展示量收入来识别不同的广告服务。

要将 LevelPlayImpressionDataListener 添加到应用程序中，请在初始化 LevelPlay SDK 之前声明监听器，以避免任何信息丢失。

```java
public static void addImpressionDataListener(LevelPlayImpressionDataListener listener)
```

LevelPlay SDK 将通知您的监听器与展示数据相关的成功回传：

```java
public static void addImpressionDataListener(ImpressionDataListener listener){
 
   /**
   成功显示广告并记录展示数据时调用 
   **/
  
}
```

### 设置印象监听器##set-up-the-impression-listener

实现`LevelPlayImpressionDataListener`并通过调用 `setImpressionDataListener()` 在每个广告对象上进行设置。在构建广告对象之后以及加载或显示广告对象之前立即附加广告对象，这样就不会错过展示。每个监听器仅接收其所挂的实例的展示。

**Java**

```java
import com.unity3d.mediation.impression.LevelPlayImpressionData;
import com.unity3d.mediation.impression.LevelPlayImpressionDataListener;

// Interstitial
LevelPlayInterstitialAd interstitialAd = new LevelPlayInterstitialAd("adUnitId");
interstitialAd.setImpressionDataListener(new LevelPlayImpressionDataListener() {
    @Override
    public void onImpressionSuccess(LevelPlayImpressionData impressionData) {
        Log.d(TAG, "Interstitial onImpressionSuccess: " + impressionData);
    }
});

// Rewarded
LevelPlayRewardedAd rewardedAd = new LevelPlayRewardedAd("adUnitId");
rewardedAd.setImpressionDataListener(new LevelPlayImpressionDataListener() {
    @Override
    public void onImpressionSuccess(LevelPlayImpressionData impressionData) {
        Log.d(TAG, "Rewarded onImpressionSuccess: " + impressionData);
    }
});

// Banner
LevelPlayBannerAdView bannerAdView = new LevelPlayBannerAdView(this, "adUnitId");
bannerAdView.setImpressionDataListener(new LevelPlayImpressionDataListener() {
    @Override
    public void onImpressionSuccess(LevelPlayImpressionData impressionData) {
        Log.d(TAG, "Banner onImpressionSuccess: " + impressionData);
    }
});
```

**科特林**

```kotlin
import com.unity3d.mediation.impression.LevelPlayImpressionData
import com.unity3d.mediation.impression.LevelPlayImpressionDataListener

// Interstitial
val interstitialAd = LevelPlayInterstitialAd("adUnitId")
interstitialAd.setImpressionDataListener(object :LevelPlayImpressionDataListener {
    override fun onImpressionSuccess(impressionData:LevelPlayImpressionData) {
        Log.d(TAG, "Interstitial onImpressionSuccess: $impressionData")
    }
})

// Rewarded
val rewardedAd = LevelPlayRewardedAd("adUnitId")
rewardAd.setImpressionDataListener(object :LevelPlayImpressionDataListener {
    override fun onImpressionSuccess(impressionData:LevelPlayImpressionData) {
        Log.d(TAG, "Rewarded onImpressionSuccess: $impressionData")
    }
})

// Banner
val bannerAdView = LevelPlayBannerAdView(this, "adUnitId")
bannerAdView.setImpressionDataListener(object :LevelPlayImpressionDataListener {
    override fun onImpressionSuccess(impressionData:LevelPlayImpressionData) {
        Log.d(TAG, "Banner onImpressionSuccess: $impressionData")
    }
})
```

### 删除展示数据监听器##remove-impression-data-listener

要停止接收广告对象的展示数据，请将`null`通道给 `setImpressionDataListener()`。

**Java**

```java
interstitialAd.setImpressionDataListener(null);
rewardedAd.setImpressionDataListener(null);
bannerAdView.setImpressionDataListener(null);
```

**科特林**

```kotlin
interstitialAd.setImpressionDataListener(null)
rewardedAd.setImpressionDataListener(null)
bannerAdView.setImpressionDataListener(null)
```

> **Note:**
>
> 从 LevelPlay SDK 7.1.0 版本开始，setImpressionDataListener 已弃用并替换为 addImpressionDataListener。

## 集成 ILR 数据##integrate-the-ilr-data

实现 LevelPlayImpressionDataListener 后，您可以将展示数据发送到您自己的专有 BI 工具和 DWH，或者将其与第三方工具集成。

> **Note:**
>
> 返回的数据可能包括 null 值。在分配数据之前添加保护以避免潜在的崩溃。

您可以单独引用每个字段，也可以使用 allData 方法获取所有信息：

```java
public void onImpressionSuccess (LevelPlayImpressionData impressionData)
{
  Double  revenue = impressionData.getRevenue();
  String  adNetwork = impressionData.getAdNetwork();
  JSONObject allData =  impressionData.getAllData(); 
}
```

有关可用 ILR 数据的完整列表，包括字段描述和类型，请参阅 [Impression Level Revenue SDK API](/grow/levelplay/platform/fundamentals/impression-level-revenue-sdk-api.md)。

以下示例展示了如何将展示级别收入 SDK API 数据与 Google Firebase 数据分析服务集成。您可以按原样使用，或进行任何必要的更改，以便与第三方报告工具或您自己的专有优化工具和数据库集成。

> **Note:**
>
> 确保内部参数不为 null。

```java
/** 
成功显示广告并记录展示数据时调用 
**/ 
@Override
public void onImpressionSuccess(LevelPlayImpressionData impressionData) { 
 // The onImpressionSuccess will be reported when the rewarded video and interstitial ad is opened.
 // For banners, the impression is reported on load success.Log.d(TAG, "onImpressionSuccess" + impressionData); 
   if (impressionData != null) 
   { 
       Bundle bundle = new Bundle(); 
       bundle.putString(FirebaseAnalytics.Param.AD_PLATFORM, "LevelPlay");  
       bundle.putString(FirebaseAnalytics.Param.AD_SOURCE, impressionData.getAdNetwork());  
       bundle.putString(FirebaseAnalytics.Param.AD_FORMAT, impressionData.getAdFormat());   
       bundle.putString(FirebaseAnalytics.Param.AD_UNIT_NAME, impressionData.getInstanceName());
       bundle.putString(FirebaseAnalytics.Param.CURRENCY, "USD");  
       bundle.putDouble(FirebaseAnalytics.Param.VALUE, java.util.Objects.quirNonNullElse(impressionData.getRevenue(), 0.0)); // 为 null 值添加保护
       
       mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.AD_IMPRESSION, bundle);
   
   } 
}
```
