Внедрение вознагражденного видео AdMob с помощью LibGDX

Я создаю игру с LibGDX и хотел разместить на ней видео с вознаграждением, но я не могу понять, как я это делаю.

Я уже показывал баннер AdMOB с этим руководством: https://www.youtube.com/watch?v=cwAN4LMXo58

Я уже видел этот вопрос, но не понимаю, куда поместить этот код:

public void showVideoAd(){
        runOnUiThread(new Runnable() {
            public void run() {

                if (mAd.isLoaded()) {
                   mAd.show();
                } else {
                    loadRewardedVideoAd();
                }
            }
        });
}

public boolean hasVideoReward(){

    return isRewardLoaded; 
    //return mAd.isLoaded();    // -> must be called on the main UI thread.
}

(во-первых, в нем не объявлено mAd): пример видео-рекламы с вознаграждением в libGDX

И используя еще несколько советов, я провел несколько экспериментов, будучи последним:

AdHandler.java:

public interface AdHandler {
    public void showVideo();
}

AndroidLauncher:

public class AndroidLauncher extends AndroidApplication implements AdHandler {
    RewardedVideoAd rewardedVideoAd;

    @Override
    public void showVideo() {
        if (rewardedVideoAd.isLoaded()) {
            rewardedVideoAd.show();
        }
    }

        Handler handler = new Handler();
        @Override
        protected void onCreate (Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
            initialize(new Restart(this), config);

            rewardedVideoAd = MobileAds.getRewardedVideoAdInstance(this);
            rewardedVideoAd.setRewardedVideoAdListener(new RewardedVideoAdListener() {
            @Override
            public void onRewardedVideoAdLoaded() {

            }

            @Override
            public void onRewardedVideoAdOpened() {

            }

            @Override
            public void onRewardedVideoStarted() {

            }

            @Override
            public void onRewardedVideoAdClosed() {

            }

            @Override
            public void onRewarded(RewardItem rewardItem) {

            }

            @Override
            public void onRewardedVideoAdLeftApplication() {

            }

            @Override
            public void onRewardedVideoAdFailedToLoad(int i) {

            }
        });

        loadRewardedVideoAd();
    }

    private void loadRewardedVideoAd() {
        rewardedVideoAd.loadAd("ca-app-pub-3940256099942544/5224354917", new AdRequest.Builder().build());
    }
}

Тогда у меня есть этот код на класс Android:

AdHandler adHandler;

    public Restart(AdHandler handler) {
         this.adHandler = handler;
    }

И в конце концов я просто позвоню

    adHandler.showVideo();

на render() что выдает ошибку

java.lang.IllegalStateException: isLoaded должен вызываться в основном потоке пользовательского интерфейса.

(что я действительно не знаю, что значит)

Если бы кто-нибудь мог дать мне полноценный рабочий проект с LibGDX + AdMob Rewarded Videos, было бы здорово.

[РЕДАКТИРОВАТЬ]

Так что после нескольких тестов я смог заставить его работать, мне нужно было только изменить

    @Override
    public void showVideo() {
        if (rewardedVideoAd.isLoaded()) {
            rewardedVideoAd.show();
        }
    }

в

@Override
public void showVideo() {
    runOnUiThread(new Runnable() {
        @Override public void run() {
            if (rewardedVideoAd.isLoaded()) {
                rewardedVideoAd.show();
            }
        }
    });
}

и это решило ошибку, о которой я говорил ранее.

Теперь код выглядит так:

AdHandler.java: без изменений

Andoid Launcher:

public class AndroidLauncher extends AndroidApplication implements AdHandler {
    RewardedVideoAd rewardedVideoAd;

    @Override
    public void showVideo() {
        runOnUiThread(new Runnable() {
            @Override public void run() {
                if (rewardedVideoAd.isLoaded()) {
                    rewardedVideoAd.show();
                }
            }
        });
    }

    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
        initialize(new Restart(this), config);

        MobileAds.initialize(this, "ca-app-pub-3940256099942544~3347511713");

        rewardedVideoAd = MobileAds.getRewardedVideoAdInstance(this);
        rewardedVideoAd.loadAd("ca-app-pub-3940256099942544/5224354917", new AdRequest.Builder().build());
        rewardedVideoAd.setRewardedVideoAdListener(new RewardedVideoAdListener() {
            @Override
            public void onRewardedVideoAdLoaded() {

            }

            @Override
            public void onRewardedVideoAdOpened() {

            }

            @Override
            public void onRewardedVideoStarted() {

            }

            @Override
            public void onRewardedVideoAdClosed() {
                rewardedVideoAd.loadAd("ca-app-pub-3940256099942544/5224354917", new AdRequest.Builder().build());
            }

            @Override
            public void onRewarded(RewardItem rewardItem) {

            }

            @Override
            public void onRewardedVideoAdLeftApplication() {

            }

            @Override
            public void onRewardedVideoAdFailedToLoad(int i) {

            }
        });
    }
}

Андоид Класс:

public class RewVideo extends ApplicationAdapter {
    AdHandler adHandler;
    public Restart(AdHandler handler) {
        this.adHandler = handler;
    }


    @Override
    public void create () {

    }

    @Override
    public void render () {
        if (Gdx.input.justTouched()) {
            adHandler.showVideo();
        }
    }

Тем не менее, он заполняет мой журнал странными сообщениями и исключениями:

W/Ads: вызвать метод getInstance Firebase. java.lang.ClassNotFoundException: не найден класс "com.google.android.gms.measurement.AppMeasurement" по пути:

Google Mobile Ads SDK не будет интегрирован с Firebase. Для интеграции Admob/Firbase требуется последняя версия Firebase SDK, но Firebase SDK либо отсутствует, либо устарел

W/Ads: Параметры сервера: {...}

W / DynamiteModule: класс дескриптора локального модуля для com.google.android.gms.ads.dynamite не найден.

W / OkHttpClient: произошла утечка соединения с https://googleads.g.doubleclick.net/. Вы забыли закрыть тело ответа?

W / MessageQueue: Обработчик (android.os.Handler) {c84505c} отправляет сообщение обработчику в мертвом потоке java.lang.IllegalStateException: Обработчик (android.os.Handler) {c84505c} отправляет сообщение обработчику в мертвом потоке

W/ExoPlayerImplInternal: отправлено сообщение (1) после освобождения. Сообщение игнорируется.

E / ACodec: [OMX.google.h264.decoder] setPortMode при выводе в DynamicANWBuffer не удалось с ошибкой -1010

И во время воспроизведения видео это сообщение появляется примерно раз в секунду:

W / zygote: попытка удалить локальную ссылку, не являющуюся JNI, выводить поток

И помимо того, что это тонны сообщений, я также заметил, что для каждого из них есть два сообщения: "Объявление завершено", "Открытие объявления" и "Объявление закрыто".

Это нормально?

0 ответов

Другие вопросы по тегам