1. 程式人生 > >CocosCreator Android專案整合Admob

CocosCreator Android專案整合Admob

AndroidStudio整合Admob

前段時間公司的遊戲開發的差不多了,集成了一些SDK,本次要說的就是其中之一的Admob,這個變現sdk就不用介紹了吧,看到這個文章的肯定都知道是什麼,實在不清楚就去玩玩度娘。其實Android應用接入Admob沒什麼複雜的地方,只不過手上這個應用是CocosCreator開發的遊戲,就是在一個Activity上面加了個GLView,然後渲染,要接入SDK需要稍微繞一點點彎路,然後國內的網路環境也堪憂,有可能會在測試的時候帶來麻煩。

Android GL執行緒與UI執行緒通訊

熟悉Cocos的同學都知道,我們的遊戲都是在一個GLview上進行的,遊戲開發的語言是js,要想與UI執行緒通訊,就需要引擎提供的api

jsb.reflection.callStaticMethod('類路徑', '方法名', '引數簽名', '引數列表');

只有靜態方法可以通過這個方式進行呼叫,關於這個方法的詳細說明就不過多贅述,官方文件有很詳細的講解 [ 傳送門 ]

接入Admob依賴庫

首先在工程級的build.gradle中新增依賴(最外層的那個build.gralde檔案)

allprojects {
    repositories {
        jcenter()
        maven {
            url "https://maven.google.com"
        }
    }
}

再在app級的build.gradle中新增相關庫的依賴(定義了applicationid等應用資訊的那個build.gradle)

dependencies {
    //new dependence
    implementation 'com.google.android.gms:play-services-ads:15.0.0'
}

到這裡庫的配置就弄完了,可以開始擼程式碼了

注意,Admob要求的Target Android API level 最低是14,不然編譯階段會提示你修改

接入Banner廣告

Banner廣告就是一個顯示在螢幕某個位置的橫幅廣告,難以避免地會佔用遊戲節目,是個很不友好的廣告,在Android原生應用中,可以直接在要植入廣告的介面的xml佈局裡面直接把banner廣告佈局填進去,適配也非常的簡單,但是我這遊戲就不行,cocos的長度單位與Android的不一樣,需要經過一些換算才能得到正確的大小,Banner廣告展示的大小,SDK有提供了很多尺寸的選擇,其中Smart Banner是SDK自己進行適配,如果廣告內容把遊戲內容遮擋了,這肯定是非常不好的,所以我非常鹹魚的選擇了最小的尺寸(快速迭代嘛,以後再優化 >_< ),下面直接貼程式碼

 //首先初始化Admob mActivity就是遊戲的主Activity,admob相關的id找讓你接sdk的人要,嘻嘻
 MobileAds.initialize(mActivity,mActivity.getResources().getString(R.string.admob_appid));

 mActivity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                bannerAd = new AdView(mActivity);
                bannerAd.setAdUnitId(mActivity.getResources().getString(R.string.admob_banner_id));
                bannerAd.setAdSize(AdSize.BANNER);
                bannerAd.setAdListener(bannerAdListener);

                AdRequest adRequest = new AdRequest.Builder()
                        .addTestDevice("test_device_id")
                        .build();
                bannerAd.loadAd(adRequest);
            }
        });
     public static AdListener bannerAdListener = new AdListener(){
        @Override
        public void onAdLoaded() {
            mActivity.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    if(bannerAd.getParent() == null){
                        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT);
                        params.gravity = Gravity.BOTTOM;
                        mActivity.addContentView(bannerAd, params);
                    }else{  }
                }
            });
         }

        @Override
        public void onAdFailedToLoad(final int errorCode) { }

        @Override
        public void onAdOpened() { }

        @Override
        public void onAdLeftApplication() {  }

        @Override
        public void onAdClosed() { });
        }

    };

由於我們不能直接在GL thread去修改UI thread,所以我們這裡用了個runOnUIthread包裝了一下,也可以用其他方式去實現
bannerAd.setAdListener(bannerAdListener) 是廣告的生命週期的監聽函式,廣告的狀態發生變化都會再這裡得到通知,我這裡在廣告Load成功後對banner廣告的UI進行了操作,如果Banner沒有新增到Activity中就把它新增進去,並且把它放到了螢幕最底部,之所以加判斷是因為Banner是會自己進行一定頻率的重新整理,如果每次Load成功都去新增一個到場景,老闆知道了就要開除我了

接入插屏廣告

插屏廣告·是一種完全覆蓋遊戲的廣告,需要使用者手動點選關閉按鈕才會消失,這個的接入相比Banner就簡單點了,由於產品要求要確保廣告在某個時間點彈出來,所以插屏這裡我預先進行了Load操作,然後在要展示的時候才show它,因為載入插屏是有一定的延遲的,如果廣告內容是視訊的話,延遲就更明顯了,還是貼上程式碼

//載入插屏廣告
mActivity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Log.e(DEBUG_TAG,"loadInterstitial");
                AdRequest request = new AdRequest.Builder()
                        .addTestDevice("test_device_id")
                        .build();
                interstitialAd.setAdListener(interstitialAdListener);
                interstitialAd.loadAd(request);
            }
        });
//展示插屏廣告
        //一定要確保在UI執行緒操作
        mActivity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if(interstitialAd.isLoaded()){
                    interstitialAd.show();
                }else if(interstitialAd.isLoading()){
                }else{
                    //如果沒有loading,或者load失敗了就進行load
                    loadInterstitial(curInterstitialAdPos);
                }
            }
        });
        public static AdListener interstitialAdListener = new AdListener(){}

接入視訊廣告

視訊廣告的接入和插屏幾乎一樣,非常簡單,這次需要用到廣告的回掉,因為這涉及到觀看廣告的獎勵的發放,
talk is cheap, show me the code~

//load
        mActivity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                AdRequest adRequest = new AdRequest.Builder().build();
                rewardedVideoAd.loadAd(mActivity.getResources().getString(R.string.admob_rewardedvideo_id),adRequest);
            }
        });
//show
mActivity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if(rewardedVideoAd.isLoaded()){
                    rewardedVideoAd.show();
                }else{
                    loadRewardedVideo();
                }
            }
        });
//廣告回掉
    //收到這個回掉表示使用者完整觀看了視訊廣告,需要發放獎勵
    @Override
    public void onRewarded(RewardItem rewardItem) {
        Log.e(DEBUG_TAG,"onRewarded");
    }

Always test with test ads !

進行測試的時候儘量使用文件提供的測試id,一來可以排除掉市場人員app廣告資訊配置錯誤,二來這也是官方要求的(不要刷廣告),其實刷也沒用,刷著刷著就不給你展示廣告了

我為什麼突然沒廣告看了!

先別急,這一般不是我們程式設計師的問題(先甩鍋),廣告沒有按預期播放一般有4個原因:
1.INTERNAL_ERROR(內部錯誤) 2.INVALID_REQUEST(非法請求) 3.NETWORK_ERROR(網路錯誤) 4.NOT_FILL(未填充)
所以測試的時候最好能把這些資訊實時的輸出出來,免得他們說沒廣告了又得查日誌看什麼原因(=_=)

有了AndroidStudio,接入廣告真的簡單了好多,其實還有原生廣告和中介還麼有說到,原生廣告真的是非常的坑爹,這裡簡單說下中介,通過中介我們可以去接入一些其他的廣告來源,目前文章中就能得到來自Admob的廣告,通過一些配置就可以得到來自其他廣告聯盟的廣告了,這兩個就下次再寫一篇講講