Как получить фейсбук NativeAdsManager объявление клик слушатель в андроид
Я использую рекламную сеть Facebook для показа нативной рекламы. Итак, как реализовать прослушиватель событий для загруженной, нажатой, ошибки. Так что я просто остановился на этой реализации, так что любой может помочь мне, как это сделать.
listNativeAdsManager = new NativeAdsManager(activity, "mykey", 5)
listNativeAdsManager.setListener(new NativeAdsManager.Listener() {
@Override
public void onAdsLoaded() {
com.facebook.ads.NativeAd fbNative = listNativeAdsManager.nextNativeAd();
fbNative.setAdListener(new AdListener() {
@Override
public void onError(Ad ad, AdError adError) {
Log.d("fb-native","onError ");
}
@Override
public void onAdLoaded(Ad ad) {
Log.d("fb-native","onAdLoaded ");
}
@Override
public void onAdClicked(Ad ad) {
Log.d("fb-native","onAdClicked ");
}
});
View adView = NativeAdView.render(getActivity(), fbNative, NativeAdView.Type.HEIGHT_100);
html_view.addView(adView);
}
@Override
public void onAdError(AdError adError) {
}
});
это то, как я реализовал, но я не получил никакого ответа от onAdLoaded
, onAdClicked
так что я должен изменить
3 ответа
Я сталкиваюсь с теми же проблемами здесь. На самом деле ни один из методов не вызывается никогда, и это ошибка в Audience SDK! Если вы вернетесь к 4.11.0, вы получите, по крайней мере, onAdClicked, но все версии выше 4.11.0 не будут вызывать ни один из методов обратного вызова. Вот этот открытый отчет об ошибке (который подал мой коллега): https://developers.facebook.com/bugs/158853171214759/.
Решение простое: не используйте NativeAdsManager, а загружайте рекламу напрямую:
final NativeAd nativeAd = new NativeAd(context, facebookNativeAdUnitId);
nativeAd.setAdListener(new AdListener() {
@Override
public void onError(Ad ad, AdError adError) {
}
@Override
public void onAdLoaded(Ad ad) {
}
@Override
public void onAdClicked(Ad ad) {
}
});
nativeAd.loadAd(NativeAd.MediaCacheFlag.ALL);
Вот возможный обходной путь:
Вот пользовательский FrameLayout, который обнаруживает клики по нему:
public class AdContainer extends FrameLayout implements OnGestureListener {
GestureDetector clickDetector;
private NativeAd ad;
private AdListener listener;
public AdContainer(@NonNull Context context) {
super(context);
init();
}
public AdContainer(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public AdContainer(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
@TargetApi(VERSION_CODES.LOLLIPOP)
public AdContainer(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr, @StyleRes int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init();
}
private void init() {
clickDetector = new GestureDetector(getContext(), this);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
clickDetector.onTouchEvent(ev);
return super.onInterceptTouchEvent(ev);
}
public void setAd(NativeAd ad, AdListener listener) {
this.ad = ad;
this.listener = listener;
}
// OnGestureListener
@Override
public boolean onSingleTapUp(MotionEvent e) {
Log.d("AdContainer", "detected a click in an ad container: " + ad);
if ((ad != null) && (listener != null)) {
listener.onAdClicked(ad);
}
return false;
}
@Override
public boolean onDown(MotionEvent e) {
return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return false;
}
@Override
public void onLongPress(MotionEvent e) {
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
return false;
}
}
Используйте это так:
(1) Наденьте свой рекламный макет на новый класс контейнера:
<com.example.AdContainer
android:id="@+id/ad_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
(2) Привязывая свое объявление к макету, зарегистрируйте его с AdContainer
:
AdContainer container = (ViewGroup) findViewById(R.id.ad_container);
container.setAd(ad, this); // make sure the current class implements AdListener
NativeAdsManager listNativeAdsManager = new NativeAdsManager(activity, "mykey", 5);
не отправляйте 5 в параметре NativeAdsManager 5 - это номер запроса, отправляемого на сервер за раз, поэтому отправляйте только 1 в скобках, например
NativeAdsManager listNativeAdsManager = new NativeAdsManager(activity, "mykey", 1);
это работает для меня...