Как получить фейсбук 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);

это работает для меня...

Другие вопросы по тегам