Android Integeration with AdMob Mediation 2017
跳至導覽
跳至搜尋
AdMob網站: https://apps.admob.com/
新增廣告單元
新增廣告聯播網
- 點選 "自訂事件" , 依欄位填入
- Class Name: 用於實作 com.google.android.gms.ads.mediation.customevent.CustomEventBanner 的類別名稱, 必須輸入完整的package name, 如com.taiwanmobile.pt.adp.mediation.TAMediaBanner
- Label: 任意自定的名稱
- Parameter: 請填入您的TAMedia版位ID (可向您的TAMedia窗口詢問)
程式整合-Getting Started
- 1. 請參考AdMob for Android網站提供的方式整合Google Ads SDK
- 2. 下載 TAMedia Android SDK, 並參考 "開始使用Getting Started" 整合TAMedia Android SDK
- 3. 加入必要的權限
- TWMAd服務需使用 "存取網路狀態"、"讀取約略位置"、"網路" 等權限,請在AndroidManifest.xml檔案當中進行下列權限的宣告。
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- MADP SDK4.0以上版本請移除 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <!-- optional --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- optional --> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.VIBRATE" /> <!-- optional -->
- 4. 加入必要的Activity
<!-- TAMedia Activities --> <activity android:name="com.taiwanmobile.pt.adp.view.TWMAdActivity" android:configChanges="orientation|keyboardHidden|navigation|keyboard|screenLayout|uiMode|screenSize|smallestScreenSize" android:hardwareAccelerated="true" android:theme="@android:style/Theme.Translucent" > </activity> <!-- Google Play Service Activities --> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> <activity android:name="com.google.android.gms.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" />
程式整合-Mediation Code
Banner
- 依照下列方式實作AdMob所提供的CustomEventBanner
package com.taiwanmobile.pt.adp.mediation;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdSize;
import com.google.android.gms.ads.mediation.MediationAdRequest;
import com.google.android.gms.ads.mediation.customevent.CustomEventBanner;
import com.google.android.gms.ads.mediation.customevent.CustomEventBannerListener;
import com.taiwanmobile.pt.adp.view.TWMAd;
import com.taiwanmobile.pt.adp.view.TWMAdRequest;
import com.taiwanmobile.pt.adp.view.TWMAdRequest.ErrorCode;
import com.taiwanmobile.pt.adp.view.TWMAdSize;
import com.taiwanmobile.pt.adp.view.TWMAdView;
import com.taiwanmobile.pt.adp.view.TWMAdViewListener;
import java.util.Calendar;
import java.util.Date;
// 需將本class的完整類別名稱 com.taiwanmobile.pt.adp.mediation.TAMediaBanner註冊於mediation的設定頁面上, 如前述章節所述
public class TAMediaBanner implements CustomEventBanner {
private static final String TAG = "TAMediaBanner";
private TWMAdView adView = null;
@Override
public void requestBannerAd(final Context context,
final CustomEventBannerListener customEventBannerListener,
String serverParameter,
AdSize adSize,
MediationAdRequest mediationAdRequest,
Bundle bundle) {
// serverParameter: AdMob 後台設定的 TAMedia Slot ID, 會藉由此參數獲得
Log.d(TAG, "requestBannerAd("+serverParameter+") invoked!!");
adView = new TWMAdView( (Activity) context, convertAdSize(adSize), serverParameter);
adView.setAdListener(new TWMAdViewListener(){
@Override
public void onReceiveAd(TWMAd ad) {
((Activity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
customEventBannerListener.onAdLoaded(adView);
}
});
}
@Override
public void onFailedToReceiveAd(TWMAd ad, final ErrorCode errorCode) {
((Activity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
customEventBannerListener.onAdFailedToLoad(convertErrorCode(errorCode));
}
});
}
@Override
public void onPresentScreen(TWMAd ad) {
((Activity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
customEventBannerListener.onAdOpened();
//若您需要在AdMob報表上觀察點擊率, 請加入CustomEventBannerListener.onClick()
customEventBannerListener.onAdClicked();
}
});
}
@Override
public void onDismissScreen(TWMAd ad) {
((Activity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
customEventBannerListener.onAdClosed();
}
});
}
@Override
public void onLeaveApplication(TWMAd ad) {
((Activity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
customEventBannerListener.onAdLeftApplication();
}
});
}
});
adView.loadAd(convertAdRequest(mediationAdRequest));
}
@Override
public void onDestroy() {
if(adView != null){
adView.destroy();
}
}
@Override
public void onPause() {}
@Override
public void onResume() {}
//將AdMob所提供的MediationAdRequest轉換為TWMAdRequest
private TWMAdRequest convertAdRequest(MediationAdRequest request) {
TWMAdRequest adRequest = new TWMAdRequest();
if (request.getBirthday() != null) {
Date bDay = request.getBirthday();
adRequest.setBirthday(bDay);
Calendar cal = Calendar.getInstance();
cal.setTime(bDay);
adRequest.setAge(getAgeByBirthday(
cal.get(Calendar.YEAR),
cal.get(Calendar.MONTH),
cal.get(Calendar.DATE)));
}
if (request.getGender() == AdRequest.GENDER_FEMALE) {
adRequest.setGender(TWMAdRequest.Gender.FEMALE);
} else if (request.getGender() == AdRequest.GENDER_MALE) {
adRequest.setGender(TWMAdRequest.Gender.MALE);
} else {
adRequest.setGender(TWMAdRequest.Gender.UNKNOWN);
}
return adRequest;
}
//將AdMob的AdSize轉換為TWMAdSize
private TWMAdSize convertAdSize(AdSize adSize) {
if (isAdSizeEqual(adSize, TWMAdSize.BANNER)) {
return TWMAdSize.BANNER;
} else if (isAdSizeEqual(adSize, TWMAdSize.IAB_MRECT)) {
return TWMAdSize.IAB_MRECT;
} else if (isAdSizeEqual(adSize, TWMAdSize.IAB_BANNER)) {
return TWMAdSize.IAB_BANNER;
} else if (isAdSizeEqual(adSize, TWMAdSize.IAB_LEADERBOARD)) {
return TWMAdSize.IAB_LEADERBOARD;
} else if (isAdSizeEqual(adSize, TWMAdSize.IAB_WIDE_SKYSCRAPER)) {
return TWMAdSize.IAB_WIDE_SKYSCRAPER;
} else if (isAdSizeEqual(adSize, TWMAdSize.SMART_BANNER)) {
return TWMAdSize.SMART_BANNER;
} else {
return TWMAdSize.BANNER;
}
}
private boolean isAdSizeEqual(AdSize adSize, TWMAdSize twmAdSize) {
return (adSize.getWidth() == twmAdSize.getWidth()
&& adSize.getHeight() == twmAdSize.getHeight());
}
//將TAMedia ErrorCode轉換為AdMob的ErrorCode
private int convertErrorCode(ErrorCode errorCode){
if(errorCode.equals(ErrorCode.INTERNAL_ERROR)){
return AdRequest.ERROR_CODE_INTERNAL_ERROR;
}else if(errorCode.equals(ErrorCode.INVALID_REQUEST)){
return AdRequest.ERROR_CODE_INVALID_REQUEST;
}else if(errorCode.equals(ErrorCode.NETWORK_ERROR)){
return AdRequest.ERROR_CODE_NETWORK_ERROR;
}else if(errorCode.equals(ErrorCode.NO_FILL)){
return AdRequest.ERROR_CODE_NO_FILL;
}else
return AdRequest.ERROR_CODE_NETWORK_ERROR;
}
private int getAgeByBirthday(int year, int month, int day){
Calendar dob = Calendar.getInstance();
Calendar today = Calendar.getInstance();
dob.set(year, month, day);
int age = today.get(Calendar.YEAR) - dob.get(Calendar.YEAR);
if (today.get(Calendar.DAY_OF_YEAR) < dob.get(Calendar.DAY_OF_YEAR)){
age--;
}
Integer ageInt = new Integer(age);
return ageInt.intValue();
}
}
Interstitial
- 依照下列方式實作AdMob所提供的CustomEventInterstitial
package com.taiwanmobile.pt.adp.mediation;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.mediation.MediationAdRequest;
import com.google.android.gms.ads.mediation.customevent.CustomEventInterstitial;
import com.google.android.gms.ads.mediation.customevent.CustomEventInterstitialListener;
import com.taiwanmobile.pt.adp.view.TWMAd;
import com.taiwanmobile.pt.adp.view.TWMAdRequest;
import com.taiwanmobile.pt.adp.view.TWMAdRequest.ErrorCode;
import com.taiwanmobile.pt.adp.view.TWMAdViewListener;
import com.taiwanmobile.pt.adp.view.TWMInterstitialAd;
import java.util.Calendar;
import java.util.Date;
// 需將本class的完整類別名稱 com.taiwanmobile.pt.adp.mediation.TAMediaInterstitial註冊於mediation的設定頁面上, 如前述章節所述
public class TAMediaInterstitial implements CustomEventInterstitial {
private TWMInterstitialAd interstitialAd = null;
private static final String TAG ="TAMediaInterstitial";
@Override
public void requestInterstitialAd(final Context context,
final CustomEventInterstitialListener customEventInterstitialListener,
String serverParameter,
MediationAdRequest mediationAdRequest,
Bundle bundle) {
// serverParameter: AdMob 後台設定的 TAMedia Slot ID, 會藉由此參數獲得
Log.d(TAG, "requestInterstitialAd("+serverParameter+") ");
interstitialAd = new TWMInterstitialAd((Activity)context, serverParameter);
interstitialAd.setAdListener(new TWMAdViewListener() {
@Override
public void onReceiveAd(TWMAd ad) {
((Activity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
customEventInterstitialListener.onAdLoaded();
}
});
}
@Override
public void onFailedToReceiveAd(TWMAd ad, final ErrorCode errorCode) {
((Activity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
customEventInterstitialListener.onAdFailedToLoad(convertErrorCode(errorCode));
}
});
}
@Override
public void onPresentScreen(TWMAd ad) {
((Activity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
customEventInterstitialListener.onAdOpened();
}
});
}
@Override
public void onDismissScreen(TWMAd ad) {
((Activity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
customEventInterstitialListener.onAdClosed();
}
});
}
@Override
public void onLeaveApplication(TWMAd ad) {
((Activity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
customEventInterstitialListener.onAdLeftApplication();
}
});
}
});
interstitialAd.loadAd(convertAdRequest(mediationAdRequest));
}
@Override
public void showInterstitial() {
if (interstitialAd != null) {
interstitialAd.show();
}
}
@Override
public void onDestroy() {}
@Override
public void onPause() {}
@Override
public void onResume() {}
//將AdMob所提供的MediationAdRequest轉換為TWMAdRequest
private TWMAdRequest convertAdRequest(MediationAdRequest request) {
TWMAdRequest adRequest = new TWMAdRequest();
if (request.getBirthday() != null) {
Date bDay = request.getBirthday();
adRequest.setBirthday(bDay);
Calendar cal = Calendar.getInstance();
cal.setTime(bDay);
adRequest.setAge(getAgeByBirthday(
cal.get(Calendar.YEAR),
cal.get(Calendar.MONTH),
cal.get(Calendar.DATE)));
}
if (request.getGender() == AdRequest.GENDER_FEMALE) {
adRequest.setGender(TWMAdRequest.Gender.FEMALE);
} else if (request.getGender() == AdRequest.GENDER_MALE) {
adRequest.setGender(TWMAdRequest.Gender.MALE);
} else {
adRequest.setGender(TWMAdRequest.Gender.UNKNOWN);
}
return adRequest;
}
//將TAMedia ErrorCode轉換為AdMob的ErrorCode
private int convertErrorCode(ErrorCode errorCode){
if(errorCode.equals(ErrorCode.INTERNAL_ERROR)){
return AdRequest.ERROR_CODE_INTERNAL_ERROR;
}else if(errorCode.equals(ErrorCode.INVALID_REQUEST)){
return AdRequest.ERROR_CODE_INVALID_REQUEST;
}else if(errorCode.equals(ErrorCode.NETWORK_ERROR)){
return AdRequest.ERROR_CODE_NETWORK_ERROR;
}else if(errorCode.equals(ErrorCode.NO_FILL)){
return AdRequest.ERROR_CODE_NO_FILL;
}else
return AdRequest.ERROR_CODE_NETWORK_ERROR;
}
private int getAgeByBirthday(int year, int month, int day){
Calendar dob = Calendar.getInstance();
Calendar today = Calendar.getInstance();
dob.set(year, month, day);
int age = today.get(Calendar.YEAR) - dob.get(Calendar.YEAR);
if (today.get(Calendar.DAY_OF_YEAR) < dob.get(Calendar.DAY_OF_YEAR)){
age--;
}
Integer ageInt = new Integer(age);
return ageInt.intValue();
}
}
範例程式碼
- Download Sample Code (For Android Studio)
- Download Sample Code (For Eclipse)
- 以下以Banner為例:
- 1. 在layout檔案中加入可放置廣告的LinearLayout(※僅供參考,開發者可依照自訂的layout進行配置使用)
<LinearLayout android:id="@+id/Layout_AdView" android:layout_width="wrap_content" android:layout_height="wrap_content" />
- 2. 程式加入Banner的宣告, 設定AdUnitId與AdSize
public class MainActivity extends Activity {
LinearLayout layout = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
layout = (LinearLayout) this.findViewById(R.id.Layout_AdView);
adView = new AdView(this);
adView.setAdUnitId("<AdMob Banner Ad Unit ID>");
adView.setAdSize(AdSize.BANNER);
layout.addView(adView);
AdRequest request = new AdRequest.Builder().build();
adView.loadAd(request);
}
}








