如何在android中获取facebook NativeAdsManager广告点击监听器

时间:2016-09-08 07:26:19

标签: android facebook-android-sdk facebook-ads-api facebook-audience-network

我使用Facebook广告网络显示原生广告,其工作正常。那么如何为加载,单击,错误实现事件监听器。所以我只是坚持这个实现,所以任何人都可以帮助我如何做。

d.b_var

这是我实施的方式,但我没有收到来自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的任何回复所以我需要更改

2 个答案:

答案 0 :(得分:2)

我在这里遇到了同样的问题。事实上,这些方法都没有被调用过,这是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);

答案 1 :(得分:1)

这是一个可行的解决方法:

这是一个自定义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