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

Posted

技术标签:

【中文标题】如何在 android 中获取 facebook NativeAdsManager 广告点击监听器【英文标题】:how to get facebook NativeAdsManager ad click listener in android 【发布时间】:2016-09-08 07:26:18 【问题描述】:

我使用 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) 

            
        );

这就是我实现的方式,但我没有收到来自onAdLoadedonAdClicked 的任何回电,所以我必须改变什么

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

这是一个自定义的 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_
    android:layout_/>

(2) 将广告绑定到布局时,将其注册到AdContainer

AdContainer container = (ViewGroup) findViewById(R.id.ad_container);
container.setAd(ad, this); // make sure the current class implements AdListener

【讨论】:

【参考方案3】:
NativeAdsManager listNativeAdsManager = new NativeAdsManager(activity, "mykey", 5);

请不要在 NativeAdsManager 的参数中发送 5 5 是一次发送到服务器的请求的请求数,因此只发送 1 in大括号像

NativeAdsManager listNativeAdsManager = new NativeAdsManager(activity, "mykey", 1);

这对我有用...

【讨论】:

以上是关于如何在 android 中获取 facebook NativeAdsManager 广告点击监听器的主要内容,如果未能解决你的问题,请参考以下文章