一直报: 广告SDK未Ready, 请在load(请求广告)之前,先调用init and start方法,以避免无法请求广告

一直报: 广告SDK未Ready, 请在load(请求广告)之前,先调用init and start方法,以避免无法请求广告

检查appid、包名、签名是否对应
穿山甲创建的测试app 没有填写包名 签名
appid 填写正确
没解决 顶一下
public void _init() {
Context context = this.getContext();
GMMediationAdSdk.initialize(context, buildV2Config(context));
if (sInit) {
return;
}
sInit = true;
// 预加载广告
Iterator<IADData> it = sAd.values().iterator();
loopLoad(it);
}
public void playAd(JSONObject msg) {
try {
// 广告位ID
String id = msg.getString("videoId");
// 广告位名称
String name = msg.getString("videoName");
// 透传数据
JSONObject ext = msg.getJSONObject("data");
IADData iadData = sAd.get(id);
iadData.ext = ext;
Context context = this.getContext();
switch (iadData.state) {
case Err:
case Played:
case Empty:
iadData.reset();
toast(context, "广告加载中,请稍后再试");
// 重新加载广告
load(iadData, new AdLoadCallBack() {
@Override
public void adLoaded(IADData adData) {
// TODO: 通知主动广告加载完成
if (adData.state == AdState.Loaded) {
toast(context, String.format("%s广告加载完成", iadData.adName));
}
}
});
return;
case Loading:
toast(this.getContext(), "广告加载中,请稍后再试");
return;
case Loaded:
break;
}
iadData.state = AdState.Playing;
// 播放完成的情况,或者跳过表示看完广告,或者点击了下载的Bar也算完成
iadData.ad.setRewardAdListener(new GMRewardedAdListener() {
@Override
public void onVideoComplete() {
iadData.state = AdState.Played;
completedAd(iadData, true, 0, "");
}
@Override
public void onVideoError() {
iadData.state = AdState.Played;
completedAd(iadData, false, 1, "播放失败");
Log.d(TAG, "视频播放失败");
iadData.reset();
load(iadData, new AdLoadCallBack() {
@Override
public void adLoaded(IADData adData) {
Log.d(TAG, "失败视频重新加载完成");
}
});
}
@Override
public void onRewardClick() {
}
@Override
public void onRewardVerify(@NonNull RewardItem rewardItem) {
}
@Override
public void onRewardedAdClosed() {
Log.d(TAG, "广告关闭");
iadData.reset();
load(iadData, new AdLoadCallBack() {
@Override
public void adLoaded(IADData adData) {
Log.d(TAG, "广告重新加载完成");
}
});
}
@Override
public void onRewardedAdShow() {
Log.d(TAG, "广告开始播放");
}
@Override
public void onRewardedAdShowFail(@NonNull AdError adErrorr) {
iadData.state = AdState.Played;
completedAd(iadData, false, 1, "播放失败");
Log.d(TAG, "视频播放失败");
iadData.reset();
load(iadData, new AdLoadCallBack() {
@Override
public void adLoaded(IADData adData) {
Log.d(TAG, "失败视频重新加载完成");
}
});
}
@Override
public void onSkippedVideo() {
iadData.state = AdState.Played;
completedAd(iadData, true, 0, "");
Log.d(TAG, "跳过广告");
}
});
iadData.ad.showRewardAd((Activity) context);
} catch (JSONException e) {
e.printStackTrace();
}
}
/**
* 加载广告
*
* @param adData 广告map迭代器
*/
private void load(IADData adData, AdLoadCallBack loadCallBack) {
// 正在播放的广告,或者已经加载完成的广告
switch (adData.state) {
case Loading:
return;
case Loaded:
case Playing: {
loadCallBack.adLoaded(adData);
return;
}
case Err:
case Empty:
case Played:
default:
adData.reset();
break;
}
// 转为加载状态
adData.state = AdState.Loading;
Context context = this.getContext();
GMRewardAd mGMRewardAd = new GMRewardAd((Activity) context, adData.adSite);
/**
* 激励视频服务端验证,GroMore会把设置的字符串透传给相应的ADN
*/
Map<String, String> customData = new HashMap<>();
customData.put(GMAdConstant.CUSTOM_DATA_KEY_PANGLE, "pangle media_extra");
customData.put(GMAdConstant.CUSTOM_DATA_KEY_GDT, "gdt custom data");
customData.put(GMAdConstant.CUSTOM_DATA_KEY_KS, "ks custom data");
customData.put(GMAdConstant.CUSTOM_DATA_KEY_SIGMOB, "sigmob custom data");
customData.put(GMAdConstant.CUSTOM_DATA_KEY_MINTEGRAL, "mintegral custom data");
customData.put(GMAdConstant.CUSTOM_DATA_KEY_BAIDU, "baidu custom data");
// 如果开启了gromre服务端激励验证,可以传以下信息,跟adn无关。
customData.put(GMAdConstant.CUSTOM_DATA_KEY_GROMORE_EXTRA, "gromore serverside verify extra data"); // 会透传给媒体的服务器
/**
* 创建激励广告请求类型参数GMAdSlotRewardVideo,具体参数含义参考文档
*/
GMAdSlotRewardVideo adSlotRewardVideo = new GMAdSlotRewardVideo.Builder()
.setMuted(true)//对所有SDK的激励广告生效,除需要在平台配置的SDK,如穿山甲SDK
.setVolume(0f)//配合Admob的声音大小设置[0-1]
.setGMAdSlotGDTOption(GMAdOptionUtil.getGMAdSlotGDTOption().build())
.setGMAdSlotBaiduOption(GMAdOptionUtil.getGMAdSlotBaiduOption().build())
.setCustomData(customData)
.setRewardName("金币") //奖励的名称
.setRewardAmount(3) //奖励的数量
.setUserID("user123")//用户id,必传参数
.setUseSurfaceView(false) // 是否使用SurfaceView绘制,默认false。目前仅针对百度生效,建议使用false,否则百度会黑屏。
.setOrientation(GMAdConstant.VERTICAL)//必填参数,期望视频的播放方向:GMAdConstant.HORIZONTAL 或 GMAdConstant.VERTICAL
.setBidNotify(true)//开启bidding比价结果通知,默认值为false
.build();
mGMRewardAd.loadAd(adSlotRewardVideo, new GMRewardedAdLoadCallback() {
@Override
public void onRewardVideoAdLoad() {
// 广告加载完成了
adData.state = AdState.Loaded;
adData.ad = mGMRewardAd;
Log.d(TAG, String.format("广告预加载加载完成: 广告位ID= %s, 位置名称=%s", adData.adSite, adData.adName));
loadCallBack.adLoaded(adData);
}
@Override
public void onRewardVideoCached() {
}
@Override
public void onRewardVideoLoadFail(@NonNull AdError adError) {
adData.state = AdState.Err;
adData.errCode = adError.code;
adData.errorMsg = "preload failed! the msg = " + adError.message;
Log.d(TAG, String.format("广告加载失败: 广告位ID = %s 广告位名称=%s, 错误:%s", adData.adSite, adData.adName, adError.message));
loadCallBack.adLoaded(adData);
}
});
}
我也碰到过,sdk初始化完了需要启动。