【问题标题】:Facebook Audience Network showing Ads only when the testing is enabled but not showing ads when the testing option is disabledFacebook Audience Network 仅在启用测试时显示广告,但在禁用测试选项时不显示广告
【发布时间】:2021-11-17 17:54:58
【问题描述】:

我已完成 Facebook Audience Network 实施的所有流程,以便在我的应用中展示广告。我还创建了一个谷歌团队批准的谷歌 admob 账户。我还选择了 Facebook Audience Network 作为广告来源,用于在 google admob 帐户的中介页面下进行竞价,并在 google admob 的中介页面中添加了我的 facebook 业务帐户的展示位置 ID、用户令牌和属性 ID。

问题: 在 facebook 受众网络测试页面中启用测试时,我会收到广告。但是当我在 facebook 受众网络测试页面中禁用测试时,我没有收到广告(Facebook 受众网络测试页面的链接:https://business.facebook.com/pub/testing?business_id=XXXXXXXXXXX)

广告类型:原生广告

我在 recycler 适配器 java 类的帮助下在我的 recyclerview 中加载广告

我的适配器类代码:

public class NewRecentPostAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
        implements ActivityCompat.OnRequestPermissionsResultCallback, AudienceNetworkAds.InitListener{

    private String TAG="NewRecentPostAdapter";
    private Context context;
    private Activity activity;
    //    private List<RecentPostsResponse.Data> recentList;
    private List<Object> recentList;
    private List<Object> finalList;
    private ArrayList<NativeAd> nativeAd = new ArrayList<>();
    private final int ITEM_TYPE_DATA = 0;
    private final int ITEM_TYPE_AD = 1;
    private final int AD_POSITION = 1;
    private final int AD_POSITION_EVERY_COUNT = 5;
    private NativeAdsManager fbNativeManager;
    private static final String  FB_NATIVE_AD_ID = "XXXXXXXXXX";

    public void initNativeAds(){
        MobileAds.initialize(context, new OnInitializationCompleteListener() {
            @Override
            public void onInitializationComplete(InitializationStatus initializationStatus) {
                Map<String, AdapterStatus> statusMap = initializationStatus.getAdapterStatusMap();
                for (String adapterClass : statusMap.keySet()) {
                    AdapterStatus status = statusMap.get(adapterClass);
                    Log.d("MyApp", String.format(
                            "Adapter name: %s, Description: %s, Latency: %d",
                            adapterClass, status.getDescription(), status.getLatency()));
                }

                // Start loading ads here...
                loadingAds();
            }
        });
    }

    public void loadingAds(){
        fbNativeManager.setListener(new NativeAdsManager.Listener() {
            @Override
            public void onAdsLoaded() {
                Log.i(TAG, "onAdsLoaded!" + fbNativeManager.getUniqueNativeAdCount());
                int count = fbNativeManager.getUniqueNativeAdCount();
                for(int i=0; i< count; i ++) {
                    NativeAd ad = fbNativeManager.nextNativeAd();
                    addNativeAd(i, ad);
                }
            }
            @Override
            public void onAdError(AdError adError) {
                Log.i(TAG, "AdError: " + adError.getErrorMessage());
            }
        });
        Log.i(TAG, "isLoaded: " + fbNativeManager.isLoaded());
        fbNativeManager.loadAds();
    }
    public void addNativeAd(int i, NativeAd ad) {
        if (ad == null) {
            return;
        }
        this.nativeAd.add(i, ad);
        if(recentList.size()>0){
            finalList = (List<Object>) recentList.get(0);
            if(finalList.size()>0){
                this.finalList.add(ad);
            }
        }
        notifyDataSetChanged();
    }

    public NewRecentPostAdapter(Activity activity,Context context, List<Object> recentList) {
        this.activity = activity;
        this.context = context;
        this.recentList = recentList;
        fbNativeManager = new NativeAdsManager(context, FB_NATIVE_AD_ID,1);
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        if(viewType == ITEM_TYPE_AD)
        {
            View v = LayoutInflater.from(context).inflate(R.layout.native_ads, parent, false);
            return new NewRecentPostAdapter.NativeAdViewHolder(v);
        }else {
            View v = LayoutInflater.from(context).inflate(R.layout.recent_posts_adapter, parent, false);
            return new NewRecentPostAdapter.PostViewHolder(v);
        }
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        try {
            finalList = (List<Object>) recentList.get(0);
            Object item1 = finalList.get(position);
            NativeAd ad = null;
            boolean isAd = true;
            try {
                RecentAllPostResponse.Data item = (RecentAllPostResponse.Data) item1;
                isAd=false;
            } catch (Exception e) {
                isAd = true;
                ad = (NativeAd) item1;
                e.printStackTrace();
            }

            if(!isAd) {
                RecentAllPostResponse.Data item = (RecentAllPostResponse.Data) item1;
                Log.v(TAG,"FF="+item);
                if (!item.getTitle().isEmpty()){
                    ((NewRecentPostAdapter.PostViewHolder) holder).title.setText(item.getTitle());
                    ((NewRecentPostAdapter.PostViewHolder) holder).title.setSelected(true);
                }else {
                    ((NewRecentPostAdapter.PostViewHolder) holder).title.setText("NA");
                }
                if (!item.getPrice().isEmpty()){
                    NumberFormat format = NumberFormat.getCurrencyInstance(new Locale("en", "in"));
                    ((NewRecentPostAdapter.PostViewHolder) holder).price.setText(format.format(Integer.parseInt(item.getPrice())));
                }else {
                    ((NewRecentPostAdapter.PostViewHolder) holder).price.setText("NA");
                }
                if (!item.getLocation().isEmpty()){
                    ((NewRecentPostAdapter.PostViewHolder) holder).location.setText(item.getLocation());
                }else {
                    ((NewRecentPostAdapter.PostViewHolder) holder).location.setText("NA");
                }

                if (!TextUtils.isEmpty(item.getImage())) {
                    if (item.getImage().contains(",")){
                        String[] splitImage = item.getImage().split(",");
                        Glide.with(context)
                                .load(ImageURL.POST_IMG_PATH+splitImage[0])
                                .fitCenter()
                                .diskCacheStrategy(DiskCacheStrategy.ALL)
                                .placeholder(ContextCompat.getDrawable(context,R.drawable.amo_logo))
                                .into(((NewRecentPostAdapter.PostViewHolder) holder).image);
                    }else {
                        Glide.with(context)
                                .load(ImageURL.POST_IMG_PATH+item.getImage())
                                .fitCenter()
                                .diskCacheStrategy(DiskCacheStrategy.ALL)
                                .placeholder(ContextCompat.getDrawable(context,R.drawable.amo_logo))
                                .into(((NewRecentPostAdapter.PostViewHolder) holder).image);
                    }
                } else {
                    Glide.with(context)
                            .load(R.drawable.picture)
                            .fitCenter()
                            .diskCacheStrategy(DiskCacheStrategy.ALL)
                            .placeholder(ContextCompat.getDrawable(context,R.drawable.amo_logo))
                            .into(((NewRecentPostAdapter.PostViewHolder) holder).image);
                }
                holder.itemView.setOnClickListener(view -> {
                    FragmentTransaction ft = ((FragmentActivity)context).getSupportFragmentManager().beginTransaction();
                    DetailFragment detailFragment = DetailFragment.newInstance(item.getId(), item.getCatId(), item.getBreedId(), item.getAdId(), item.getPostId(), item.getTitle(), item.getDescription(),
                            item.getLocation(), item.getPostDate(), item.getPostBy(), item.getPostProfile(), item.getPostContact(), item.getGender(), item.getColor(), item.getWeight(),
                            item.getHeight(), item.getAge(), item.getPrice(), item.getImage(), item.getSince(), item.getFollowing(), item.getFollowers(),item.getVideo_url());
                    ft.replace(R.id.container, detailFragment);
                    ft.addToBackStack(null);
                    ft.commit();
                });

                ((NewRecentPostAdapter.PostViewHolder) holder).call_btn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if (ActivityCompat.checkSelfPermission(context, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                            // reuqest for permission
                            ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.CALL_PHONE}, amo.REQUEST_CALL);
                        } else {
                            boolean loggedIn = Prefs.getBoolean("isLoggedIn", false);
                            if (loggedIn){
                                String contact = item.getPostContact();
                                if (!contact.isEmpty() && !contact.equalsIgnoreCase("NA")){
                                    Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + contact));
                                    context.startActivity(intent);
                                }else {
                                    amo.showShortSnack(((NewRecentPostAdapter.PostViewHolder) holder).main_lay,"Contact No is Not Valid");
                                }
                            }else {
                                amo.showShortSnack(((NewRecentPostAdapter.PostViewHolder) holder).main_lay,context.getResources().getString(R.string.you_reg_proceed));
                            }
                        }
                    }
                });
                ((NewRecentPostAdapter.PostViewHolder) holder).chat_btn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        boolean loggedIn = Prefs.getBoolean("isLoggedIn", false);
                        if (loggedIn){

                            String postid = item.getPostId();
                            amo.firebase(postid,context,activity);
                        }else {
                            amo.showShortSnack(((NewRecentPostAdapter.PostViewHolder) holder).main_lay,context.getResources().getString(R.string.you_reg_chat));
                        }
                    }
                });

                Log.v(TAG,"FF="+fbNativeManager.isLoaded());
            }else{
                View mNativeView = NativeAdView.render(context, ad, NativeAdView.Type.HEIGHT_300);

                AdView.AdViewLoadConfig loadAdConfig = adView.buildLoadAdConfig()
                        .build();

                adView.loadAd(loadAdConfig);
                ((NewRecentPostAdapter.NativeAdViewHolder) holder).nativeAdContainer.removeAllViews();
                ((NewRecentPostAdapter.NativeAdViewHolder) holder).nativeAdContainer.addView(mNativeView);
            }
        }catch (Exception e){
            e.printStackTrace();
        }

    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case 123: {
                for (int i = 0, len = permissions.length; i < len; i++) {
                    String permission = permissions[i];
                    if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
                        // user rejected the permission
                        boolean showRationale = shouldShowRequestPermissionRationale(activity, permission);
                        if (!showRationale) {
                            // user also CHECKED "never ask again"
                            // you can either enable some fall back,
                            // disable features of your app
                            // or open another dialog explaining
                            // again the permission and directing to
                            // the app setting
                            Log.v("CallOption", "Permission Denied1");
                        } else if (Manifest.permission.CALL_PHONE.equals(permission)) {
                            Log.v("CallOption", "Permission Denied2");
                            // user did NOT check "never ask again"
                            // this is a good place to explain the user
                            // why you need the permission and ask if he wants
                            // to accept it (the rationale)
                        }
                    }
                }
                return;
            }
        }
    }

    @Override
    public int getItemViewType(int position) {
        if(finalList != null && finalList.size()>0 &&
                finalList.get(position) instanceof NativeAd)
            return ITEM_TYPE_AD;
        else
            return ITEM_TYPE_DATA;
    }

    @Override
    public int getItemCount() {
        finalList = (List<Object>) recentList.get(0);
        if(finalList == null)
            return 0;
        return finalList.size();
    }

    @Override
    public void onInitialized(AudienceNetworkAds.InitResult initResult) {

    }

    public class PostViewHolder extends RecyclerView.ViewHolder {
        private AppCompatImageView image;
        private ConstraintLayout main_lay;
        private NoboButton call_btn,chat_btn;
        private AppCompatTextView title, price, location;
        public PostViewHolder(@NonNull View itemView) {
            super(itemView);
            main_lay = itemView.findViewById(R.id.main_lay);
            image = itemView.findViewById(R.id.rec_posts_image);
            title = itemView.findViewById(R.id.rec_posts_title);
            price = itemView.findViewById(R.id.rec_posts_price);
            location = itemView.findViewById(R.id.rec_posts_location);
            call_btn = itemView.findViewById(R.id.call_btn);
            chat_btn = itemView.findViewById(R.id.chat_btn);
        }
    }

    public static class NativeAdViewHolder extends RecyclerView.ViewHolder {
        LinearLayout nativeAdContainer;
        NativeAdViewHolder(@NonNull View itemView) {
            super(itemView);
            nativeAdContainer = itemView.findViewById(R.id.adContainer);
        }
    }
}

使用 MediationTestSuite 时显示错误,我在此附上错误截图供您参考。

帮我解决这个问题

谢谢

【问题讨论】:

  • 您是否至少等待了 48 小时?设置广告后?
  • 是的......我在这个问题上挣扎了两个多星期@Jabbar
  • @noor,你的设备上安装了 Facebook 吗?您可以使用此工具调试 no_fill_reason developers.facebook.com/docs/audience-network/support/…
  • @xilosada 感谢您的宝贵意见。使用此疑难解答时,我在终端命令中收到以下消息 - “No Fill error code [1001] No fill”

标签: admob facebook-audience-network mobile-ad-mediation


【解决方案1】:

感谢您的帮助。我自己解决了这个问题。我所做的操作是,我将“Facebook 原生广告源代码”替换为“谷歌原生广告源代码”。现在它正在通过投标过程显示 Facebook 广告。

  1. FAN(Facebook Audience Network)中的完整投标流程
  2. 在 Google AdMob 中创建中介
  3. 使用“Placement Id”和“System Access Token”将 google AdMob 的中介与我们的 facebook 广告网络项目连接起来
  4. 在安卓应用程序中编写谷歌广告的源代码,从而谷歌广告将通过竞价过程显示Facebook广告。 ---> 这里我使用了我们不应该做的 Facebook 广告源代码
  5. 通过在 google AdMob 中添加设备 ID 作为测试设备来测试广告(它只会显示测试广告)

注意:只有从 google playstore 下载应用程序才会显示原始广告

【讨论】:

    猜你喜欢
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多