0

J'utilise le réseau publicitaire de Facebook pour afficher les annonces natives. Donc, comment implémenter l'écouteur d'événement pour le chargement, le clic, l'erreur. Donc, je me suis contenté de cette mise en œuvre, donc quelqu'un peut m'aider à faire.Comment faire pour obtenir des annonces natives de NativeAdsManager sur Facebook en android

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) { 

      } 
     }); 

est ce que je mais je ne mis en œuvre pas eu de rappel de onAdLoaded, onAdClicked donc ce que je dois changer

Répondre

2

Je suis en cours d'exécution dans les mêmes problèmes ici. En fait, aucune de ces méthodes n'est appelée et c'est un bug dans le SDK d'Audience! Si vous revenez à la version 4.11.0, vous obtiendrez l'onAdClicked au moins, mais toutes les versions supérieures à 4.11.0 n'appelleront aucune des méthodes de rappel. Il y a ce rapport de bogue ouvert (qu'un collègue a déposé): https://developers.facebook.com/bugs/158853171214759/.

La solution est simple: ne pas utiliser le NativeAdsManager mais charger les annonces directement:

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); 
0

Voici une solution possible:

Voici un FrameLayout personnalisé qui détecte les clics sur elle:

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; 
    } 
} 

utiliser comme ceci:
(1) gonfler votre mise en page d'annonce dans la nouvelle classe de conteneurs:

<com.example.AdContainer 
    android:id="@+id/ad_container" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"/> 

(2) Lorsque vous liez votre annonce à la mise en page, l'enregistrer avec le AdContainer:

AdContainer container = (ViewGroup) findViewById(R.id.ad_container); 
container.setAd(ad, this); // make sure the current class implements AdListener 
0
NativeAdsManager listNativeAdsManager = new NativeAdsManager(activity, "mykey", 5); 

s'il vous plaît ne pas envoyer dans le paramètre de NativeAdsManager est un numéro de demande de demande envoyer dans le serveur à la fois alors envoyez seulement accolades comme

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

cela a fonctionné pour moi ...