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的廣告,通過一些配置就可以得到來自其他廣告聯盟的廣告了,這兩個就下次再寫一篇講講