Внедрение вознагражденного видео 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, выводить поток
И помимо того, что это тонны сообщений, я также заметил, что для каждого из них есть два сообщения: "Объявление завершено", "Открытие объявления" и "Объявление закрыто".
Это нормально?