Facebook受众网络 - 带有AdListener的NativeAdsManager

时间:2016-08-10 19:13:27

标签: android facebook facebook-audience-network

我使用Facebook Audience Network 4.14.1 for Android,并尝试在用户点击Facebook上的广告后在我的应用上执行逻辑。我使用的是4.11.x版,AdListener工作得非常好。出于某种原因,在某些版本之后它不再起作用了。有没有不同的方式来使用它? 加载广告后,我只需注册一个监听器:

nativeAd.setAdListener(new AdListener() {
    @Override
    public void onError(Ad ad, AdError adError) {
    }

    @Override
    public void onAdLoaded(Ad ad) {
    }

    @Override
    public void onAdClicked(Ad ad) {
        // my logic
    }
});

1 个答案:

答案 0 :(得分:1)

有同样的问题,似乎这是Facebook SDK中公认的错误: https://developers.facebook.com/bugs/158853171214759/

Facebook员工的最新回应是:

  

在与工程团队调查后,我们决定不这样做   目前为此特定问题发布修复程序。但是,我们   有一些计划的更改,以便将来缓解这个问题   SDK的版本。

谢谢,Facebook。

<强>更新

我能够通过创建一个自定义的FrameLayout来解决它,它可以检测到它的点击次数,它是hacky,而不是完美,但更好的是没有。

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