Google AdWhirl with Vpon
(2012-07-20 更新)前面幾篇小蛙陸續介紹了Google AdWhirl串接kuAD, AdMob,以及單獨使用AdMob(單獨使用Vpon或kuAD只要直接下載匯入範例就可以囉!),今天要來記錄Google AdWhirl with Vpon,算是三者之中最麻煩的。
由於Vpon會需要用到QRCode讀取套件,因此將Vpon導入Android App中會有比kuAD, AdMob更多步驟,小蛙在導入Vpon的時候發生了很多怪怪的問題,包括了type 17錯誤(已經分不清楚是AdWhirl還是Vpon的錯誤了),就算直接用Sample Code修改adOnKey也還是沒辦法顯示(adOnKey在官網上的顯示是「版位ID」或是英文界面的叫「Banner ID」),小蛙弄到三更半夜還是沒辦法顯示,即使官網上狀態已經顯示「運作中」。今天來記錄一下Google AdWhirl + Vpon。
Vpon註冊及設定部份由於都是中文也還蠻簡單的,這部份小蛙就跳過,如果在註冊上有遇到任何問題也可以直接留言給小蛙,Google AdWhirl設定也跟串接kuAD的時候差不多,只是Function name把它改成容易辨識的名稱,例如:kuAD小蛙取「showKuAD」,就以此類推地把Vpon取名叫做「showVpon」吧!(再次強調這篇使用的是Google AdWhirl)
Vpon AdWhirl比Google AdWhirl多了一個「地區判斷」的功能,因為Vpon是以在地化廣告為宣傳,因此Vpon團隊在AdWhirl中加入了台灣地區及大陸地區的判斷,如果使用者在台灣就會撥放台灣的廣告,反之亦然。由於剛開始串接Vpon的時候遇到了很多奇奇怪怪的問題,因此小蛙使用Google AdWhirl,但新版Vpon AdWhirl應該已經做了修正,如果有兩岸廣告撥放需求的朋友,可以直接使用Vpon AdWhirl來做串接,官方文件提供了詳細的說明。
強烈建議在串接AdWhirl之前,先下載Vpon官方範例程式,修改adOnKey之後跑跑看,如果廣告都沒出現的話,就不用串接了!是不會成功的!使用Vpon AdWhirl串接的朋友可以參考以下方法:
- 註冊Vpon帳號及Vpon AdWhirl帳號(這跟Google AdWhirl不同)
- 在Vpon AdWhirl中新增應用程式(參考AdWhirl with AdMob by Google步驟5)
- 下載最新版的Vpon套件及範例程式。可以在Vpon + AdWhirl SDK中找到。
- 解壓縮後,把專案匯入到Eclipse中(匯入方式請參考Eclipse匯入專案)。小蛙測試時的版本為「android-sdk-adwhirl-3.0.3n」,匯入時選擇「adOnSample_withAdapters」資料夾。
- 將com.android.vpon.addon.AdOnSampleActivity.java中的String adWhirlKey = “ChangeMe“;修改成步驟2得到的SDK Key
- 直接在手機或模擬器上測試就完成了!
上面測試沒有問題才繼續以下部份。下面的步驟紀錄串接Google AdWhirl + Vpon。
- 將上面專案中res/values下的attrs.xml, colors.xml, ids.xml, strings.xml複製到自己專案下,要注意檔案覆蓋問題,保險起見可以開啟這些檔案,例如:開啟strings.xml並複製裡面內容貼到自己的strings.xml。途中有錯誤都先別理它,最後再處理。(2012-07-20 更新)感謝網友ws提醒,要把layout下的capture.xml也複製到自己專案下的layout資料夾裡。
- 用WinRAR分別開啟Google AdWhirl及Vpon AdWhirl,這個目的是要把Vpon的adapter抓到Google AdWhirl中使用(直接把com\adwhirl\adapters\AdOnCNAdapter.class, AdOnTWAdapter.class拉到Google AdWhirl中)。
- 將必須的JAR加入Java Build Path中(kuAD, GoogleAdMobAdsSdk如果沒使用可以不用理它們)。
- 在AndroidManifest.xml中加入以下user permission。
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.CAMERA"/> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" />
- 在AndroidManifest.xml中加入以下activity,要放在<application></application>之間。
<activity android:name="com.vpon.adon.android.WebInApp" android:configChanges="orientation|keyboardHidden|navigation|keyboard" android:label="@string/app_name"/> <activity android:name="com.vpon.adon.android.CrazyAdRun" android:configChanges="orientation|keyboardHidden|navigation|keyboard" android:label="@string/app_name" android:theme="@android:style/Theme.Translucent" /> <activity android:name="com.vpon.adon.android.webClientHandler.QRActivity" android:finishOnTaskLaunch = "true" android:clearTaskOnLaunch = "true" android:configChanges="keyboardHidden|navigation|keyboard" /> <activity android:name="com.vpon.adon.android.webClientHandler.ShootActivity" android:finishOnTaskLaunch = "true" android:clearTaskOnLaunch = "true" android:configChanges="keyboardHidden|navigation|keyboard" /> <activity android:name="com.google.zxing.client.android.HelpActivity" android:finishOnTaskLaunch = "true" android:clearTaskOnLaunch = "true" android:configChanges="keyboardHidden|navigation|keyboard" /> <activity android:name="com.google.zxing.client.android.CaptureActivity" android:finishOnTaskLaunch = "true" android:clearTaskOnLaunch = "true" android:configChanges="orientation|keyboardHidden" android:screenOrientation="landscape" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:windowSoftInputMode="stateAlwaysHidden"> <intent-filter> <action android:name="com.google.zxing.client.android.SCAN"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity> <!-- kuad 的,沒用到kuad的話要拿掉 --> <activity android:name="com.kuad.ADDisplay"/> <!-- AdMob的 --> <activity android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" android:name="com.google.ads.AdActivity" />
- 將上面專案中src下除了com.android.vpon.adon以外的package全部複製下來。
- 在自己專案中的src下貼上。
- 有幾個package及檔案會出現紅色叉叉。
- 開啟有紅色叉叉的檔案,置換.R檔的正確位置(自己主要專案的package)
//import com.android.vpon.adon.R; //change import import com.hans.adwhirl.R;
- 確定都沒有紅色叉叉後,加入呼叫AdWirl程式碼。
package com.hans.adwhirl; import com.adwhirl.AdWhirlLayout; import com.adwhirl.AdWhirlManager; import com.adwhirl.AdWhirlTargeting; import com.adwhirl.AdWhirlLayout.AdWhirlInterface; import com.adwhirl.AdWhirlLayout.ViewAdRunnable; import com.adwhirl.util.AdWhirlUtil; import com.kuad.KuBanner; import com.kuad.kuADListener; import com.vpon.adon.android.AdListener; import com.vpon.adon.android.AdOnPlatform; import com.vpon.adon.android.AdView; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.widget.LinearLayout; import android.widget.LinearLayout.LayoutParams; public class TestAdWhirlActivity extends Activity implements AdWhirlInterface { AdWhirlLayout adWhirlLayout; private static final String ADWHIRL_KEY = "換成自己的Google AdWhirl Key"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 預留放置廣告的layout LinearLayout layout = (LinearLayout)findViewById(R.id.mainLayout); // 初始化 adwhirl layout adWhirlLayout = new AdWhirlLayout(this, ADWHIRL_KEY); AdWhirlManager.setConfigExpireTimeout(1000 * 60); // 年齡 AdWhirlTargeting.setAge(23); // 性別 AdWhirlTargeting.setGender(AdWhirlTargeting.Gender.MALE); // 郵遞區號 AdWhirlTargeting.setPostalCode("115"); // 是否為測試模式,上架時要改成false AdWhirlTargeting.setTestMode(true); // 這行千萬不可以漏掉 adWhirlLayout.setAdWhirlInterface(this); // 將 adwhirl layout 放入我們預留的顯示廣告的 layout 中 layout.addView(adWhirlLayout); } @Override public void adWhirlGeneric() { // TODO Auto-generated method stub } public void showVpon(){ AdView adView = new AdView(this); adView.setLicenseKey("Vpon Banner ID 輸入在這邊(版面ID)", AdOnPlatform.TW, false); adView.setAdListener(new AdListener() { @Override public void onRecevieAd(AdView adView) { Log.d(AdWhirlUtil.ADWHIRL, "Vpon ad success"); adWhirlLayout.adWhirlManager.resetRollover(); adWhirlLayout.handler.post(new ViewAdRunnable(adWhirlLayout, adView)); adWhirlLayout.rotateThreadedDelayed(); } @Override public void onFailedToRecevieAd(AdView adView) { Log.d(AdWhirlUtil.ADWHIRL, "Vpon ad failure"); adView.setAdListener(null); adWhirlLayout.rollover(); } }); } // for kuAD /* public void showKuAD(){ Log.e("showKuAD", "showKuAD()"); final KuBanner banner = new KuBanner(this); banner.setAPID("如果有用kuAD的話,kuAD的APID"); banner.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); banner.setkuADListener(new kuADListener() { @Override public void onRecevie(String arg0) { Log.e("onRecevie", "onRecevie -> " + arg0); adWhirlLayout.adWhirlManager.resetRollover(); adWhirlLayout.handler.post(new ViewAdRunnable(adWhirlLayout, banner)); adWhirlLayout.rotateThreadedDelayed(); } @Override public void onFailedRecevie(String arg0) { Log.e("onFailedRecevie", "showKuAd -> " + arg0); banner.setkuADListener(null); adWhirlLayout.rollover(); } }); } }
- 可以丟到模擬器或手機上執行囉!
我是使用Vpon AdWhirl做串接,Vpon adWhirl 後台設定 Vpon GEO Dispatch,輸入CN License Key
、TW License,adWhirlKey也輸入AdWhirl License Key ,最後在實機或著模擬器,都沒有顯示廣告..以下是adb logcat︰
D/AdWhirl SDK( 278): AdOnTWAdapter failure
D/AdWhirl SDK( 278): Showing ad:
D/AdWhirl SDK( 278): nid: ef75c8622f3c44749adabfbd74
D/AdWhirl SDK( 278): name: adon_tw
D/AdWhirl SDK( 278): type: 21
D/AdWhirl SDK( 278): key: 8a8081823bf25c3f013bff2dca
D/AdWhirl SDK( 278): key2:
D/AdWhirl SDK( 278): Valid adapter, calling handle()
I/AdOnTWAdapter( 278): handler
Dear Zonda:
小蛙可能幫不上你的忙了 >< 太久以前的事情, 而且小蛙之前被 Vpon Adwhirl 弄不出來氣到換成 Google Adwhirl, 之前的經驗是 AdOnTWAdapter failure 這個錯誤的話, "應該"是他要呼叫相對應的 class 的時候沒有辦法載入, 例如: 小蛙在 Google Adwhirl 串接 kuad 跟 vpon 的時候, 如果沒有把 vpon 的 AdOnCNAdapter.class, AdOnTWAdapter.class 放在對應的地方(文章步驟2), 就會出現這個錯誤訊息,當然這也可能只是原因之一(不確定), 建議您可以先試試看原本的 Vpon 是否能正常運作, 也就是單純用 Vpon 先看廣告是否能夠呈現,可以正確呈現後再去串 Adwhirl, 祝您順利囉!
Hi!小蛙~
剛剛突然想到會不會是台灣、中國Vpon後台的應用程式審核狀態亮黃燈的問題...?
Dear Zonda:
的確小蛙之前剛開始在測試 Vpon 的時候,等了好幾天都還是黃燈,
後來寫信給 Vpon 客服,才排除這個問題,
如果您等了幾天都還是黃燈,可以寫信去 Vpon 問問看喔!
大大,好像少寫了一個步驟:
複製layout裡的capture.xml
Dear ws:
感謝您的提醒唷!小蛙以在文章中補上!真的很感謝您 ^_____^
大大你好~
我的AdWhirl串接了Vpon Tw跟Admob
想請問大大 如果遇到國外用戶的話Vpon tw的廣告會顯示嗎 還是跳過由Admob補上?
Dear Eric:
根據小蛙的了解Vpon的adwhirl會自動判斷”台灣地區”及”大陸地區”,
但似乎沒有看到”非台灣、大陸地區”的選項,
小蛙猜測(這只是猜測),如果串連了vpon + admob + google adwhirl,
能做到的功能只有「依比例顯示廣告」,
並不能做到「依地區決定顯示的廣告」。
而vpon + admob + vpon adwhirl可以做到分辨台灣及大陸地區,
並依地區呈現台灣廣告或大陸廣告,
小蛙的判斷台灣、大陸及非兩岸地區,
是額外寫一個「判斷IP地區」的功能,再載入地區對應廣告。
建議您可以試試看在台灣會不會出現vpon以外的廣告,
會的話,小蛙的猜測就沒錯囉!(反之就是小蛙猜錯了)
如果小蛙認知有錯誤的話,歡迎留言告知,感激不盡!
因為我想如果是非兩岸地區而vpon還是顯示中文廣告那感覺就浪費了廣告版面,我期望是就不顯示而改由admob替補上;我會在測試一下 感謝你的回覆 ~ 看你的Android相關文章獲益良多 🙂
^_^ 測試的結果如果不嫌麻煩的話,也歡迎留言讓小蛙知道喔!感恩!!
Vpon廣告會自動對應地區。
在國外的話,就收不到廣告了。
例如:人在美國,收不到台灣的廣告。
然後就可以因為adwhirl的機制,直接顯示admob的廣告。
感謝 Jessy, Eric !!!!
小蛙剛剛去看了這份文件 ~ (之前都沒認真看><)
裡面有個標題How do Allocation Percentages vs. Backfill work?,
Allocation Percentages就是在設定介面中看到的 % of Traffic,
指的是「第一個request的比例」,如果設定成50%,50%就表示兩個廣告第一次Request比例各半,
這裡只有第一個request,跟總廣告播放百分比無關(小蛙被這個騙到了…沒看說明的後果)
Backfill work就是設定頁面中看到的Backfill Priority,
設定priority的功能在於如果第一個request發生錯誤(無法出廣告…等等),
adwhirl會自動切換到第二個priority的廣告。
倘若有種情況是都以第一個廣告為主,第一個廣告播放失敗才換廣告,
就把 % of Traffic 設定成 #1 100%, #2 0% …. (要設定成 On, 0%)
Backfill Priority再設定成 #1 1, #2 2 … 等,
如此一來就會都以第一個廣告為主,無法播放時自動跳到下一個廣告!!!