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

出自TAMedia
跳至導覽 跳至搜尋
imported>Wikiuser
imported>Wikiuser
行 206: 行 206:
=== Interstitial ===
=== Interstitial ===
:<p style="font-size: 18px;">依照下列方式實作AdMob所提供的CustomEventInterstitial</p>
:<p style="font-size: 18px;">依照下列方式實作AdMob所提供的CustomEventInterstitial</p>
  package com.taiwanmobile.pt.adp.mediation;
    package com.taiwanmobile.pt.adp.mediation
 
   
  import android.app.Activity;
    import android.app.Activity
  import android.content.Context;
    import android.content.Context
  import android.os.Bundle;
    import android.os.Bundle
  import android.util.Log;
    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.AdRequest;
    import com.google.android.gms.ads.mediation.customevent.CustomEventInterstitial
  import com.google.android.gms.ads.mediation.MediationAdRequest;
    import com.google.android.gms.ads.mediation.customevent.CustomEventInterstitialListener
  import com.google.android.gms.ads.mediation.customevent.CustomEventInterstitial;
    import com.taiwanmobile.pt.adp.view.TWMAd
  import com.google.android.gms.ads.mediation.customevent.CustomEventInterstitialListener;
    import com.taiwanmobile.pt.adp.view.TWMAdRequest
  import com.taiwanmobile.pt.adp.view.TWMAd;
    import com.taiwanmobile.pt.adp.view.TWMAdViewListener
  import com.taiwanmobile.pt.adp.view.TWMAdRequest;
    import com.taiwanmobile.pt.adp.view.TWMInterstitialAd
  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>
   <b>// 需將本class的完整類別名稱 com.taiwanmobile.pt.adp.mediation.TAMediaInterstitial註冊於中介服務群組, 如[[ #新增中介服務群組 | 新增中介服務群組 ]]所述</b>
  public class TAMediaInterstitial implements CustomEventInterstitial {
    class TAMediaInterstitial : CustomEventInterstitial {
 
   
  private TWMInterstitialAd interstitialAd = null;
        private var interstitialAd: TWMInterstitialAd? = null
 
   
  private static final String TAG ="TAMediaInterstitial";
        override fun requestInterstitialAd(
 
            context: Context,
  @Override
            customEventInterstitialListener: CustomEventInterstitialListener,
  public void requestInterstitialAd(final Context context,
            serverParameter: String?,
  final CustomEventInterstitialListener customEventInterstitialListener,
            mediationAdRequest: MediationAdRequest,
  String serverParameter,
            bundle: Bundle?
  MediationAdRequest mediationAdRequest,
        ) {
  Bundle bundle) {
            <b>// serverParameter: AdMob 後台設定的 TAMedia Slot ID, 會藉由此參數獲得</b>
  <b>// serverParameter: AdMob 後台設定的 TAMedia Slot ID, 會藉由此參數獲得</b>
            Log.d(TAG, "requestInterstitialAd($serverParameter) ")
  Log.d(TAG, "requestInterstitialAd("+serverParameter+") ");
            interstitialAd = TWMInterstitialAd(context as Activity, serverParameter as String)
 
            interstitialAd?.setAdListener(object : TWMAdViewListener {
  interstitialAd = new TWMInterstitialAd((Activity)context, serverParameter);
   
 
                override fun onReceiveAd(ad: TWMAd) {
  interstitialAd.setAdListener(new TWMAdViewListener() {
                    customEventInterstitialListener.onAdLoaded()
 
                }
  @Override
   
  public void onReceiveAd(TWMAd ad) {
                override fun onFailedToReceiveAd(ad: TWMAd, errorCode: TWMAdRequest.ErrorCode) {
  ((Activity) context).runOnUiThread(new Runnable() {
                    customEventInterstitialListener.onAdFailedToLoad(
  @Override
                        convertErrorCode(errorCode)
  public void run() {
                    )
  customEventInterstitialListener.onAdLoaded();
                }
  }
   
  });
                override fun onPresentScreen(ad: TWMAd) {
  }
                    customEventInterstitialListener.onAdOpened()
 
                }
  @Override
   
  public void onFailedToReceiveAd(TWMAd ad, final ErrorCode errorCode) {
                override fun onDismissScreen(ad: TWMAd) {
  ((Activity) context).runOnUiThread(new Runnable() {
                    customEventInterstitialListener.onAdClosed()
  @Override
                }
  public void run() {
   
  customEventInterstitialListener.onAdFailedToLoad(convertErrorCode(errorCode));
                override fun onLeaveApplication(ad: TWMAd) {
  }
                    customEventInterstitialListener.onAdClicked()
  });
                    customEventInterstitialListener.onAdLeftApplication()
  }
                }
 
            })
  @Override
            interstitialAd?.loadAd(TWMAdRequest())
  public void onPresentScreen(TWMAd ad) {
        }
  ((Activity) context).runOnUiThread(new Runnable() {
   
  @Override
        override fun showInterstitial() {
  public void run() {
            interstitialAd?.show()
  customEventInterstitialListener.onAdOpened();
        }
  }
   
  });
        override fun onDestroy() {}
  }
        override fun onPause() {}
 
        override fun onResume() {}
  @Override
   
  public void onDismissScreen(TWMAd ad) {
        <b>// 將TAMedia ErrorCode轉換為AdMob的ErrorCode</b>
  ((Activity) context).runOnUiThread(new Runnable() {
        private fun convertErrorCode(errorCode: TWMAdRequest.ErrorCode): Int {
  @Override
            return when (errorCode) {
  public void run() {
                TWMAdRequest.ErrorCode.INTERNAL_ERROR -> {
  customEventInterstitialListener.onAdClosed();
                    AdRequest.ERROR_CODE_INTERNAL_ERROR
  }
                }
  });
                TWMAdRequest.ErrorCode.INVALID_REQUEST -> {
  }
                    AdRequest.ERROR_CODE_INVALID_REQUEST
 
                }
  @Override
                TWMAdRequest.ErrorCode.NETWORK_ERROR -> {
  public void onLeaveApplication(TWMAd ad) {
                    AdRequest.ERROR_CODE_NETWORK_ERROR
  ((Activity) context).runOnUiThread(new Runnable() {
                }
  @Override
                TWMAdRequest.ErrorCode.NO_FILL -> {
  public void run() {
                    AdRequest.ERROR_CODE_NO_FILL
  customEventInterstitialListener.onAdLeftApplication();
                }
  }
                else -> AdRequest.ERROR_CODE_NETWORK_ERROR
  });
            }
  }
        }
 
   
  });
        companion object {
 
            private const val TAG = "TAMediaInterstitial"
  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>
<br><br><br>


== '''範例程式碼''' ==
== '''範例程式碼''' ==

於 2021年9月1日 (三) 03:20 的修訂

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

新增應用程式

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

  • Admob application 00.PNG


  • 選擇平台

  • Admob1.png


  • 接著輸入應用程式名稱

  • Admob2.png


  • 建立完成

  • Admob3-1.png





新增廣告單元

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

  • Admob3-2.png


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

  • Admob4.png


  • 輸入廣告單元名稱

  • Admob5.png


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

  • Admob6.png






新增中介服務群組

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

  • Admob m 1.png


  • 設定廣告格式、平台

  • Admob m 2.png


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

  • Admob m 3.png


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

  • Admob m 4.png


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

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

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

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

  • Admob m 5.png

    Admob m 6.png

    Admob m 7.png


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

  • Admob m 8.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.*
 
 // 需將本class的完整類別名稱 com.taiwanmobile.pt.adp.mediation.TAMediaBanner註冊於中介服務群組, 如 新增中介服務群組 所述
   class TAMediaBanner : CustomEventBanner {
   
       private var adView: TWMAdView? = null
   
       override fun requestBannerAd(
           context: Context,
           customEventBannerListener: CustomEventBannerListener,
           serverParameter: String?,
           adSize: AdSize,
           mediationAdRequest: MediationAdRequest,
           bundle: Bundle?
       ) {
           // serverParameter: AdMob 後台設定的 TAMedia Slot ID, 會藉由此參數獲得
           Log.d(TAG, "requestBannerAd($serverParameter) invoked!!")
           adView = TWMAdView(context as Activity, convertAdSize(adSize), serverParameter)
           adView?.adListener = object : TWMAdViewListener {
               override fun onReceiveAd(ad: TWMAd) {
                   customEventBannerListener.onAdLoaded(adView)
               }
   
               override fun onFailedToReceiveAd(ad: TWMAd, errorCode: TWMAdRequest.ErrorCode) {
                   customEventBannerListener.onAdFailedToLoad(
                       convertErrorCode(errorCode)
                   )
               }
   
               override fun onPresentScreen(ad: TWMAd) {
                   customEventBannerListener.onAdOpened()
               }
   
               override fun onDismissScreen(ad: TWMAd) {
                   customEventBannerListener.onAdClosed()
               }
   
               override fun onLeaveApplication(ad: TWMAd) {
                   customEventBannerListener.onAdClicked()
                   customEventBannerListener.onAdLeftApplication()
               }
           }
           adView?.loadAd(TWMAdRequest())
       }
   
       override fun onDestroy() {
           adView?.destroy()
       }
   
       override fun onPause() {}
       override fun onResume() {}
   
       //將AdMob的AdSize轉換為TWMAdSize
       private fun convertAdSize(adSize: AdSize): TWMAdSize {
           return when {
               isAdSizeEqual(adSize, TWMAdSize.BANNER) -> {
                   TWMAdSize.BANNER
               }
               isAdSizeEqual(adSize, TWMAdSize.BANNER_1200X627) -> {
                   TWMAdSize.BANNER_1200X627
               }
               isAdSizeEqual(adSize, TWMAdSize.BANNER_300X250) -> {
                   TWMAdSize.BANNER_300X250
               }
               isAdSizeEqual(adSize, TWMAdSize.SMART_BANNER) -> {
                   TWMAdSize.SMART_BANNER
               }
               else -> {
                   TWMAdSize.BANNER
               }
           }
       }
   
       private fun isAdSizeEqual(adSize: AdSize, twmAdSize: TWMAdSize): Boolean {
           return (adSize.width == twmAdSize.width
                   && adSize.height == twmAdSize.height)
       }
   
       //將TAMedia ErrorCode轉換為AdMob的ErrorCode
       private fun convertErrorCode(errorCode: TWMAdRequest.ErrorCode): Int {
           return when (errorCode) {
               TWMAdRequest.ErrorCode.INTERNAL_ERROR -> {
                   AdRequest.ERROR_CODE_INTERNAL_ERROR
               }
               TWMAdRequest.ErrorCode.INVALID_REQUEST -> {
                   AdRequest.ERROR_CODE_INVALID_REQUEST
               }
               TWMAdRequest.ErrorCode.NETWORK_ERROR -> {
                   AdRequest.ERROR_CODE_NETWORK_ERROR
               }
               TWMAdRequest.ErrorCode.NO_FILL -> {
                   AdRequest.ERROR_CODE_NO_FILL
               }
               else -> AdRequest.ERROR_CODE_NETWORK_ERROR
           }
       }
   
       companion object {
           private const val TAG = "TAMediaBanner"
       }
   }



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.TWMAdViewListener
   import com.taiwanmobile.pt.adp.view.TWMInterstitialAd
 
 // 需將本class的完整類別名稱 com.taiwanmobile.pt.adp.mediation.TAMediaInterstitial註冊於中介服務群組, 如 新增中介服務群組 所述
   class TAMediaInterstitial : CustomEventInterstitial {
   
       private var interstitialAd: TWMInterstitialAd? = null
   
       override fun requestInterstitialAd(
           context: Context,
           customEventInterstitialListener: CustomEventInterstitialListener,
           serverParameter: String?,
           mediationAdRequest: MediationAdRequest,
           bundle: Bundle?
       ) {
           // serverParameter: AdMob 後台設定的 TAMedia Slot ID, 會藉由此參數獲得
           Log.d(TAG, "requestInterstitialAd($serverParameter) ")
           interstitialAd = TWMInterstitialAd(context as Activity, serverParameter as String)
           interstitialAd?.setAdListener(object : TWMAdViewListener {
   
               override fun onReceiveAd(ad: TWMAd) {
                   customEventInterstitialListener.onAdLoaded()
               }
   
               override fun onFailedToReceiveAd(ad: TWMAd, errorCode: TWMAdRequest.ErrorCode) {
                   customEventInterstitialListener.onAdFailedToLoad(
                       convertErrorCode(errorCode)
                   )
               }
   
               override fun onPresentScreen(ad: TWMAd) {
                   customEventInterstitialListener.onAdOpened()
               }
   
               override fun onDismissScreen(ad: TWMAd) {
                   customEventInterstitialListener.onAdClosed()
               }
   
               override fun onLeaveApplication(ad: TWMAd) {
                   customEventInterstitialListener.onAdClicked()
                   customEventInterstitialListener.onAdLeftApplication()
               }
           })
           interstitialAd?.loadAd(TWMAdRequest())
       }
   
       override fun showInterstitial() {
           interstitialAd?.show()
       }
   
       override fun onDestroy() {}
       override fun onPause() {}
       override fun onResume() {}
   
       // 將TAMedia ErrorCode轉換為AdMob的ErrorCode
       private fun convertErrorCode(errorCode: TWMAdRequest.ErrorCode): Int {
           return when (errorCode) {
               TWMAdRequest.ErrorCode.INTERNAL_ERROR -> {
                   AdRequest.ERROR_CODE_INTERNAL_ERROR
               }
               TWMAdRequest.ErrorCode.INVALID_REQUEST -> {
                   AdRequest.ERROR_CODE_INVALID_REQUEST
               }
               TWMAdRequest.ErrorCode.NETWORK_ERROR -> {
                   AdRequest.ERROR_CODE_NETWORK_ERROR
               }
               TWMAdRequest.ErrorCode.NO_FILL -> {
                   AdRequest.ERROR_CODE_NO_FILL
               }
               else -> AdRequest.ERROR_CODE_NETWORK_ERROR
           }
       }
   
       companion object {
           private const val TAG = "TAMediaInterstitial"
       }
   }




範例程式碼

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





回首頁