【问题标题】:RewardedVideoAd callback listener mismatchRewardedVideoAd 回调侦听器不匹配
【发布时间】:2019-10-12 12:39:37
【问题描述】:

我已实现RewardedVideoAd 以使用 PRO 功能。

当我在整个应用程序中使用RewardedVideoAd 1 次(在单个屏幕中)时,它可以完美运行。 但是当我多次使用(在多个屏幕中)时,RewardedVideoAd 回调监听器是两个屏幕之间的不匹配。

让我解释一下整个场景

  1. 我打开了SCREEN-A,然后我看了RewardedVideoAd。成功完成此视频后,我获得了奖励。
  2. 现在我要去下一个屏幕-B
  3. 然后,我将进入下一个 SCREEN-C 并以 SCREEN-B 完成。
  4. 所以,现在应用状态处于前台状态 SCREEN-C 和后台状态 SCREEN-A
  5. 现在我正在 SCREEN-C 中观看 RewardedVideoAd。成功完成此视频后,我获得了奖励。
  6. 然后我关闭了SCREEN-C。因此,我重定向到处于后台状态的 SCREEN-A
  7. 现在我正在 SCREEN-A 中观看 RewardedVideoAd。成功完成此视频后。我没有得到奖励。

所以问题是我上次在 SCREEN-C 中观看了视频。所以所有回调都将转到 SCREEN-C,而不是 SCREEN-A

我还在所有屏幕中实现了以下代码。

@Override
public void onResume() {
    mRewardedVideoAd.resume(this);
    super.onResume();
}

@Override
public void onPause() {
    mRewardedVideoAd.pause(this);
    super.onPause();
}

@Override
public void onDestroy() {
    mRewardedVideoAd.destroy(this);
    super.onDestroy();
}

【问题讨论】:

  • 能否请您发布 RewaredVideoAdListener 的代码以及您在哪个屏幕上实现了它?
  • @abhishesh 我已严格按照 Google AdMob 文档执行此 RewardedVideoAd。 developers.google.com/admob/android/rewarded-ads 我已经在 SCREEN A 和 SCREEN C 中实现了这个。
  • 你在使用 HandleOnAdRewarded() 方法吗?
  • @mayurkukadiya 是的,我已经实现了所有的监听器。
  • 您需要在广告完成后取消订阅事件句柄。请参阅此参考。 stackoverflow.com/questions/50290851/…

标签: android admob admob-rewardedvideoad


【解决方案1】:

我已经制作了一个通用模块来显示RewardedVideoAd。你可以试试这个。我认为它可能会解决您的问题。

放在项目中的类下面。

AdRewardedHandler.java

public class AdRewardedHandler {

    private static final String TAG = "AdRewardedHandler";

    private Context context;
    private static AdRewardedHandler adRewardedHandler;

    private RewardedVideoAd rewardedVideoAd;
    private RewardedAdListener rewardedAdListener;

    private boolean isFailedToLoad = false;


    public static AdRewardedHandler getInstance() {
        if (adRewardedHandler == null) {
            adRewardedHandler = new AdRewardedHandler();
        }
        return adRewardedHandler;
    }

    public void initializeRewardedHandler(Context context) {
        this.context = context;
        rewardedVideoAd = MobileAds.getRewardedVideoAdInstance(context);
        loadRewardedVideoAd();
    }

    public void setAdHandlerListener(RewardedAdListener rewardedAdListener1) {
        this.rewardedAdListener = rewardedAdListener1;
    }

    public boolean isAdLoaded() {
        if (rewardedVideoAd != null) {
            return rewardedVideoAd.isLoaded();
        } else {
            return false;
        }
    }

    public void loadRewardedVideoAd() { 

        rewardedVideoAd.loadAd("ca-app-pub-3940256099942544/5224354917",new AdRequest.Builder().build());
        rewardedVideoAd.setRewardedVideoAdListener(new RewardedVideoAdListener() {

            @Override
            public void onRewardedVideoAdLoaded() {
                Log.i(TAG, "onRewardedVideoAdLoaded: ");
                if (rewardedAdListener != null) {
                    rewardedAdListener.onRewardedVideoAdLoaded();
                }

            }

            @Override
            public void onRewardedVideoAdOpened() {
                Log.i(TAG, "onRewardedVideoAdOpened: ");

                if (rewardedAdListener != null) {
                    rewardedAdListener.onRewardedVideoAdOpened();
                }
            }

            @Override
            public void onRewardedVideoStarted() {
                Log.i(TAG, "onRewardedVideoStarted: ");
                if (rewardedAdListener != null) {
                    rewardedAdListener.onRewardedVideoStarted();

                }
            }

            @Override
            public void onRewardedVideoAdClosed() {
                Log.i(TAG, "onRewardedVideoAdClosed: ");
                if (rewardedAdListener != null) {
                    rewardedAdListener.onRewardedVideoAdClosed();
                    if (!isAdLoaded()) {
                        loadRewardedVideoAd();
                    }
                }
            }

            @Override
            public void onRewarded(RewardItem var1) {
                Log.i(TAG, "onRewarded: " + var1);
                if (rewardedAdListener != null) {
                    rewardedAdListener.onRewarded(var1);
                }
            }

            @Override
            public void onRewardedVideoAdLeftApplication() {
                Log.i(TAG, "onRewardedVideoAdLeftApplication: ");
                if (rewardedAdListener != null) {
                    rewardedAdListener.onRewardedVideoAdLeftApplication();
                }
            }

            @Override
            public void onRewardedVideoAdFailedToLoad(int var1) {
                Log.i(TAG, "onRewardedVideoAdFailedToLoad: " + var1);
                if (!isFailedToLoad) {
                    isFailedToLoad = true;
                    if (!isAdLoaded()) {
                        loadRewardedVideoAd();
                    }
                }

                if (rewardedAdListener != null) {
                    rewardedAdListener.onRewardedVideoAdFailedToLoad(var1);

                }


            }

            @Override
            public void onRewardedVideoCompleted() {
                Log.i(TAG, "onRewardedVideoCompleted: ");
                if (rewardedAdListener != null) {
                    rewardedAdListener.onRewardedVideoCompleted();
                    if (!isAdLoaded()) {
                        loadRewardedVideoAd();
                    }
                }

            }
        });


    }


    public void showRewardedAd(RewardedAdListener rewardedAdListener1) {

        setAdHandlerListener(rewardedAdListener1);

        Log.i(TAG, "showRewardedAd: ");

        try {
            if (rewardedVideoAd != null && rewardedVideoAd.isLoaded()) {
                rewardedVideoAd.show();
            }
        } catch (Throwable th) {
            th.printStackTrace();
        } 

    }

    public void onResume() {
        Log.i(TAG, "onResume: Resume Call :");
        if (rewardedVideoAd != null) {
            rewardedVideoAd.resume(context);
        }
    }

    public void onPause() {
        Log.i(TAG, "onPause: Pause Call : ");
        if (rewardedVideoAd != null) {
            rewardedVideoAd.pause(context);
        }
    }

    public void onDestroy() {
        Log.i(TAG, "onDestroy: Destroy Call :");
    }


    public interface RewardedAdListener {

        void onRewardedVideoAdLoaded();

        void onRewardedVideoAdOpened();

        void onRewardedVideoStarted();

        void onRewardedVideoAdClosed();

        void onRewarded(RewardItem var1);

        void onRewardedVideoAdLeftApplication();

        void onRewardedVideoAdFailedToLoad(int var1);

        void onRewardedVideoCompleted();
    }
}

在您的应用程序文件中添加以下行。

AdRewardedHandler.getInstance().initializeRewardedHandler(this);

现在,终于来了如何使用

public class YourActivity extends AppCompatActivity implements AdRewardedHandler.RewardedAdListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        AdRewardedHandler.getInstance().setAdHandlerListener(this);

        if (!AdRewardedHandler.getInstance().isAdLoaded()) {
            AdRewardedHandler.getInstance().loadRewardedVideoAd();
        }

    }

    public void showRewardedVideoAd() {
        // showRewardedAd                            
        AdRewardedHandler.getInstance().showRewardedAd(this);
    }

    @Override
    public void onResume() {
        AdRewardedHandler.getInstance().onResume();
        super.onResume();
    }


    @Override
    public void onPause() {
        AdRewardedHandler.getInstance().onPause();
        super.onPause();
    }

    @Override
    public void onRewardedVideoAdLoaded() {
        Log.i(TAG, "onRewardedVideoAdLoaded: ");
    }

    @Override
    public void onRewardedVideoAdOpened() {
        Log.i(TAG, "onRewardedVideoAdOpened: ");
    }

    @Override
    public void onRewardedVideoStarted() {
        Log.i(TAG, "onRewardedVideoStarted: ");
    }

    @Override
    public void onRewardedVideoAdClosed() {
        Log.i(TAG, "onRewardedVideoAdClosed: ");
    }

    @Override
    public void onRewardedVideoAdLeftApplication() {
        Log.i(TAG, "onRewardedVideoAdLeftApplication: ");
    }

    @Override
    public void onRewardedVideoAdFailedToLoad(int var1) {
        Log.i(TAG, "onRewardedVideoAdFailedToLoad: " + var1);
    }

    @Override
    public void onRewardedVideoCompleted() {
        Log.i(TAG, "onRewardedVideoCompleted: ");
    }

}

【讨论】:

    【解决方案2】:

    我也遇到了同样的问题。就我而言,当我从 Activity A 转到 B 时,我的 Activity A 在后台,而 Activity B 在前台,现在当我回到 Activity A 时,我没有收到 RewardedVideoAds 的回调。

    我以简单的方式解决了这个问题,当我回到 Activity A 时,我在 OnResume 方法中设置了监听器。

     @Override
     public void onResume() {
        super.onResume();
        Log.i(TAG, "onResume Call.");
    
        if (rewardedVideoAd != null) {
            rewardedVideoAd.setRewardedVideoAdListener(this);
            rewardedVideoAd.resume(activity);
        }
    }
    

    请注意,对于此解决方案,您必须从 Activity B 中删除这两行。

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.e(TAG, "onDestroy: ");
        rewardedVideoAd.destroy(activity);
        rewardedVideoAd.setRewardedVideoAdListener(null);
    }
    

    【讨论】:

      【解决方案3】:

      我认为它与这个问题有关Rewarded Video Ads never die。如果它的问题相同,您可以作为解决方法解决此问题:

      您应该在调用 destroy 之前明确取消设置 RewardedVideoAd 的侦听器,因为 destroy 不会为您执行此操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-23
        • 2016-06-14
        • 1970-01-01
        • 2012-04-01
        • 1970-01-01
        相关资源
        最近更新 更多