【问题标题】:how to get facebook NativeAdsManager ad click listener in android如何在 android 中获取 facebook NativeAdsManager 广告点击监听器
【发布时间】: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 的任何回电,所以我必须改变什么

【问题讨论】:

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


    【解决方案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_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
      

      【讨论】:

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

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

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

        这对我有用...

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-12-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-14
          • 1970-01-01
          相关资源
          最近更新 更多