如何在 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 广告点击监听器的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在 android 应用程序中使用多个 Graph API 获取 Facebook Notes Items 的评论?

如何在最新的 Facebook Android SDK 4.6.0 中获取会话类

如何在 Facebook Android sdk 4.0 中使用 Graph Request 获取登录用户的电子邮件地址

Android,如何获取 Facebook/Twitter/etc 联系人照片

如何将特定登录的公共 Facebook 页面数据(应用程序)获取到我的 android 应用程序中?