「Android Integeration with AdMob Mediation 2017」修訂間的差異

出自TAMedia
跳至導覽 跳至搜尋
imported>Wikiuser
imported>Wikiuser
行 39: 行 39:
== <b>程式整合-Getting Started</b> ==
== <b>程式整合-Getting Started</b> ==
:1. 請參考[https://developers.google.com/admob/android/quick-start?hl=zh-TW AdMob for Android]網站提供的方式整合Google Ads SDK<br>
:1. 請參考[https://developers.google.com/admob/android/quick-start?hl=zh-TW AdMob for Android]網站提供的方式整合Google Ads SDK<br>
:2. 下載[[Download Android SDK 2 | TAMedia Android SDK]], 並參考 [[Android Getting Started 2.0 | "開始使用Getting Started"]] 整合TAMedia Android SDK<br>
:2. 下載[[Download Android SDK 6 | TAMedia Android SDK]], 並參考 [[Android Getting Started 3.0 | "開始使用Getting Started"]] 整合TAMedia Android SDK<br>
:3. 加入必要的權限<br>
:3. 加入必要的權限<br>
::TWMAd服務需使用 "存取網路狀態"、"讀取約略位置"、"網路" 等權限,請在AndroidManifest.xml檔案當中進行下列權限的宣告。
::TWMAd服務需使用 "存取網路狀態"、"讀取約略位置"、"網路" 等權限,請在AndroidManifest.xml檔案當中進行下列權限的宣告。
行 434: 行 434:
== 範例程式碼 ==
== 範例程式碼 ==
:[[媒體:TAMedia - AdMob Medation.zip  | Download Sample Code (For Android Studio)]]<br>
:[[媒體:TAMedia - AdMob Medation.zip  | Download Sample Code (For Android Studio)]]<br>
:[[媒體:TAMedia_-_AdMob_Medation_Eclipse.zip | Download Sample Code (For Eclipse)]]<br>
:[[媒體:TAMedia_-_AdMob_Medation_Eclipse.zip | Download Sample Code (For Eclipse)]]<br><br>
:以下以Banner為例:<br>
:以下以Banner為例:<br>
:1. 在layout檔案中加入可放置廣告的LinearLayout(※僅供參考,開發者可依照自訂的layout進行配置使用)
:1. 在layout檔案中加入可放置廣告的LinearLayout(※僅供參考,開發者可依照自訂的layout進行配置使用)

於 2018年8月20日 (一) 08:16 的修訂

AdMob網站: https://apps.admob.com/

新增廣告單元

以下以Banner為例:
點選 "營利", 並點選 "透過新應用程式營利"
2017admob step1-1.png


點選 "手動新增應用程式" , 輸入您的 "應用程式名稱" 並選擇 "Android" 平台, 完成點選 "新增應用程式"
2017admob step1-2.png


根據選項設定您的廣告單元, 並輸入 "廣告單元名稱" , 完成後點選 "儲存"
2017admob step1-3.png


若無使用Firebase, 可直接選擇略過
2017admob step1-4.png


記下AdMob的廣告單元ID後, 點選 "完成" , 即完成廣告單元的建置
2017admob step1-5.png



新增廣告聯播網

點選 "營利" , 選擇應用程式後, 再點選廣告單元中的 "廣告來源"
2017admob step2-1.png


點選 "新增廣告聯播網" (AdMob Network為預設產生)
2017admob step2-2.png


點選 "自訂事件" , 依欄位填入
  1. Class Name: 用於實作 com.google.android.gms.ads.mediation.customevent.CustomEventBanner 的類別名稱, 必須輸入完整的package name, 如com.taiwanmobile.pt.adp.mediation.TAMediaBanner
  2. Label: 任意自定的名稱
  3. Parameter: 請填入您的TAMedia版位ID (可向您的TAMedia窗口詢問)
2017admob step2-3.png



程式整合-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

依照下列方式實作AdMob所提供的CustomEventBanner
 package com.taiwanmobile.pt.adp.mediation;
 
 import android.app.Activity;
 import android.content.Context;
 import android.os.Bundle;
 import android.provider.Settings;
 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.onAdClicked()
 						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(adSize.equals(AdSize.BANNER)){
 			return TWMAdSize.BANNER;
 		}else if(adSize.equals(AdSize.FULL_BANNER)){
 			return TWMAdSize.IAB_BANNER;
 		}else if(adSize.equals(AdSize.MEDIUM_RECTANGLE)){
 			return TWMAdSize.IAB_MRECT;
 		}else if(adSize.equals(AdSize.LEADERBOARD)){
 			return TWMAdSize.IAB_LEADERBOARD;
 		}else if(adSize.isFullWidth() && adSize.isAutoHeight()){
 			return TWMAdSize.SMART_BANNER;
 		}else{
 			return TWMAdSize.BANNER;
 		}
 	}
 
 	//將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);
   }
}
程式內的<AdMob Banner Ad Unit ID>"新增廣告單元" 最後取得的AdMob廣告單元ID
2017admob step5-1.png


回首頁