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

出自TAMedia
跳至導覽 跳至搜尋
imported>Wikiuser
(新頁面: *AdMob Mediation整合 ::請至https://mediation.admob.com。 ::登入AdMob(可能需要申請一個AdMob帳號或以Google帳號登入),點選Sites & Apps > Ad Network Mediation。 ...)
 
imported>Wikiuser
行 1: 行 1:
*AdMob Mediation整合
<p style="font-size: 18px;">AdMob網站: https://apps.admob.com/ <br><br></p>
::請至https://mediation.admob.com。
 
::登入AdMob(可能需要申請一個AdMob帳號或以Google帳號登入),點選Sites & Apps > Ad Network Mediation。
= '''新增應用程式''' =
::[[檔案:Android_5.png]]
<ul>
::*新增Banner Ad
<li><p style="font-size: 18px;">進入 AdMob 網頁選擇 '''應用程式''' > '''新增應用程式'''</p></li>
:::點擊Add Network Mediation Placement新增一個Mediation Placement。
[[ image:admob_application_00.PNG | 600px ]]
:::[[檔案:android_6.png]]
<br><br><br>
:::輸入Mediation名稱,選擇Platform、Ad Size及Automatic Refresh。若您的Mediation Placement有2個以上的廣告時,AdMob SDK每5分鐘(300秒)會抽取(依聯播網分配比率)下一個Ad Network。Automatic Refresh的設定,是指這5分鐘內,更新同一個Ad Network內容。完成後按Save & Continue。
 
:::[[檔案:android_7.png]]
<li><p style="font-size: 18px;">輸入應用程式名稱並選擇平台</p></li>
:::請在這一步直接按最下方continue(或是可以勾選您目前擁有的Ad Network)。
[[ image:admob_application_01.PNG | 800px ]]
:::[[檔案:android_8.png]]
<br><br><br>
:::<呈現mediation設定畫面, 請將本畫面所提供的mediation_id紀錄下來>
 
:::[[檔案:android_9.png]]
<li><p style="font-size: 18px;">建立完成,請記下'''應用程式 ID'''</p></li>
:::按下Add Custom Event
[[ image:admob_application_02.PNG | 800px ]]
:::[[檔案:android_10.png]]
</ul>
:::Label:TAMedia (可自訂)
<br><br><br>
:::Class Name:<b>com.taiwanmobile.pt.adp.mediation.TAMediaBanner</b>
 
:::Parameter:<b>請填入您的TAMedia Slot Id (可向您的TAMedia窗口詢問)</b>
 
:::完成後按下Save
= '''新增廣告單元''' =
:::若有希望數個AdNetwork能均等投放廣告, 請將eCPM欄位填入同樣的數值
<ul>
:::[[檔案:android_11.png]]
<li><p style="font-size: 18px;">點選先前建立的應用程式並選擇 '''廣告單元''' > '''開始匯入'''</p></li>
::*整合至應用程式
[[ image:admob_adunit_00.PNG | 1000px ]]
::TAMedia對Mediation的支援採用外掛函式庫的方式,可輕易的整合。將外掛函式庫(可於下方連結取得madp-sdk-plugin-mediation-android-x.x.x.jar)加入專案的build path當中
<br><br><br>
::[[媒體:TAMedia Android SDK.zip|Download Android SDK and Sample]]
 
::加入必要的權限<br/>TWMAd服務需使用”存取網路狀態”、”讀取約略位置”、”網路”等權限,請在AndroidManifest.xml檔案當中進行下列權限的宣告。
<li><p style="font-size: 18px;">選擇欲建立的廣告單元 (以'''橫幅廣告'''為例)</p></li>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>  
[[ image:admob_adunit_01.PNG | 800px ]]
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> &lt;!-- optional --&gt;
<br><br><br>
<uses-permission android:name="android.permission.INTERNET"/>
 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> &lt;!-- optional --&gt;
<li><p style="font-size: 18px;">輸入廣告單元名稱</p></li>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
[[ image:admob_adunit_02.PNG | 800px ]]
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<br><br><br>
::加入必要Activity
 
<activity android:name="com.taiwanmobile.pt.adp.view.TWMAdActivity" />
<li><p style="font-size: 18px;">建立完成,請記下 AdMob 的'''廣告單元ID'''</p></li>
<activity android:name="com.taiwanmobile.pt.adp.view.TWMAdViewActivity" />
[[ image:admob_adunit_03.PNG | 800px ]]
&lt;!-- Google AdMob Activities --&gt;
</ul><br><br><br>
  <activity
 
android:name="com.google.ads.AdActivity"
 
android:configChanges=
 
  "keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>
 
::在layout檔案中加入可放置廣告的LinearLayout(※僅供參考,開發者可依照自訂的layout進行配置使用)
= '''新增中介服務群組''' =
<ul>
<li><p style="font-size: 18px;">進入 AdMob 網頁選擇 '''中介服務''' > '''新增中介服務群組'''</p></li>
[[ image:admob_medgroup_00.PNG | 800px ]]
<br><br><br>
 
<li><p style="font-size: 18px;">設定廣告格式、平台</p></li>
[[ image:admob_medgroup_01.PNG | 800px ]]
<br><br><br>
 
<li><p style="font-size: 18px;">設定中介群組名稱並點選'''加入廣告單元'''</p></li>
[[ image:admob_medgroup_02.PNG | 800px ]]
<br><br><br>
 
<li><p style="font-size: 18px;">選擇先前建立的廣告單元 (以'''橫幅廣告'''為例)</p></li>
[[ image:admob_medgroup_03.PNG | 800px ]]
<br><br><br>
 
<li>
  <p style="font-size: 18px;">點選'''新增自訂事件''',並設定下列相關資訊:</p>
  <p style="font-size: 16px">'''有效千次曝光出價''': 越高代表該家聯播網廣告曝光的機會越高</p>
  <p style="font-size: 16px">'''Class Name''': 根據您的專案輸入 mediation code 的 package name,如: com.taiwanmobile.pt.adp.mediation.TAMediaBanner (下方'''[[#實作 Mediation Code|實作 Mediation Code]]'''章節會說明Mediation Code的實作方式)</p>
  <p style="font-size: 16px">'''Parameter''': 輸入您的 TAMedia 廣告版位ID </p>
</li>
[[ image:admob_medgroup_04.PNG | 800px ]]
<br><br>
[[ image:admob_medgroup_05.PNG | 800px ]]
<br><br>
[[ image:admob_medgroup_06.PNG | 1200px ]]
<br><br><br>
 
<li><p style="font-size: 18px;">點選完成後,中介服務群組的設置便結束</p></li>
[[ image:admob_medgroup_07.PNG | 1200px ]]
</ul>
<br><br><br>
 
 
 
= '''程式整合''' =
 
== '''Getting Started''' ==
:<p style="font-size: 18px;">1. 請參考'''[https://developers.google.com/admob/android/quick-start?hl=zh-TW AdMob for Android]'''網站提供的方式整合Google Ads SDK,此步驟會使用到'''[[#新增應用程式|新增應用程式]]'''所取得的'''應用程式ID'''</p>
:<p style="font-size: 18px;">2. 下載'''[[Download MADP Android SDK | TAMedia Android SDK]]''',並參考'''[[Android Getting Started 3.0 | 開始使用Getting Started]]'''整合TAMedia Android SDK</p>
<br><br><br>
 
 
== '''實作 Mediation Code'''==
=== Banner ===
:<p style="font-size: 18px;">依照下列方式實作AdMob所提供的CustomEventBanner</p>
  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;
 
  <b>// 需將本class的完整類別名稱 com.taiwanmobile.pt.adp.mediation.TAMediaBanner註冊於中介服務群組, 如[[ #新增中介服務群組 | 新增中介服務群組 ]]所述</b>
  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) {
          <b>// serverParameter: AdMob 後台設定的 TAMedia Slot ID, 會藉由此參數獲得</b>
          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();
                          <b>//若您需要在AdMob報表上觀察點擊率, 請加入CustomEventBannerListener.onClick()</b>
                          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() {}
 
 
      <b>//將AdMob所提供的MediationAdRequest轉換為TWMAdRequest</b>
      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;
      }
 
      <b>//將AdMob的AdSize轉換為TWMAdSize</b>
      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());
      }
 
      <b>//將TAMedia ErrorCode轉換為AdMob的ErrorCode</b>
      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();
      }
 
  }
<br><br>
 
 
 
=== Interstitial ===
:<p style="font-size: 18px;">依照下列方式實作AdMob所提供的CustomEventInterstitial</p>
  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;
 
  <b>// 需將本class的完整類別名稱 com.taiwanmobile.pt.adp.mediation.TAMediaInterstitial註冊於中介服務群組, 如[[ #新增中介服務群組 | 新增中介服務群組 ]]所述</b>
  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) {
  <b>// serverParameter: AdMob 後台設定的 TAMedia Slot ID, 會藉由此參數獲得</b>
  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() {}
 
  <b>//將AdMob所提供的MediationAdRequest轉換為TWMAdRequest</b>
  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;
  }
 
  <b>//將TAMedia ErrorCode轉換為AdMob的ErrorCode</b>
  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();
  }
  }
<br><br><br>
 
 
 
 
 
== '''範例程式碼''' ==
:<p style="font-size: 18px;">[[媒體:TAMedia_-_AdMob_Medation_20190926.zip | Download Sample Code]]</p>
::<p style="font-size: 16px;">※註: 範例專案需要在 '''AndroidManifest.xml''' 和 '''MainActivity.java''' 內分別輸入AdMob的 '''應用程式ID''' 與 '''廣告單元ID''' </p>
<br><br>
:<p style="font-size: 18px;">以下以Banner為例:</p>
::<p style="font-size: 18px;">1. 在layout檔案中加入可放置廣告的LinearLayout(※僅供參考,開發者可依照自訂的layout進行配置使用)</p>
  <LinearLayout
  <LinearLayout
android:id="@+id/Layout_AdView"
    android:id="@+id/Layout_AdView"
android:layout_width="wrap_content"
    android:layout_width="wrap_content"
android:layout_height="wrap_content" />
    android:layout_height="wrap_content" />
::在程式加入Ad的宣告
::<p style="font-size: 18px;">2. 程式加入Banner的宣告, 設定AdUnitId與AdSize</p>
  public class MainActivity extends Activity {
public class MainActivity extends Activity {
  LinearLayout layout = null;
    LinearLayout layout = null;
  @Override
    @Override
  public void onCreate(Bundle savedInstanceState) {
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
        super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
        setContentView(R.layout.main);
    layout = (LinearLayout) this.findViewById(R.id.Layout_AdView);
        layout = (LinearLayout) this.findViewById(R.id.Layout_AdView);
    adView = new AdView(activity, AdSize.BANNER, "<Mediation ID>");
        adView = new AdView(this);
    layout.addView(adView);
        adView.setAdUnitId("<b><AdMob Banner Ad Unit ID></b>");
    adView.loadAd(new AdRequest());
        adView.setAdSize(AdSize.BANNER);   
  }
        layout.addView(adView);
::*聯播網投放與維護
        AdRequest request = new AdRequest.Builder().build();
::當APP設定好Mediation並且發佈出去後,可直接透過Mediation網頁進行版位管理與聯播網比率調整,此設定會在1小時後生效。
        adView.loadAd(request);
    }
}
::<p style="font-size: 18px;">程式內的<b><AdMob Banner Ad Unit ID></b>為 '''[[#新增廣告單元|新增廣告單元]]''' 最後取得的AdMob廣告單元ID</p>
<br><br><br>
 
 
<p style="font-size: 18px;">[[Android SDK Developer Guide 2| 回首頁]]</p>

於 2021年8月30日 (一) 10:37 的修訂

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

新增應用程式

  • 進入 AdMob 網頁選擇 應用程式 > 新增應用程式

  • Admob application 00.PNG


  • 輸入應用程式名稱並選擇平台

  • Admob application 01.PNG


  • 建立完成,請記下應用程式 ID

  • Admob application 02.PNG





新增廣告單元

  • 點選先前建立的應用程式並選擇 廣告單元 > 開始匯入

  • Admob adunit 00.PNG


  • 選擇欲建立的廣告單元 (以橫幅廣告為例)

  • Admob adunit 01.PNG


  • 輸入廣告單元名稱

  • Admob adunit 02.PNG


  • 建立完成,請記下 AdMob 的廣告單元ID

  • Admob adunit 03.PNG






新增中介服務群組

  • 進入 AdMob 網頁選擇 中介服務 > 新增中介服務群組

  • Admob medgroup 00.PNG


  • 設定廣告格式、平台

  • Admob medgroup 01.PNG


  • 設定中介群組名稱並點選加入廣告單元

  • Admob medgroup 02.PNG


  • 選擇先前建立的廣告單元 (以橫幅廣告為例)

  • Admob medgroup 03.PNG


  • 點選新增自訂事件,並設定下列相關資訊:

    有效千次曝光出價: 越高代表該家聯播網廣告曝光的機會越高

    Class Name: 根據您的專案輸入 mediation code 的 package name,如: com.taiwanmobile.pt.adp.mediation.TAMediaBanner (下方實作 Mediation Code章節會說明Mediation Code的實作方式)

    Parameter: 輸入您的 TAMedia 廣告版位ID

  • Admob medgroup 04.PNG

    Admob medgroup 05.PNG

    Admob medgroup 06.PNG


  • 點選完成後,中介服務群組的設置便結束

  • Admob medgroup 07.PNG





程式整合

Getting Started

1. 請參考AdMob for Android網站提供的方式整合Google Ads SDK,此步驟會使用到新增應用程式所取得的應用程式ID

2. 下載 TAMedia Android SDK,並參考 開始使用Getting Started整合TAMedia Android SDK





實作 Mediation Code

依照下列方式實作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註冊於中介服務群組, 如 新增中介服務群組 所述
 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註冊於中介服務群組, 如 新增中介服務群組 所述
 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

※註: 範例專案需要在 AndroidManifest.xmlMainActivity.java 內分別輸入AdMob的 應用程式ID廣告單元ID



以下以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





回首頁