Когда происходит показ рекламы, GMA Next-Gen SDK предоставляет данные о доходах от рекламы, связанных с этим показом. Вы можете использовать эти данные для расчета пожизненной ценности пользователя или передавать данные в другие соответствующие системы.
Это руководство призвано помочь вам внедрить сбор данных о доходах от рекламы на уровне показов в вашем Android-приложении.
Предварительные требования
- Убедитесь, что в пользовательском интерфейсе AdMob включена функция учета дохода от рекламы на уровне показов .
- Настройте GMA Next-Gen SDK .
Прежде чем начать получать доход от рекламы в виде показов, необходимо внедрить как минимум один рекламный формат:
Обработчик платных событий
Для каждого формата рекламы существует функция обратного вызова события onAdPaid . В течение жизненного цикла рекламного события GMA Next-Gen SDK отслеживает события показов и вызывает обработчик с полученным значением.
В следующем примере обрабатывается платная реклама с вознаграждением:
Котлин
ad.adEventCallback =
object : RewardedAdEventCallback {
override fun onAdPaid(adValue: AdValue) {
// Send the impression-level ad revenue information to your
// preferred analytics server directly within this callback.
// Extract the impression-level ad revenue data.
val valueMicros = adValue.valueMicros
val currencyCode = adValue.currencyCode
val precisionType = adValue.precisionType
val loadedAdSourceResponseInfo = ad.getResponseInfo().loadedAdSourceResponseInfo
val adSourceName = loadedAdSourceResponseInfo?.name
val adSourceId = loadedAdSourceResponseInfo?.id
val adSourceInstanceName = loadedAdSourceResponseInfo?.instanceName
val adSourceInstanceId = loadedAdSourceResponseInfo?.instanceId
val extras = ad.getResponseInfo().responseExtras
val mediationGroupName = extras.getString("mediation_group_name")
val mediationABTestName = extras.getString("mediation_ab_test_name")
val mediationABTestVariant = extras.getString("mediation_ab_test_variant")
}
}
Java
ad.setAdEventCallback(
new RewardedAdEventCallback() {
@Override
public void onAdPaid(@NonNull AdValue value) {
// Send the impression-level ad revenue information to your preferred
// analytics server directly within this callback.
// Extract the impression-level ad revenue data.
long valueMicros = value.getValueMicros();
String currencyCode = value.getCurrencyCode();
PrecisionType precisionType = value.getPrecisionType();
AdSourceResponseInfo loadedAdSourceResponseInfo =
ad.getResponseInfo().getLoadedAdSourceResponseInfo();
String adSourceName = loadedAdSourceResponseInfo.getName();
String adSourceId = loadedAdSourceResponseInfo.getId();
String adSourceInstanceName = loadedAdSourceResponseInfo.getInstanceName();
String adSourceInstanceId = loadedAdSourceResponseInfo.getInstanceId();
Bundle extras = ad.getResponseInfo().getResponseExtras();
String mediationGroupName = extras.getString("mediation_group_name");
String mediationABTestName = extras.getString("mediation_ab_test_name");
String mediationABTestVariant = extras.getString("mediation_ab_test_variant");
}
});
Укажите имя источника рекламного объявления для пользовательского события.
Для пользовательских источников рекламы свойство AdSourceResponseInfo.name возвращает имя источника рекламы Custom event . Если используется несколько пользовательских событий, имя источника рекламы недостаточно детализировано, чтобы различать их. Чтобы найти конкретное пользовательское событие, выполните следующие действия:
- Получите свойство
AdSourceResponseInfo.name. - Укажите уникальное название источника рекламы.
В следующем примере задается уникальное имя источника рекламы для пользовательского события:
Котлин
private fun getUniqueAdSourceName(loadedAdapterResponseInfo: AdSourceResponseInfo): String {
var adSourceName = loadedAdapterResponseInfo.name
if (adSourceName == "Custom Event") {
if (
loadedAdapterResponseInfo.adapterClassName ==
"com.google.ads.mediation.sample.customevent.SampleCustomEvent"
) {
adSourceName = "Sample Ad Network (Custom Event)"
}
}
return adSourceName
}Java
private String getUniqueAdSourceName(@NonNull AdSourceResponseInfo loadedAdapterResponseInfo) {
String adSourceName = loadedAdapterResponseInfo.getName();
if (adSourceName.equals("Custom Event")) {
if (loadedAdapterResponseInfo
.getAdapterClassName()
.equals("com.google.ads.mediation.sample.customevent.SampleCustomEvent")) {
adSourceName = "Sample Ad Network (Custom Event)";
}
}
return adSourceName;
}Для получения дополнительной информации об источнике объявления-победителя см. раздел «Получение информации об отклике на объявление» .
Интеграция с партнерами по атрибуции приложений (AAP)
Подробную информацию о передаче данных о доходах от рекламы на аналитические платформы см. в руководстве для партнеров:
| Партнерский SDK |
|---|
| Регулировать |
| AppsFlyer |
| Единственное число |
| Тенджин |
В руководстве для партнеров может отсутствовать информация о GMA Next-Gen SDK .
Следующие примеры демонстрируют, как отправлять данные о доходах на уровне показов партнерам AAP с помощью GMA Next-Gen SDK :
Регулировать
Java
rewardedAd.setAdEventCallback(
new RewardedAdEventCallback() {
@Override
public void onAdPaid(@NonNull AdValue value) {
// Send ad revenue info to Adjust.
AdjustAdRevenue adRevenue = new AdjustAdRevenue("admob_sdk");
adRevenue.setRevenue(value.getValueMicros() / 1000000.0, value.getCurrencyCode());
if (rewardedAd.getResponseInfo().getLoadedAdSourceResponseInfo() != null) {
adRevenue.setAdRevenueNetwork(
rewardedAd.getResponseInfo().getLoadedAdSourceResponseInfo().getName());
}
Adjust.trackAdRevenue(adRevenue);
}
});Котлин
rewardedAd.adEventCallback =
object : RewardedAdEventCallback {
override fun onAdPaid(value: AdValue) {
// Send ad revenue info to Adjust.
val adRevenue = AdjustAdRevenue("admob_sdk")
adRevenue.setRevenue(value.valueMicros / 1000000.0, value.currencyCode)
val loadedAdSourceResponseInfo = rewardedAd.getResponseInfo().loadedAdSourceResponseInfo
loadedAdSourceResponseInfo?.let { adRevenue.setAdRevenueNetwork(it.name) }
Adjust.trackAdRevenue(adRevenue)
}
}AppsFlyer
Java
rewardedAd.setAdEventCallback(
new RewardedAdEventCallback() {
@Override
public void onAdPaid(@NonNull AdValue value) {
long valueMicros = value.getValueMicros();
String currencyCode = value.getCurrencyCode();
AFAdRevenueData adRevenueData =
new AFAdRevenueData(
"AdMob Mediation", // monetizationNetwork
MediationNetwork.GOOGLE_ADMOB, // mediationNetwork
currencyCode, // currencyIso4217Code
(double) valueMicros // revenue
);
Map<String, Object> additionalParameters = new HashMap<>();
additionalParameters.put(COUNTRY, "US");
additionalParameters.put(AD_UNIT, AD_UNIT_ID);
additionalParameters.put(AD_TYPE, AdFormat.REWARDED);
AppsFlyerLib.getInstance().logAdRevenue(adRevenueData, additionalParameters);
}
});Котлин
rewardedAd.adEventCallback =
object : RewardedAdEventCallback {
override fun onAdPaid(value: AdValue) {
val valueMicros = value.valueMicros
val currencyCode = value.currencyCode
val adRevenueData =
AFAdRevenueData(
"AdMob Mediation", // monetizationNetwork
MediationNetwork.GOOGLE_ADMOB, // mediationNetwork
currencyCode, // currencyIso4217Code
valueMicros.toDouble(), // revenue
)
val additionalParameters: MutableMap<String?, Any?> = HashMap()
additionalParameters[COUNTRY] = "US"
additionalParameters[AD_UNIT] = AD_UNIT_ID
additionalParameters[AD_TYPE] = AdFormat.REWARDED
appsflyer.logAdRevenue(adRevenueData, additionalParameters)
}
}Единственное число
Java
rewardedAd.setAdEventCallback(
new RewardedAdEventCallback() {
@Override
public void onAdPaid(@NonNull AdValue value) {
// Convert revenue from micros to standard units.
double revenue = value.getValueMicros() / 1000000.0;
String currency = value.getCurrencyCode();
// Validate ad revenue data before sending.
if (revenue > 0 && !currency.isEmpty()) {
SingularAdData adData = new SingularAdData("AdMob", currency, revenue);
Singular.adRevenue(adData);
}
}
});Котлин
rewardedAd.adEventCallback =
object : RewardedAdEventCallback {
override fun onAdPaid(value: AdValue) {
// Convert revenue from micros to standard units.
val revenue = value.valueMicros / 1000000.0
val currency = value.currencyCode
// Validate ad revenue data before sending.
if (revenue > 0 && currency.isNotEmpty()) {
val adData = SingularAdData("AdMob", currency, revenue)
Singular.adRevenue(adData)
}
}
}Тенджин
Для интеграции с GMA Next-Gen SDK необходимо использовать JSON-объект. В следующем примере данные о доходах на уровне показов отправляются в Tenjin с помощью JSON-объекта:
Java
rewardedAd.setAdEventCallback(
new RewardedAdEventCallback() {
@Override
public void onAdPaid(@NonNull AdValue value) {
ResponseInfo responseInfo = rewardedAd.getResponseInfo();
// Extract the impression-level ad revenue data.
long valueMicros = value.getValueMicros();
String currencyCode = value.getCurrencyCode();
PrecisionType precisionType = value.getPrecisionType();
JSONObject json = new JSONObject();
try {
json.put("ad_unit_id", AD_UNIT_ID);
json.put("currency_code", currencyCode);
json.put("response_id", responseInfo.getResponseId());
json.put("value_micros", valueMicros);
if (responseInfo.getLoadedAdSourceResponseInfo() != null) {
json.put(
"mediation_adapter_class_name",
responseInfo.getLoadedAdSourceResponseInfo().getAdapterClassName());
}
json.put("precision_type", precisionType);
tenjinInstance.eventAdImpressionAdMob(json);
} catch (JSONException e) {
// Handle error.
}
}
});Котлин
rewardedAd.adEventCallback =
object : RewardedAdEventCallback {
override fun onAdPaid(value: AdValue) {
val responseInfo = rewardedAd.getResponseInfo()
// Extract the impression-level ad revenue data.
val valueMicros = value.valueMicros
val currencyCode = value.currencyCode
val precisionType = value.precisionType
val json = JSONObject()
try {
json.put("ad_unit_id", AD_UNIT_ID)
json.put("currency_code", currencyCode)
json.put("response_id", responseInfo.responseId)
json.put("value_micros", valueMicros)
responseInfo.loadedAdSourceResponseInfo?.let {
json.put("mediation_adapter_class_name", it.adapterClassName)
}
json.put("precision_type", precisionType)
tenjinInstance.eventAdImpressionAdMob(json)
} catch (_: JSONException) {
// Handle error.
}
}
}Передовые методы внедрения
- Настройте обработчик событий сразу после создания или получения доступа к рекламному объекту, и обязательно до показа рекламы. Это гарантирует, что вы не пропустите ни одного вызова обработчика событий платной рекламы.
- Отправляйте информацию о доходах от рекламы на уровне показов на ваш предпочтительный аналитический сервер немедленно в момент вызова функции обратного вызова для платного события. Это гарантирует, что вы случайно не потеряете какие-либо обратные вызовы и избежите несоответствий в данных.
AdValue
AdValue — это класс, представляющий денежную стоимость, полученную за рекламу, включая код валюты этой стоимости и тип точности, закодированные следующим образом.
| PrecisionType | Описание |
|---|---|
UNKNOWN | Неизвестное значение объявления. Оно возвращается, когда включена функция отслеживания LTV, но данных недостаточно. |
ESTIMATED | Оценка стоимости рекламы на основе агрегированных данных. |
PUBLISHER_PROVIDED | Издатель предоставлял рекламную ценность, например, ручную настройку CPM в группе по урегулированию споров. |
PRECISE | Точная сумма, уплаченная за это объявление. |
В случае использования AdMob Mediation, AdMob пытается предоставить ESTIMATED значение для оптимизированных источников рекламы. Для неоптимизированных источников рекламы или в случаях, когда недостаточно агрегированных данных для получения осмысленной оценки, возвращается значение PUBLISHER_PROVIDED .
Тестовые показы из рекламных источников, участвующих в аукционе.
После того, как в результате тестового запроса для источника рекламы, участвующего в торгах, произойдет событие, приносящее доход от рекламы на уровне показов, вы получите только следующие значения:
-
UNKNOWN: указывает тип точности.
-
0: указывает на стоимость рекламы.
Ранее тип точности мог быть иным значением, отличным от UNKNOWN , а значение объявления — больше 0 .
Подробную информацию об отправке запроса на тестовую рекламу см. в разделе «Включение тестовых устройств» .