有偿 有偿! cocoscreator 2.4 对接穿山甲广告

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

image

检查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初始化完了需要启动。