我正在用 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();
}
安卓启动器:
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 必须在主 UI 线程上调用。
(我真的不知道是什么意思)
如果有人能给我一个完整的 LibGDX + AdMob 奖励视频项目,那就太棒了。
[编辑]
所以经过几次测试后,我已经能够让它工作,我只需要改变
@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:未更改
安卓启动器:
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:调用 Firebase 方法 getInstance 错误。java.lang.ClassNotFoundException:在路径上找不到类“com.google.android.gms.measurement.AppMeasurement”:
Google 移动广告 SDK 不会与 Firebase 集成。Admob/Firbase 集成需要最新的 Firebase SDK jar,但 Firebase SDK 丢失或过期
带广告:服务器参数:{...}
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] 输出到 DynamicANWBuffer 时的 setPortMode 失败 w/err -1010
在播放视频时,此消息每秒出现一次:
W/zygote:尝试删除非 JNI 本地引用,转储线程
除了大量消息之外,我还注意到每个消息都有两条消息:“广告加载完成”、“广告打开”和“广告关闭”
这是正常的吗?