Нативная реклама
Нативная реклама - гибкий тип рекламы, стиль и вид которой вы можете адаптировать под контент вашего приложения.
Вы можете использовать наше демо приложение в качестве примера по интеграции.
Кеширование
Для кеширования нативной рекламы используйте следющий метод:
- Kotlin
- Java
Appodeal.cache(this, Appodeal.NATIVE)
Appodeal.cache(this, Appodeal.NATIVE);
Для кеширования конкретного количества нативной рекламы используйте следующий метод:
- Kotlin
- Java
Appodeal.cache(this, Appodeal.NATIVE, 3)
Appodeal.cache(this, Appodeal.NATIVE, 3);
Указание количества нативной рекламы при кешировании не гарантирует, что указанное количество будет загружено.
Проверка Загрузки
- Kotlin
- Java
Appodeal.isLoaded(Appodeal.NATIVE)
Appodeal.isLoaded(Appodeal.NATIVE);
Получение Экземпляра Загруженной Нативной Рекламы
Чтобы получить загруженную нативную рекламу используйте следующий метод:
- Kotlin
- Java
val nativeAds: List<NativeAd> = Appodeal.getNativeAds(amount)
List<NativeAd> nativeAds = Appodeal.getNativeAds(int amount);
Как только вы получите список с нативной рекламой, он будет удален из кеша Appodeal SDK.
Методы Обратного Вызова
- Kotlin
- Java
Appodeal.setNativeCallbacks(object : NativeCallbacks {
override fun onNativeLoaded() {
// Called when native ads are loaded
}
override fun onNativeFailedToLoad() {
// Called when native ads are failed to load
}
override fun onNativeShown(NativeAd nativeAd) {
// Called when native ad is shown
}
override fun onNativeShowFailed(NativeAd nativeAd) {
// Called when native ad show failed
}
override fun onNativeClicked(NativeAd nativeAd) {
// Called when native ads is clicked
}
override fun onNativeExpired() {
// Called when native ads is expired
}
})
Appodeal.setNativeCallbacks(new NativeCallbacks() {
@Override
public void onNativeLoaded() {
// Called when native ads are loaded
}
@Override
public void onNativeFailedToLoad() {
// Called when native ads are failed to load
}
@Override
public void onNativeShown(NativeAd nativeAd) {
// Called when native ad is shown
}
@Override
public void onNativeShowFailed(NativeAd nativeAd) {
// Called when native ad show failed
}
@Override
public void onNativeClicked(NativeAd nativeAd) {
// Called when native ads is clicked
}
@Override
public void onNativeExpired() {
// Called when native ads is expired
}
});
Вcе callback методы вызываются в главном потоке.
Ручное Кеширование
Чтобы отключить автоматическое кеширование для нативной рекламы, вызовите следующий код до инициализации SDK:
- Kotlin
- Java
Appodeal.setAutoCache(Appodeal.NATIVE, false)
Appodeal.setAutoCache(Appodeal.NATIVE, false);
Более подробную информацию о ручном кешировании рекламы вы можете найти в нашем FAQ.
Получение Количества Доступной Нативной Рекламы
- Kotlin
- Java
Appodeal.getAvailableNativeAdsCount()
Appodeal.getAvailableNativeAdsCount();
Объект NativeAd
После загрузки нативных объявлений вы можете получить список объектов NativeAd, вызвав Appodeal.getNativeAds()
.
- Kotlin
- Java
Метод | Тип | Обязателен | Описание |
---|---|---|---|
nativeAd.title | String | Обязателен | Заголовок нативной рекламы. Всегда должно отображаться не более 25 символов заголовка. Вы можете добавить многоточие в конце, если заголовок длиннее. |
nativeAd.callToAction | String | Обязателен | Текст Call-to-action кнопки. Должен отображаться полный заголовок кнопки. |
nativeAd.description | String | Опционален | Текстовое описание нативного объявления. Если вы решите отобразить описание, оно должно содержать не более 100 символов. Вы можете добавить многоточие в конце. |
nativeAd.rating | Float | Опционален | Рейтинг приложения в диапазоне [0-5] |
nativeAd.ageRestrictions | String | Опционален | Возрастное ограничение рекламируемого приложения. Может возвращать null . |
nativeAd.adProvider | String | Опционален | Имя провайдера нативной рекламы. |
nativeAd.getProviderView(context: Context) | View | Обязателен | Если он не возвращает null , то в любом углу нативного объявления обязательно отображается значок провайдера. Используется некоторыми сетями для отображения AdChoices или значка конфиденциальности. |
nativeAd.containsVideo() | Boolean | Опционален | Возвращает true , если объект NativeAd содержит видео. |
nativeAd.canShow(placementName: String) | Boolean | Опционален | Проверяет, может ли нативная реклама быть показана для указанного плейсмента. |
nativeAd.isPrecache | Boolean | Опционален | Проверяет, является ли загруженная реклама прекэшем. |
nativeAd.predictedEcpm | Double | Опционален | Возвращает прогнозируемое значение ecpm. |
nativeAd.destroy() | Unit | Обязателен | Уничтожает нативную рекламы и прекращает ее отслеживание. |
Метод | Тип | Обязателен | Описание |
---|---|---|---|
nativeAd.getTitle() | String | Обязателен | Заголовок нативной рекламы. Всегда должно отображаться не более 25 символов заголовка. Вы можете добавить многоточие в конце, если заголовок длиннее. |
nativeAd.getCallToAction() | String | Обязателен | Текст Call-to-action кнопки. Должен отображаться полный заголовок кнопки. |
nativeAd.getDescription() | String | Опционален | Текстовое описание нативного объявления. Если вы решите отобразить описание, оно должно содержать не более 100 символов. Вы можете добавить многоточие в конце. |
nativeAd.getRating() | Float | Опционален | Рейтинг приложения в диапазоне [0-5] |
nativeAd.getAgeRestrictions() | String | Опционален | Возрастное ограничение рекламируемого приложения. Может возвращать null . |
nativeAd.getAdProvider() | String | Опционален | Имя провайдера нативной рекламы. |
nativeAd.getProviderView(Context context) | View | Обязателен | Если он не возвращает null , то в любом углу нативного объявления обязательно отображается значок провайдера. Используется некоторыми сетями для отображения AdChoices или значка конфиденциальности. |
nativeAd.containsVideo() | Boolean | Опционален | Возвращает true , если объект NativeAd содержит видео. |
nativeAd.canShow(String placementName) | Boolean | Опционален | Проверяет, может ли нативная реклама быть показана для указанного плейсмента. |
nativeAd.isPrecache() | Boolean | Опционален | Проверяет, является ли загруженная реклама прекэшем. |
nativeAd.getPredictedEcpm() | Double | Опционален | Возвращает прогнозируемое значение ecpm. |
nativeAd.destroy() | Void | Обязателен | Уничтожает нативную рекламы и прекращает ее отслеживание. |
Настройка
Кэширование Ресурсов Нативной Рекламы
Задайте ресурсы для нативной рекламы, необходимые для показа. Значение по умолчанию - ALL
.
- Kotlin
- Java
//assets caching for NativeIconView and NativeMediaView
Appodeal.setRequiredNativeMediaAssetType(Native.MediaAssetType.ALL)
//assets caching only for NativeIconView
Appodeal.setRequiredNativeMediaAssetType(Native.MediaAssetType.ICON)
//assets caching only for NativeMediaView
Appodeal.setRequiredNativeMediaAssetType(Native.MediaAssetType.IMAGE)
//assets caching for NativeIconView and NativeMediaView
Appodeal.setRequiredNativeMediaAssetType(Native.MediaAssetType.ALL);
//assets caching only for NativeIconView
Appodeal.setRequiredNativeMediaAssetType(Native.MediaAssetType.ICON);
//assets caching only for NativeMediaView
Appodeal.setRequiredNativeMediaAssetType(Native.MediaAssetType.IMAGE);
Нативная Видеореклама
Для показа нативного видео необходимо использовать NativeMediaView
.
В случае отсутствия видео в объекте NativeAd, автоматически отобразится главное изображение.
- Kotlin
- Java
val adView: NativeAdView = findViewById(R.id.native_layout)
val nativeMediaView: NativeMediaView = adView.findViewById(R.id.appodeal_media_view_content)
if (nativeAd.containsVideo()) {
adView.nativeMediaView = nativeMediaView;
} else {
nativeMediaView.visibility = View.GONE;
}
NativeAdView adView = findViewById(R.id.native_layout)
NativeMediaView nativeMediaView = adView.findViewById(R.id.appodeal_media_view_content);
if (nativeAd.containsVideo()) {
nativeAdView.setNativeMediaView(nativeMediaView);
} else {
nativeMediaView.setVisibility(View.GONE);
}
Настойки Нативной Видеорекламы
Для управления нативной видеорекламой используйте следующие методы:
- Kotlin
- Java
// both static image and video native ads will be loaded
Appodeal.setNativeAdType(Native.NativeAdType.Auto)
// only static image native ads will be loaded
Appodeal.setNativeAdType(Native.NativeAdType.NoVideo)
// only video native ads will be loaded.
Appodeal.setNativeAdType(Native.NativeAdType.Video)
// both static image and video native ads will be loaded
Appodeal.setNativeAdType(Native.NativeAdType.Auto);
// only static image native ads will be loaded
Appodeal.setNativeAdType(Native.NativeAdType.NoVideo);
// only video native ads will be loaded.
Appodeal.setNativeAdType(Native.NativeAdType.Video);
Шаблоны
Appodeal SDK предоставляет 3 вида шаблонов для нативной рекламы:
NativeAdViewNewsFeed
;NativeAdViewAppWall
;NativeAdViewContentStream
.
Если вы хотите использовать один из этих шаблонов, Вы можете добавить выбранный шаблон в разметку:
<com.appodeal.ads.native_ad.views.NativeAdViewNewsFeed
android:id="@+id/native_ad_view_news_feed"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp">
</com.appodeal.ads.native_ad.views.NativeAdViewNewsFeed>
<com.appodeal.ads.native_ad.views.NativeAdViewAppWall
android:id="@+id/native_ad_view_app_wall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp">
</com.appodeal.ads.native_ad.views.NativeAdViewAppWall>
<com.appodeal.ads.native_ad.views.NativeAdViewContentStream
android:id="@+id/native_ad_view_content_stream"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp">
</com.appodeal.ads.native_ad.views.NativeAdViewContentStream>
Для показа рекламы используйте:
- Kotlin
- Java
val nav_nf: NativeAdViewNewsFeed = mActivity.findViewById(R.id.native_ad_view_news_feed)
nav_nf.setNativeAd(mNativeAd)
val nav_aw: NativeAdViewAppWall = mActivity.findViewById(R.id.native_ad_view_app_wall)
nav_aw.setNativeAd(mNativeAd)
val nav_cs: NativeAdViewContentStream = mActivity.findViewById(R.id.native_ad_view_content_stream)
nav_cs.setNativeAd(mNativeAd)
NativeAdViewNewsFeed nav_nf = mActivity.findViewById(R.id.native_ad_view_news_feed);
nav_nf.setNativeAd(mNativeAd);
NativeAdViewAppWall nav_aw = mActivity.findViewById(R.id.native_ad_view_app_wall);
nav_aw.setNativeAd(mNativeAd);
NativeAdViewContentStream nav_cs = mActivity.findViewById(R.id.native_ad_view_content_stream);
nav_cs.setNativeAd(mNativeAd);
Вы также можете создать View для отображения рекламы программно:
- Kotlin
- Java
val holder: RelativeLayout = mActivity.findViewById(R.id.native_template_holder)
val nativeAdView = NativeAdViewAppWall(mActivity, mNativeAd)
holder.addView(nativeAdView)
RelativeLayout holder = mActivity.findViewById(R.id.native_template_holder);
NativeAdViewAppWall nativeAdView = new NativeAdViewAppWall(mActivity, mNativeAd);
holder.addView(nativeAdView);
Элементы Шаблона
- Kotlin
- Java
val title: TextView = getTitleView()
val description: TextView = getDescriptionView()
val rating: View = getRatingView()
val ratingBar: RatingBar = getRatingBar()
val providerView: View = getProviderView()
val callToAction: TextView = getCallToActionView()
val iconView: NativeIconView = getNativeIconView()
val mediaView: NativeMediaView = getNativeMediaView()
TextView title = getTitleView();
TextView description = getDescriptionView();
View rating = getRatingView();
RatingBar ratingBar = getRatingBar();
View providerView = getProviderView();
TextView callToAction = getCallToActionView();
NativeIconView iconView = getNativeIconView();
NativeMediaView mediaView = getNativeMediaView();
По умолчанию нативная реклама помечается как «Ad». Вы можете заменить эту метку на «Sponsored»:
- Kotlin
- Java
nav.showSponsored(true);
nav.showSponsored(true)
Для изменения цвета кнопки действия в шаблонах используйте:
- Kotlin
- Java
nav.setCallToActionColor(color: Integer)
nav.setCallToActionColor(color: String)
nav.setCallToActionColor(int color);
nav.setCallToActionColor(String color);
Использование Собственной Разметки
- Kotlin
- Java
val nativeAdView: NativeAdView = findViewById(R.id.native_layout)
val tvTitle: TextView = nativeAdView.findViewById(R.id.tv_title)
tvTitle.text = nativeAd.title
nativeAdView.titleView = tvTitle
val tvDescription: TextView = nativeAdView.findViewById(R.id.tv_description)
tvDescription.text = nativeAd.description
nativeAdView.descriptionView = tvDescription
val ratingBar: RatingBar = nativeAdView.findViewById(R.id.rb_rating)
if (nativeAd.rating == 0.0f) {
ratingBar.visibility = View.INVISIBLE
} else {
ratingBar.visibility = View.VISIBLE
ratingBar.rating = nativeAd.rating
ratingBar.stepSize = 0.1f
}
nativeAdView.ratingView = ratingBar
val ctaButton: Button = nativeAdView.findViewById(R.id.b_cta)
ctaButton.text = nativeAd.callToAction
nativeAdView.callToActionView = ctaButton
val providerView: View? = nativeAd.getProviderView(context)
if (providerView != null) {
if (providerView.parent != null && providerView.parent is ViewGroup) {
(providerView.parent as ViewGroup).removeView(providerView)
}
val providerViewContainer: FrameLayout =
nativeAdView.findViewById(R.id.provider_view)
val layoutParams: ViewGroup.LayoutParams = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
providerViewContainer.addView(providerView, layoutParams)
}
nativeAdView.providerView = providerView
val tvAgeRestrictions: TextView = nativeAdView.findViewById(R.id.tv_age_restriction)
if (nativeAd.ageRestrictions != null) {
tvAgeRestrictions.text = nativeAd.ageRestrictions
tvAgeRestrictions.visibility = View.VISIBLE
} else {
tvAgeRestrictions.visibility = View.GONE
}
val nativeIconView: NativeIconView = nativeAdView.findViewById(R.id.icon)
nativeAdView.setNativeIconView(nativeIconView)
val nativeMediaView: NativeMediaView = nativeAdView.findViewById(R.id.appodeal_media_view_content)
nativeAdView.nativeMediaView = nativeMediaView
nativeAdView.registerView(nativeAd)
NativeAdView nativeAdView = (NativeAdView) findViewById(R.id.native_layout)
TextView tvTitle = (TextView) nativeAdView.findViewById(R.id.tv_title);
tvTitle.setText(nativeAd.getTitle());
nativeAdView.setTitleView(tvTitle);
TextView tvDescription = (TextView) nativeAdView.findViewById(R.id.tv_description);
tvDescription.setText(nativeAd.getDescription());
nativeAdView.setDescriptionView(tvDescription);
RatingBar ratingBar = nativeAdView.findViewById(R.id.rb_rating);
if (nativeAd.getRating() == 0) {
ratingBar.setVisibility(View.INVISIBLE);
} else {
ratingBar.setVisibility(View.VISIBLE);
ratingBar.setRating(nativeAd.getRating());
ratingBar.setStepSize(0.1f);
}
nativeAdView.setRatingView(ratingBar);
Button ctaButton = nativeAdView.findViewById(R.id.b_cta);
ctaButton.setText(nativeAd.getCallToAction());
nativeAdView.setCallToActionView(ctaButton);
View providerView = nativeAd.getProviderView(context);
if (providerView != null) {
if (providerView.getParent() != null && providerView.getParent() instanceof ViewGroup) {
((ViewGroup) providerView.getParent()).removeView(providerView);
}
FrameLayout providerViewContainer = nativeAdView.findViewById(R.id.provider_view);
ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
providerViewContainer.addView(providerView, layoutParams);
}
nativeAdView.setProviderView(providerView);
TextView tvAgeRestrictions = nativeAdView.findViewById(R.id.tv_age_restriction);
if (nativeAd.getAgeRestrictions() != null) {
tvAgeRestrictions.setText(nativeAd.getAgeRestrictions());
tvAgeRestrictions.setVisibility(View.VISIBLE);
} else {
tvAgeRestrictions.setVisibility(View.GONE);
}
NativeIconView nativeIconView = nativeAdView.findViewById(R.id.icon);
nativeAdView.setNativeIconView(nativeIconView);
NativeMediaView nativeMediaView = nativeAdView.findViewById(R.id.appodeal_media_view_content);
nativeAdView.setNativeMediaView(nativeMediaView);
nativeAdView.registerView(nativeAd);
Чтобы отобразить NativeAd
в своей собственной разметке, используйте NativeAdView
, наполните и
свяжите View ресурсы.
Привяжите View ресурсы к NativeAdView
:
- Kotlin
- Java
nativeAdView.titleView = view: View
nativeAdView.callToActionView = view: View
nativeAdView.ratingView = view: View
nativeAdView.descriptionView = view: View
nativeAdView.providerView = view: View
nativeAdView.setNativeIconView(nativeIconView: NativeIconView)
nativeAdView.nativeMediaView = nativeMediaView: NativeMediaView
nativeAdView.setTitleView(View view);
nativeAdView.setCallToActionView(View view);
nativeAdView.setRatingView(View view);
nativeAdView.setDescriptionView(View view);
nativeAdView.setProviderView(View view);
nativeAdView.setNativeIconView(NativeIconView nativeIconView);
nativeAdView.setNativeMediaView(NativeMediaView nativeMediaView);
Привяжите объект NativeAd
к NativeAdView
.
- Kotlin
- Java
nativeAdView.registerView(nativeAd: NativeAd)
// or nativeAdView.registerView(nativeAd: NativeAd, placementName: String) if you use placements
nativeAdView.registerView(NativeAd nativeAd);
// or nativeAdView.registerView(NativeAd nativeAd, String placementName); if you use placements
Если к данному экземпляру NativeAdView уже было зарегистрировано другое объявление, его отслеживание будет автоматически прекращено.
Для остановки отслеживания NativeAd
необходимо вызвать:
- Kotlin
- Java
nativeAdView.unregisterViewForInteraction();
nativeAdView.unregisterViewForInteraction()
Если NativeAdView
используется повторно для повторного показа объявления или для показа других
рекламных объявлений через определенные промежутки времени, необходимо вызвать метод
unregisterViewForInteraction()
, прежде чем зарегистрировать это же представление с помощью другого
экземпляра NativeAd
.
Для удаления NativeAd
, привязанного к NativeAdView
, необходимо вызвать:
- Kotlin
- Java
nativeAdView.destroy()
nativeAdView.destroy();
Невозможно использовать NativeAdView
после вызова destroy()
. Необходимо либо скрыть NativeAdView
,
либо привязать новое объявление.
Пример Интеграции
- Kotlin
- Java
fun loadNativeAds() {
Appodeal.setRequiredNativeMediaAssetType(Native.MediaAssetType.ICON)
Appodeal.initialize(this, YOUR_APP_KEY, Appodeal.NATIVE, consentValue)
Appodeal.setNativeCallbacks(new NativeCallbacks() {
override fun onNativeLoaded() {
Toast.makeText(MainActivity.this, "onNativeLoaded", Toast.LENGTH_SHORT).show()
}
override fun onNativeFailedToLoad() {
Toast.makeText(MainActivity.this, "onNativeFailedToLoad", Toast.LENGTH_SHORT).show()
}
override fun onNativeShown(NativeAd nativeAd) {
Toast.makeText(MainActivity.this, "onNativeShown", Toast.LENGTH_SHORT).show()
}
override fun onNativeClicked(NativeAd nativeAd) {
Toast.makeText(MainActivity.this, "onNativeClicked", Toast.LENGTH_SHORT).show()
}
override fun onNativeExpired() {
Toast.makeText(MainActivity.this, "onNativeExpired", Toast.LENGTH_SHORT).show()
}
})
}
public void loadNativeAds() {
Appodeal.setRequiredNativeMediaAssetType(Native.MediaAssetType.ICON);
Appodeal.initialize(this, YOUR_APP_KEY, Appodeal.NATIVE, consentValue);
Appodeal.setNativeCallbacks(new NativeCallbacks() {
@Override
public void onNativeLoaded() {
Toast.makeText(MainActivity.this, "onNativeLoaded", Toast.LENGTH_SHORT).show();
}
@Override
public void onNativeFailedToLoad() {
Toast.makeText(MainActivity.this, "onNativeFailedToLoad", Toast.LENGTH_SHORT).show();
}
@Override
public void onNativeShown(NativeAd nativeAd) {
Toast.makeText(MainActivity.this, "onNativeShown", Toast.LENGTH_SHORT).show();
}
@Override
public void onNativeClicked(NativeAd nativeAd) {
Toast.makeText(MainActivity.this, "onNativeClicked", Toast.LENGTH_SHORT).show();
}
@Override
public void onNativeExpired() {
Toast.makeText(MainActivity.this, "onNativeExpired", Toast.LENGTH_SHORT).show();
}
});
};
После получение метода обратного вызова onNativeLoaded
, можно получить нативную рекламу при помощи
Appodeal.getNativeAds()
и показать её, как указано в пункте "Использование собственной разметки".
Для отображения загруженной нативной рекламы используйте:
- Kotlin
- Java
fun showNativeAd() {
val loadedNativeAds = Appodeal.getNativeAds(1)
if (loadedNativeAds.isEmpty()) {
//Native Ads not loaded yet
return
}
val nativeAd = loadedNativeAds[0]
val nativeAdView: NativeAdView = findViewById(R.id.native_layout)
val tvTitle: TextView = nativeAdView.findViewById(R.id.tv_title)
tvTitle.text = nativeAd.title
nativeAdView.titleView = tvTitle
val tvDescription: TextView = nativeAdView.findViewById(R.id.tv_description)
tvDescription.text = nativeAd.description
nativeAdView.descriptionView = tvDescription
val ratingBar: RatingBar = nativeAdView.findViewById(R.id.rb_rating)
if (nativeAd.rating == 0f) {
ratingBar.visibility = View.INVISIBLE
} else {
ratingBar.visibility = View.VISIBLE
ratingBar.rating = nativeAd.rating
ratingBar.stepSize = 0.1f
}
nativeAdView.ratingView = ratingBar
val ctaButton: Button = nativeAdView.findViewById(R.id.b_cta)
ctaButton.text = nativeAd.callToAction
nativeAdView.callToActionView = ctaButton
val providerView = nativeAd.getProviderView(context)
if (providerView != null) {
if (providerView.parent != null && providerView.parent is ViewGroup) {
(providerView.parent as ViewGroup).removeView(providerView)
}
val providerViewContainer: FrameLayout = nativeAdView.findViewById(R.id.provider_view)
val layoutParams = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
providerViewContainer.addView(providerView, layoutParams)
}
nativeAdView.providerView = providerView
val tvAgeRestrictions: TextView = nativeAdView.findViewById(R.id.tv_age_restriction)
if (nativeAd.ageRestrictions != null) {
tvAgeRestrictions.text = nativeAd.ageRestrictions
tvAgeRestrictions.visibility = View.VISIBLE
} else {
tvAgeRestrictions.visibility = View.GONE
}
val nativeIconView: NativeIconView = nativeAdView.findViewById(R.id.icon)
nativeAdView.setNativeIconView(nativeIconView)
val nativeMediaView: NativeMediaView =
nativeAdView.findViewById(R.id.appodeal_media_view_content)
nativeAdView.nativeMediaView = nativeMediaView
nativeAdView.registerView(nativeAd)
nativeAdView.visibility = View.VISIBLE
}
public void showNativeAd(){
List<NativeAd> loadedNativeAds = Appodeal.getNativeAds(1);
if (loadedNativeAds.isEmpty()){
//Native Ads not loaded yet
return;
}
NativeAd nativeAd = loadedNativeAds.get(0);
NativeAdView nativeAdView = (NativeAdView) findViewById(R.id.native_layout);
TextView tvTitle = (TextView) nativeAdView.findViewById(R.id.tv_title);
tvTitle.setText(nativeAd.getTitle());
nativeAdView.setTitleView(tvTitle);
TextView tvDescription = (TextView) nativeAdView.findViewById(R.id.tv_description);
tvDescription.setText(nativeAd.getDescription());
nativeAdView.setDescriptionView(tvDescription);
RatingBar ratingBar = (RatingBar) nativeAdView.findViewById(R.id.rb_rating);
if (nativeAd.getRating() == 0) {
ratingBar.setVisibility(View.INVISIBLE);
} else {
ratingBar.setVisibility(View.VISIBLE);
ratingBar.setRating(nativeAd.getRating());
ratingBar.setStepSize(0.1f);
}
nativeAdView.setRatingView(ratingBar);
Button ctaButton = (Button) nativeAdView.findViewById(R.id.b_cta);
ctaButton.setText(nativeAd.getCallToAction());
nativeAdView.setCallToActionView(ctaButton);
View providerView = nativeAd.getProviderView(context);
if (providerView != null) {
if (providerView.getParent() != null && providerView.getParent() instanceof ViewGroup) {
((ViewGroup) providerView.getParent()).removeView(providerView);
}
FrameLayout providerViewContainer = (FrameLayout) nativeAdView.findViewById(R.id.provider_view);
ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
providerViewContainer.addView(providerView, layoutParams);
}
nativeAdView.setProviderView(providerView);
TextView tvAgeRestrictions = (TextView) nativeAdView.findViewById(R.id.tv_age_restriction);
if (nativeAd.getAgeRestrictions() != null) {
tvAgeRestrictions.setText(nativeAd.getAgeRestrictions());
tvAgeRestrictions.setVisibility(View.VISIBLE);
} else {
tvAgeRestrictions.setVisibility(View.GONE);
}
NativeIconView nativeIconView = nativeAdView.findViewById(R.id.icon);
nativeAdView.setNativeIconView(nativeIconView);
NativeMediaView nativeMediaView = (NativeMediaView) nativeAdView.findViewById(R.id.appodeal_media_view_content);
nativeAdView.setNativeMediaView(nativeMediaView);
nativeAdView.registerView(nativeAd);
nativeAdView.setVisibility(View.VISIBLE);
}
Пример Интеграции Нативной Рекламы В Ленту
Для интеграции нативной рекламы в ленту вашего приложения можете воспользоваться данным примером:
- Kotlin
- Java
import android.util.SparseArray
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.FrameLayout
import android.widget.RatingBar
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.appodeal.ads.*
/**
* Wrapper adapter to show Native Ad in recycler view with fixed step
*
* @param userAdapter user adapter
* @param nativeStep step show [com.appodeal.ads.NativeAd]
*/
class AppodealWrapperAdapter(
userAdapter: RecyclerView.Adapter<RecyclerView.ViewHolder>,
nativeStep: Int
) : RecyclerView.Adapter<RecyclerView.ViewHolder>(), NativeCallbacks {
private val _userAdapter: RecyclerView.Adapter<RecyclerView.ViewHolder>?
private val userAdapter: RecyclerView.Adapter<RecyclerView.ViewHolder>
get() = requireNotNull(_userAdapter)
private var nativeStep = DEFAULT_NATIVE_STEP
private val nativeAdList = SparseArray<NativeAd?>()
init {
this._userAdapter = userAdapter
this.nativeStep = nativeStep + 1
userAdapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
override fun onChanged() {
super.onChanged()
notifyDataSetChanged()
fillListWithAd()
}
override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {
super.onItemRangeInserted(positionStart, itemCount)
notifyDataSetChanged()
fillListWithAd()
}
})
Appodeal.setNativeCallbacks(this)
fillListWithAd()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return if (viewType == VIEW_HOLDER_NATIVE_AD_TYPE) {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.include_native_ads, parent, false)
NativeCustomAdViewHolder(view)
} else {
userAdapter.onCreateViewHolder(parent, viewType)
}
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if (holder is NativeCustomAdViewHolder) {
holder.fillNative(nativeAdList[position])
} else {
userAdapter.onBindViewHolder(holder, getPositionInUserAdapter(position))
}
}
override fun getItemCount(): Int {
var resultCount = 0
resultCount += nativeAdsCount
resultCount += userAdapterItemCount
return resultCount
}
override fun getItemViewType(position: Int): Int {
return if (isNativeAdPosition(position)) {
VIEW_HOLDER_NATIVE_AD_TYPE
} else {
userAdapter.getItemViewType(getPositionInUserAdapter(position))
}
}
override fun onViewRecycled(holder: RecyclerView.ViewHolder) {
super.onViewRecycled(holder)
if (holder is NativeCustomAdViewHolder) {
holder.unregisterViewForInteraction()
}
}
/**
* Destroy all used native ads
*/
fun destroyNativeAds() {
for (i in 0 until nativeAdList.size()) {
val nativeAd = nativeAdList.valueAt(i)
nativeAd!!.destroy()
}
nativeAdList.clear()
}
override fun onNativeLoaded() {
fillListWithAd()
}
override fun onNativeFailedToLoad() {}
override fun onNativeShown(nativeAd: NativeAd?) {}
override fun onNativeShowFailed(nativeAd: NativeAd?) {}
override fun onNativeClicked(nativeAd: NativeAd?) {}
override fun onNativeExpired() {}
/**
* @return count of loaded ads [com.appodeal.ads.NativeAd]
*/
private val nativeAdsCount: Int
get() = nativeAdList.size()
/**
* @return user items count
*/
private val userAdapterItemCount: Int
get() = userAdapter.itemCount
/**
* @param position index in wrapper adapter
* @return `true` if item by position is [com.appodeal.ads.NativeAd]
*/
private fun isNativeAdPosition(position: Int): Boolean {
return nativeAdList[position] != null
}
/**
* Method for searching position in user adapter
*
* @param position index in wrapper adapter
* @return index in user adapter
*/
private fun getPositionInUserAdapter(position: Int): Int {
return position - nativeAdList.size().coerceAtMost(position / nativeStep)
}
/**
* Method for filling list with [com.appodeal.ads.NativeAd]
*/
private fun fillListWithAd() {
var insertPosition = findNextAdPosition()
var nativeAd: NativeAd? = null
while (canUseThisPosition(insertPosition) && nativeAdItem.also { nativeAd = it } != null) {
nativeAdList.put(insertPosition, nativeAd)
notifyItemInserted(insertPosition)
insertPosition = findNextAdPosition()
}
}
/**
* Get native ad item
*
* @return [com.appodeal.ads.NativeAd]
*/
private val nativeAdItem: NativeAd?
get() {
val ads = Appodeal.getNativeAds(1)
return if (ads.isNotEmpty()) ads[0] else null
}
/**
* Method for finding next position suitable for [com.appodeal.ads.NativeAd]
*
* @return position for next native ad view
*/
private fun findNextAdPosition(): Int {
return if (nativeAdList.size() > 0) {
nativeAdList.keyAt(nativeAdList.size() - 1) + nativeStep
} else nativeStep - 1
}
/**
* @param position index in wrapper adapter
* @return `true` if you can add [com.appodeal.ads.NativeAd] to this position
*/
private fun canUseThisPosition(position: Int): Boolean {
return nativeAdList[position] == null && itemCount > position
}
/**
* View holder for create custom [com.appodeal.ads.native_ad.views.NativeAdView]
*/
internal class NativeCustomAdViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
private val nativeAdView: NativeAdView = itemView.findViewById(R.id.native_item)
private val tvTitle: TextView = itemView.findViewById(R.id.tv_title)
private val tvDescription: TextView = itemView.findViewById(R.id.tv_description)
private val ratingBar: RatingBar = itemView.findViewById(R.id.rb_rating)
private val ctaButton: Button = itemView.findViewById(R.id.b_cta)
private val nativeIconView: NativeIconView = itemView.findViewById(R.id.icon)
private val tvAgeRestrictions: TextView = itemView.findViewById(R.id.tv_age_restriction)
private val nativeMediaView: NativeMediaView = itemView.findViewById(R.id.appodeal_media_view_content)
private val providerViewContainer: FrameLayout = itemView.findViewById(R.id.provider_view)
fun fillNative(nativeAd: NativeAd?) {
tvTitle.text = nativeAd!!.title
tvDescription.text = nativeAd.description
if (nativeAd.rating == 0f) {
ratingBar.visibility = View.INVISIBLE
} else {
ratingBar.visibility = View.VISIBLE
ratingBar.rating = nativeAd.rating
ratingBar.stepSize = 0.1f
}
ctaButton.text = nativeAd.callToAction
val providerView = nativeAd.getProviderView(nativeAdView.context)
if (providerView != null) {
if (providerView.parent != null && providerView.parent is ViewGroup) {
(providerView.parent as ViewGroup).removeView(providerView)
}
providerViewContainer.removeAllViews()
val layoutParams = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
providerViewContainer.addView(providerView, layoutParams)
}
if (nativeAd.ageRestrictions != null) {
tvAgeRestrictions.text = nativeAd.ageRestrictions
tvAgeRestrictions.visibility = View.VISIBLE
} else {
tvAgeRestrictions.visibility = View.GONE
}
if (nativeAd.containsVideo()) {
nativeAdView.nativeMediaView = nativeMediaView
} else {
nativeMediaView.visibility = View.GONE
}
nativeAdView.titleView = tvTitle
nativeAdView.descriptionView = tvDescription
nativeAdView.ratingView = ratingBar
nativeAdView.callToActionView = ctaButton
nativeAdView.setNativeIconView(nativeIconView)
nativeAdView.providerView = providerView
nativeAdView.registerView(nativeAd)
nativeAdView.visibility = View.VISIBLE
}
fun unregisterViewForInteraction() {
nativeAdView.unregisterViewForInteraction()
}
}
companion object {
private const val DEFAULT_NATIVE_STEP = 5
private const val VIEW_HOLDER_NATIVE_AD_TYPE = 600
}
}
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.RatingBar;
import android.widget.TextView;
import com.appodeal.ads.Appodeal;
import com.appodeal.ads.NativeAd;
import com.appodeal.ads.NativeAdView;
import com.appodeal.ads.NativeCallbacks;
import com.appodeal.ads.NativeIconView;
import com.appodeal.ads.NativeMediaView;
import java.util.List;
/**
* Wrapper adapter to show Native Ad in recycler view with fixed step
*/
public class AppodealWrapperAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
implements NativeCallbacks {
private static final int DEFAULT_NATIVE_STEP = 5;
private static final int VIEW_HOLDER_NATIVE_AD_TYPE = 600;
private final RecyclerView.Adapter<RecyclerView.ViewHolder> userAdapter;
private int nativeStep = DEFAULT_NATIVE_STEP;
private final SparseArray<NativeAd> nativeAdList = new SparseArray<>();
/**
* @param userAdapter user adapter
* @param nativeStep step show {@link com.appodeal.ads.NativeAd}
*/
public AppodealWrapperAdapter(RecyclerView.Adapter<RecyclerView.ViewHolder> userAdapter, int nativeStep) {
this.userAdapter = userAdapter;
this.nativeStep = nativeStep + 1;
userAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
@Override
public void onChanged() {
super.onChanged();
notifyDataSetChanged();
fillListWithAd();
}
@Override
public void onItemRangeInserted(int positionStart, int itemCount) {
super.onItemRangeInserted(positionStart, itemCount);
notifyDataSetChanged();
fillListWithAd();
}
});
Appodeal.setNativeCallbacks(this);
fillListWithAd();
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (viewType == VIEW_HOLDER_NATIVE_AD_TYPE) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.include_native_ads, parent, false);
return new NativeCustomAdViewHolder(view);
} else {
return userAdapter.onCreateViewHolder(parent, viewType);
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if (holder instanceof NativeCustomAdViewHolder) {
((NativeCustomAdViewHolder) holder).fillNative(nativeAdList.get(position));
} else {
userAdapter.onBindViewHolder(holder, getPositionInUserAdapter(position));
}
}
@Override
public int getItemCount() {
int resultCount = 0;
resultCount += getNativeAdsCount();
resultCount += getUserAdapterItemCount();
return resultCount;
}
@Override
public int getItemViewType(int position) {
if (isNativeAdPosition(position)) {
return VIEW_HOLDER_NATIVE_AD_TYPE;
} else {
return userAdapter.getItemViewType(getPositionInUserAdapter(position));
}
}
@Override
public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
super.onViewRecycled(holder);
if (holder instanceof NativeCustomAdViewHolder) {
((NativeCustomAdViewHolder) holder).unregisterViewForInteraction();
}
}
/**
* Destroy all used native ads
*/
public void destroyNativeAds() {
for (int i = 0; i < nativeAdList.size(); i++) {
NativeAd nativeAd = nativeAdList.valueAt(i);
nativeAd.destroy();
}
nativeAdList.clear();
}
@Override
public void onNativeLoaded() {
fillListWithAd();
}
@Override
public void onNativeFailedToLoad() {
}
@Override
public void onNativeShown(NativeAd nativeAd) {
}
@Override
public void onNativeShowFailed(NativeAd nativeAd) {
}
@Override
public void onNativeClicked(NativeAd nativeAd) {
}
@Override
public void onNativeExpired() {
}
/**
* @return count of loaded ads {@link com.appodeal.ads.NativeAd}
*/
private int getNativeAdsCount() {
return nativeAdList.size();
}
/**
* @return user items count
*/
private int getUserAdapterItemCount() {
if (userAdapter != null) {
return userAdapter.getItemCount();
}
return 0;
}
/**
* @param position index in wrapper adapter
* @return {@code true} if item by position is {@link com.appodeal.ads.NativeAd}
*/
private boolean isNativeAdPosition(int position) {
return nativeAdList.get(position) != null;
}
/**
* Method for searching position in user adapter
*
* @param position index in wrapper adapter
* @return index in user adapter
*/
private int getPositionInUserAdapter(int position) {
return position - Math.min(nativeAdList.size(), position / nativeStep);
}
/**
* Method for filling list with {@link com.appodeal.ads.NativeAd}
*/
private void fillListWithAd() {
int insertPosition = findNextAdPosition();
NativeAd nativeAd;
while (canUseThisPosition(insertPosition) && (nativeAd = getNativeAdItem()) != null) {
nativeAdList.put(insertPosition, nativeAd);
notifyItemInserted(insertPosition);
insertPosition = findNextAdPosition();
}
}
/**
* Get native ad item
*
* @return {@link com.appodeal.ads.NativeAd}
*/
@Nullable
private NativeAd getNativeAdItem() {
List<NativeAd> ads = Appodeal.getNativeAds(1);
return !ads.isEmpty() ? ads.get(0) : null;
}
/**
* Method for finding next position suitable for {@link com.appodeal.ads.NativeAd}
*
* @return position for next native ad view
*/
private int findNextAdPosition() {
if (nativeAdList.size() > 0) {
return nativeAdList.keyAt(nativeAdList.size() - 1) + nativeStep;
}
return nativeStep - 1;
}
/**
* @param position index in wrapper adapter
* @return {@code true} if you can add {@link com.appodeal.ads.NativeAd} to this position
*/
private boolean canUseThisPosition(int position) {
return nativeAdList.get(position) == null && getItemCount() > position;
}
/**
* View holder for create custom {@link com.appodeal.ads.native_ad.views.NativeAdView}
*/
static class NativeCustomAdViewHolder extends RecyclerView.ViewHolder {
private final NativeAdView nativeAdView;
private final TextView tvTitle;
private final TextView tvDescription;
private final RatingBar ratingBar;
private final Button ctaButton;
private final NativeIconView nativeIconView;
private final TextView tvAgeRestrictions;
private final NativeMediaView nativeMediaView;
private final FrameLayout providerViewContainer;
NativeCustomAdViewHolder(View itemView) {
super(itemView);
nativeAdView = itemView.findViewById(R.id.native_item);
tvTitle = itemView.findViewById(R.id.tv_title);
tvDescription = itemView.findViewById(R.id.tv_description);
ratingBar = itemView.findViewById(R.id.rb_rating);
ctaButton = itemView.findViewById(R.id.b_cta);
nativeIconView = itemView.findViewById(R.id.icon);
providerViewContainer = itemView.findViewById(R.id.provider_view);
tvAgeRestrictions = itemView.findViewById(R.id.tv_age_restriction);
nativeMediaView = itemView.findViewById(R.id.appodeal_media_view_content);
}
void fillNative(NativeAd nativeAd) {
tvTitle.setText(nativeAd.getTitle());
tvDescription.setText(nativeAd.getDescription());
if (nativeAd.getRating() == 0) {
ratingBar.setVisibility(View.INVISIBLE);
} else {
ratingBar.setVisibility(View.VISIBLE);
ratingBar.setRating(nativeAd.getRating());
ratingBar.setStepSize(0.1f);
}
ctaButton.setText(nativeAd.getCallToAction());
View providerView = nativeAd.getProviderView(nativeAdView.getContext());
if (providerView != null) {
if (providerView.getParent() != null && providerView.getParent() instanceof ViewGroup) {
((ViewGroup) providerView.getParent()).removeView(providerView);
}
providerViewContainer.removeAllViews();
ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
providerViewContainer.addView(providerView, layoutParams);
}
if (nativeAd.getAgeRestrictions() != null) {
tvAgeRestrictions.setText(nativeAd.getAgeRestrictions());
tvAgeRestrictions.setVisibility(View.VISIBLE);
} else {
tvAgeRestrictions.setVisibility(View.GONE);
}
if (nativeAd.containsVideo()) {
nativeAdView.setNativeMediaView(nativeMediaView);
} else {
nativeMediaView.setVisibility(View.GONE);
}
nativeAdView.setTitleView(tvTitle);
nativeAdView.setDescriptionView(tvDescription);
nativeAdView.setRatingView(ratingBar);
nativeAdView.setCallToActionView(ctaButton);
nativeAdView.setNativeIconView(nativeIconView);
nativeAdView.setProviderView(providerView);
nativeAdView.registerView(nativeAd);
nativeAdView.setVisibility(View.VISIBLE);
}
void unregisterViewForInteraction() {
nativeAdView.unregisterViewForInteraction();
}
}
}
Для использования данного адаптера-обертки над уже существующим в вашем приложении адаптером создайте
экземпляр AppodealWrapperAdapter
:
- Kotlin
- Java
val appodealWrapperAdapter: AppodealWrapperAdapter = AppodealWrapperAdapter(myAdapter, 2)
AppodealWrapperAdapter appodealWrapperAdapter = new AppodealWrapperAdapter(myAdapter, 2);
Передайте этот адаптер в recycler view.
Распространенные Ошибки
- Нет атрибута объявления или иконки AdChoices
Большинство рекламных сетей требуют от издателя добавления специальной метки для нативного объявления, чтобы пользователи не принимали рекламу за контент. Проверьте, что для нативных объявлениях в вашем приложении указаны соответствующие атрибуты рекламы (например, «Ad») или иконка AdChoices.
- Отсутствие обязательных элементов объявлений
Каждое нативное объявление должно содержать:
заголовок;
кнопку для действия;
иконку атрибута рекламы или иконку AdChoices;
изображение, видео или иконку.
Изменение элементов нативных объявлений
Рекламодатели ожидают, что их реклама будет отображаться четко и без каких-либо изменений. Вы можете изменять масштаб кнопки и изображений, но не обрезать, перекрывать или искажать их.
- Наложение элементов нативных объявлений друг на другаr
Убедитесь, что все элементы нативного объявления видны и не перекрывают друг друга.
Требования к нативной рекламе:
- Все поля нативного объявления, помеченные как обязательные, должны отображаться.
- Каждое объявление должно иметь знак, четко указывающий, что это рекламное объявление. Например "Ad" или "Sponsored".
- Предоставляемые изображения можно масштабировать, чтобы соответствовать вашему рекламному месту, но нельзя значительно искажать или обрезать.
Проверка Инициализизации
Чтобы проверить, была ли проинициализирована ли нативная реклама, вы можете использовать метод:
- Kotlin
- Java
Appodeal.isInitialized(Appodeal.NATIVE)
Appodeal.isInitialized(Appodeal.NATIVE);
Возвращает true
, если нативная реклама была проинициализирована.
Проверка Типа Кеширования
Чтобы проверить, включено ли автоматическое кеширование для нативной рекламы, вы можете использовать метод:
- Kotlin
- Java
Appodeal.isAutoCacheEnabled(Appodeal.NATIVE)
Appodeal.isAutoCacheEnabled(Appodeal.NATIVE);
Возвращает true
, если автоматическое кеширование включено для нативной рекламы.
Получение Прогнозируемого eCPM
Для того, чтобы получить прогнозируемый eCPM для нативной рекламы для следующего блока в очереди на опрос, вы можете использовать метод:
- Kotlin
- Java
NativeAd.getPredictedEcpm()
NativeAd.getPredictedEcpm();
Этот метод целесообразно использовать, если включено ручное кэширование рекламы.
Проверка показа
Вы всегда можете проверить в логах был ли засчитан показ и видна ли реклама.
Вы увидите Native [Notify Shown] лог если показ был успешно засчитан.
- Log
Appodeal com.example.app D Native [Notify Shown]