Помимо стандартных форматов нативных объявлений, издатели Менеджера рекламы могут создавать собственные форматы, задавая списки объектов. Такие форматы называются специальными форматами нативных объявлений и могут использоваться с зарезервированными объявлениями. Это позволяет издателям передавать в свои приложения любые структурированные данные. Такие объявления представлены объектом NativeCustomFormatAd.
Как загружать специальные форматы нативных объявлений
В этом руководстве рассказывается, как загружать и показывать собственные форматы нативных объявлений.
Как загрузить специальное нативное объявление
Как и нативные объявления, специальные форматы нативных объявлений загружаются с помощью класса AdLoader:
Java
AdLoader adLoader = new AdLoader.Builder(this, "/21775744923/example/native") .forCustomFormatAd("12387226", new NativeCustomFormatAd.OnCustomFormatAdLoadedListener() { @Override public void onCustomFormatAdLoaded(NativeCustomFormatAd ad) { // Show the custom format and record an impression. } }, new NativeCustomFormatAd.OnCustomClickListener() { @Override public void onCustomClick(NativeCustomFormatAd ad, String s) { // Handle the click action } }) .forCustomFormatAd("12406343", new NativeCustomFormatAd.OnCustomFormatAdLoadedListener() { @Override public void onCustomFormatAdLoaded(NativeCustomFormatAd ad) { // Show the custom format and record an impression. } }, new NativeCustomFormatAd.OnCustomClickListener() { @Override public void onCustomClick(NativeCustomFormatAd ad, String s) { // Handle the click action } }) .build();
Kotlin
val adLoader = AdLoader.Builder(this, "/21775744923/example/native") .forCustomFormatAd( "12387226", { customFormatAd -> // Show the custom format and record an impression. }, { customFormatAd, s -> // Handle the click action }) .forCustomFormatAd( "12406343", { customFormatAd -> // Show the custom format and record an impression. }, { customFormatAd, s -> // Handle the click action }) .build()
Метод forCustomFormatAd настраивает AdLoader на запрос собственных форматов нативных объявлений. Вы можете вызывать этот метод несколько раз для разных идентификаторов специальных форматов. Метод принимает следующие параметры:
- Идентификатор специального формата нативного объявления, который должен запросить
AdLoader. Каждому специальному формату нативного объявления присваивается идентификатор. Этот параметр указывает, какой формат должен запрашиватьAdLoader. - Функция
OnCustomFormatAdLoadedListenerдля вызова при успешной загрузке объявления. - Необязательный
OnCustomClickListenerдля вызова, когда пользователь нажимает на объявление. Подробнее об этом слушателе рассказывается в разделе "Обработка кликов и показов".
Поскольку один рекламный блок может быть настроен на показ креативов разных форматов, функцию forCustomFormatAd можно вызывать несколько раз с уникальными идентификаторами формата, чтобы подготовить загрузчик объявлений к нескольким возможным форматам специальных нативных объявлений.
Идентификатор специального формата нативного объявления
Идентификатор формата, используемый для определения специального формата нативного объявления, можно найти в интерфейсе Менеджера рекламы в разделе Нативные раскрывающегося списка Показ:

Идентификатор каждого специального формата нативного объявления указан рядом с его названием. Нажав на одно из названий, вы перейдете на экран с подробной информацией о полях формата:

Здесь можно добавлять, изменять и удалять отдельные поля. Запишите название каждого объекта. Название – это ключ, который используется для получения данных для каждого объекта при показе нативного объявления в вашем собственном формате.
Как показывать специальные форматы нативных объявлений
Специальные форматы нативных объявлений отличаются от системных тем, что издатели могут сами определять список объектов, из которых состоит объявление. Поэтому процесс показа такого объявления отличается от показа объявлений системных форматов:
- Текстовые объекты и объекты изображений доступны через методы получения
getText()иgetImage(), которые принимают имя поля в качестве параметра. - Поскольку для регистрации в Google нет специального класса
ViewGroup, вам нужно вручную регистрировать показы и клики. - В пользовательском нативном объявлении есть медиаконтент
null, если в нем нет видеообъекта.
Вот пример функции, которая показывает NativeCustomFormatAd:
Java
public void displayCustomFormatAd (ViewGroup parent, NativeCustomFormatAd customFormatAd) { // Inflate a layout and add it to the parent ViewGroup. LayoutInflater inflater = (LayoutInflater) parent.getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View adView = inflater.inflate(R.layout.custom_format_ad, parent); // Locate the TextView that will hold the value for "Headline" and // set its text. TextView myHeadlineView = (TextView) adView.findViewById(R.id.headline); myHeadlineView.setText(customFormatAd.getText("Headline")); // Locate the ImageView that will hold the value for "MainImage" and // set its drawable. Button myMainImageView = (ImageView) adView.findViewById(R.id.main_image); myMainImageView.setImageDrawable( customFormatAd.getImage("MainImage").getDrawable()); ... // Continue locating views and displaying assets until finished. ... }
Kotlin
public fun displayCustomFormatAd (parent: ViewGroup, customFormatAd: NativeCustomFormatAd) { val adView = layoutInflater .inflate(R.layout.ad_simple_custom_format, null) val myHeadlineView = adView.findViewById<TextView>(R.id.headline) myHeadlineView.setText(customFormatAd.getText("Headline")); // Locate the ImageView that will hold the value for "MainImage" and // set its drawable. val myMainImageView = adView.findViewById(R.id.main_image); myMainImageView.setImageDrawable( customFormatAd.getImage("MainImage").drawable); ... // Continue locating views and displaying assets until finished. ... }
Нативные видеообъявления для специальных форматов нативных объявлений
При создании собственного формата вы можете сделать его подходящим для видео.
В приложении можно использовать NativeCustomFormatAd.getMediaContent(), чтобы получать медиаконтент. Затем вызовите метод setMediaContent(), чтобы задать медиаконтент в представлении медиа.
Если в объявлении есть медиаконтент null, запланируйте показ объявления без видео.
В приведенном ниже примере проверяется, есть ли в объявлении видеоконтент, и если его нет, то вместо него показывается изображение:
Java
// Called when a custom native ad loads. @Override public void onCustomFormatAdLoaded(final NativeCustomFormatAd ad) { MediaContent mediaContent = ad.getMediaContent(); // Assumes you have a FrameLayout in your view hierarchy with the ID media_placeholder. FrameLayout mediaPlaceholder = (FrameLayout) findViewById(R.id.media_placeholder); // Apps can check the MediaContent's hasVideoContent property to determine if the // NativeCustomFormatAd has a video asset. if (mediaContent != null && mediaContent.hasVideoContent()) { MediaView mediaView = new MediaView(mediaPlaceholder.getContext()); mediaView.setMediaContent(mediaContent); mediaPlaceholder.addView(mediaView); // Create a new VideoLifecycleCallbacks object and pass it to the VideoController. The // VideoController will call methods on this object when events occur in the video // lifecycle. VideoController vc = mediaContent.getVideoController(); vc.setVideoLifecycleCallbacks( new VideoController.VideoLifecycleCallbacks() { @Override public void onVideoEnd() { // Publishers should allow native ads to complete video playback before // refreshing or replacing them with another ad in the same UI location. super.onVideoEnd(); } }); } else { ImageView mainImage = new ImageView(this); mainImage.setAdjustViewBounds(true); mainImage.setImageDrawable(ad.getImage("MainImage").getDrawable()); mediaPlaceholder.addView(mainImage); mainImage.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View view) { ad.performClick("MainImage"); } }); } }
Kotlin
// Called when a custom native ad loads. NativeCustomFormatAd.OnCustomFormatAdLoadedListener { ad -> val mediaContent = ad.mediaContent // Apps can check the MediaContent's hasVideoContent property to determine if the // NativeCustomFormatAd has a video asset. if (mediaContent != null && mediaContent.hasVideoContent()) { val mediaView = MediaView(mediaPlaceholder.getContest()) mediaView.mediaContent = mediaContent val videoController = mediaContent.videoController // Create a new VideoLifecycleCallbacks object and pass it to the VideoController. The // VideoController will call methods on this object when events occur in the video // lifecycle. if (videoController != null) { videoController.videoLifecycleCallbacks = object : VideoController.VideoLifecycleCallbacks() { override fun onVideoEnd() { // Publishers should allow native ads to complete video playback before refreshing // or replacing them with another ad in the same UI location. super.onVideoEnd() } } } } else { val mainImage = ImageView(this) mainImage.adjustViewBounds = true mainImage.setImageDrawable(ad.getImage("MainImage")?.drawable) mainImage.setOnClickListener { ad.performClick("MainImage") } customTemplateBinding.simplecustomMediaPlaceholder.addView(mainImage) } }
Скачайте пример специальной отрисовки Менеджера рекламы, чтобы посмотреть, как работает нативное видеообъявление.
Подробнее о том, как настроить видео в нативном объявлении, рассказывается в разделе Видеообъявления.
Как добавить значок "Выбор рекламы"
В рамках поддержки закона ЕС "О цифровых услугах" (DSA) объявления с резервированием, которые показываются в Европейской экономической зоне (ЕЭЗ), должны содержать значок "Выбор рекламы" и ссылку на страницу "Об этой рекламе" в Google. В нативных объявлениях, которые появляются в приложениях, должен показываться значок "Выбор рекламы". Ответственность за это несете вы. Настоятельно рекомендуем вам отображать значок "Выбор рекламы" и устанавливать для него прослушиватель кликов при отрисовке основных объектов объявлений.
В следующем примере предполагается, что в иерархии View определен элемент <ImageView />, в котором будет размещен логотип "Выбор рекламы".
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android">
<ImageView
android:id="@+id/adChoices"
android:layout_width="15dp"
android:layout_height="15dp"
android:adjustViewBounds="true"
android:contentDescription="AdChoices icon." />
</LinearLayout>
В приведенных ниже примерах показано, как добавить значок "Выбор рекламы" и настроить поведение при клике.
Java
private AdSimpleCustomTemplateBinding customTemplateBinding;
private void populateAdView(final NativeCustomFormatAd nativeCustomFormatAd) {
// Render the AdChoices icon.
String adChoicesKey = NativeAdAssetNames.ASSET_ADCHOICES_CONTAINER_VIEW;
NativeAd.Image adChoicesAsset = nativeCustomFormatAd.getImage(adChoicesKey);
if (adChoicesAsset == null) {
customTemplateBinding.adChoices.setVisibility(View.GONE);
} else {
customTemplateBinding.adChoices.setVisibility(View.VISIBLE);
customTemplateBinding.adChoices.setImageDrawable(adChoicesAsset.getDrawable());
// Enable clicks on AdChoices.
customTemplateBinding.adChoices.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
nativeCustomFormatAd.performClick(adChoicesKey);
}
});
}
...
}
Kotlin
private lateinit var customTemplateBinding: AdSimpleCustomTemplateBinding
private fun populateAdView(nativeCustomFormatAd: NativeCustomFormatAd) {
// Render the AdChoices icon.
val adChoicesKey = NativeAdAssetNames.ASSET_ADCHOICES_CONTAINER_VIEW
val adChoicesAsset = nativeCustomFormatAd.getImage(adChoicesKey)
if (adChoicesAsset == null) {
customTemplateBinding.adChoices.visibility = View.GONE
} else {
customTemplateBinding.adChoices.setImageDrawable(adChoicesAsset.drawable)
customTemplateBinding.adChoices.visibility = View.VISIBLE
// Enable clicks on AdChoices.
customTemplateBinding.adChoices.setOnClickListener {
nativeCustomFormatAd.performClick(adChoicesKey)
}
}
...
}
Регистрировать показы и сообщать о кликах
Ваше приложение должно регистрировать показы и сообщать о кликах в Google Mobile Ads SDK (Legacy).
Запись показов
Чтобы зарегистрировать показ специального нативного объявления, вызовите метод recordImpression() объявления:
myCustomFormatAd.recordImpression();
Если ваше приложение случайно вызовет метод дважды для одного и того же объявления, SDK автоматически предотвратит регистрацию дублирующегося показа для одного запроса.
Как сообщить о кликах
Чтобы сообщить SDK о том, что пользователь нажал на объект, вызовите метод performClick() объекта объявления. Укажите название объекта, на который был нажат клик, используя ту же строку, которую вы задали в интерфейсе Менеджера рекламы.
myCustomFormatAd.performClick("MainImage");
Обратите внимание, что вам не нужно вызывать этот метод для каждого просмотра, связанного с вашим объявлением. Если у вас есть другое поле с названием "Заголовок", которое должно показываться, но не должно быть кликабельным, то для показа этого объекта приложению не нужно вызывать performClick.
Как реагировать на специальные действия при клике
При клике по объявлению специального формата SDK может отправить три типа ответов. Они будут отправляться в следующем порядке:
- Вызвать функцию
OnCustomClickListener, если она была предоставлена. - Для каждого URL ссылки на контент в объявлении попробуйте найти преобразователь контента и запустить первый из них.
- Откройте браузер и перейдите по целевому URL объявления.
Чтобы реализовать специальное действие при нажатии, укажите OnCustomClickListener:
Java
AdLoader adLoader = new AdLoader.Builder(context, "/21775744923/example/native") .forCustomFormatAd("10063170", new NativeCustomFormatAd.OnCustomFormatAdLoadedListener() { // Display the ad. }, new NativeCustomFormatAd.OnCustomClickListener() { @Override public void onCustomClick(NativeCustomFormatAd ad, String assetName) { Log.i("MyApp", "A custom click just happened for " + assetName + "!"); } }).build();
Kotlin
val adLoader = AdLoader.Builder(this, "/21775744923/example/native") .forCustomFormatAd("10063170", { ad -> // Display the ad. }, { ad, assetName -> Log.i("MyApp", "A custom click just happened for $assetName!") }).build()
На первый взгляд может показаться странным, что существуют специальные обработчики кликов. Ведь ваше приложение только что сообщило SDK, что произошел клик, так зачем SDK должен сообщать об этом приложению?
Такой обмен информацией полезен по нескольким причинам, но самое главное – он позволяет SDK контролировать реакцию на клик. Например, он может автоматически отправлять запросы к URL сторонних систем отслеживания, заданным для креатива, и выполнять другие задачи в фоновом режиме без дополнительного кода.