2022-10-10

【Kotlin】原始/陽春/樸實的 banner 橫幅廣告

參考資料 ----

AdMob 一直在變更 banner 的樣式, Smart Banner 即將棄用,取而代之的是 Adaptive Banners ,而 Adaptive Banners 因為要對應 Java 新版本 API 的因素也一直在變更寫法。

如果 不想 或 懶得 採用最新的廣告樣式,可以考慮 原始/陽春/樸實 的橫幅廣告。(本筆記結合了視圖綁定)

app 層級 build.gradle
  1.  
  2. ...
  3. ...
  4.  
  5. android {
  6. buildFeatures {
  7. viewBinding true
  8. }
  9. ...
  10. ...
  11. }
  12.  
  13. ...
  14. ...
  15.  
  16. dependencies {
  17.  
  18. // adMob
  19. implementation 'com.google.android.gms:play-services-ads:21.2.0'
  20. }
  21.  


strings.xml
  1.  
  2. <resources>
  3. ...
  4. ...
  5.  
  6. <!-- adMob app id 測試 -->
  7. <string name="admob_app_id">ca-app-pub-3940256099942544~3347511713</string>
  8. <!-- 橫幅 測試 -->
  9. <string name="banner_ad_unit_id">ca-app-pub-3940256099942544/6300978111</string>
  10.  
  11. </resources>
  12.  


AndroidManifest.xml
  1.  
  2. <manifest
  3.  
  4. <!-- 存取網路連線 -->
  5. <uses-permission android:name="android.permission.INTERNET" />
  6.  
  7. ...
  8. ...
  9.  
  10. <application ... >
  11.  
  12. <meta-data
  13. android:name="com.google.android.gms.version"
  14. android:value="@integer/google_play_services_version" />
  15. <meta-data
  16. android:name="com.google.android.gms.ads.APPLICATION_ID"
  17. android:value="@string/admob_app_id" />
  18.  
  19. ...
  20. ...
  21.  
  22. <!-- AdMob 的 AdActivity -->
  23. <activity
  24. android:name="com.google.android.gms.ads.AdActivity"
  25. android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
  26. android:theme="@android:style/Theme.Translucent" />
  27.  
  28. ...
  29. ...
  30.  
  31. </application>
  32.  
  33. </manifest>
  34.  


activity_main.xml
  1.  
  2. <?xml version="1.0" encoding="utf-8"?>
  3. <RelativeLayout
  4. xmlns:android="http://schemas.android.com/apk/res/android"
  5. xmlns:tools="http://schemas.android.com/tools"
  6. xmlns:ads="http://schemas.android.com/apk/res-auto" ←← 注意這行
  7. android:layout_width="match_parent"
  8. android:layout_height="match_parent"
  9. android:paddingBottom="0dp"
  10. android:paddingLeft="0dp"
  11. android:paddingRight="0dp"
  12. android:paddingTop="0dp"
  13. tools:context=".MainActivity">
  14. <com.google.android.gms.ads.AdView
  15. android:id="@+id/adView"
  16. android:layout_width="match_parent"
  17. android:layout_height="wrap_content"
  18. android:layout_alignParentBottom="true"
  19. android:layout_alignParentStart="true"
  20. android:layout_alignParentEnd="true"
  21. ads:adSize="BANNER"
  22. ads:adUnitId="@string/banner_ad_unit_id" />
  23.  
  24. <TextView
  25. android:id="@+id/txtHello"
  26. android:layout_width="wrap_content"
  27. android:layout_height="wrap_content"
  28. android:layout_alignParentStart="true"
  29. android:layout_alignParentTop="true"
  30. android:layout_alignParentEnd="true"
  31. android:text="Hello World!" />
  32.  
  33. </RelativeLayout>
  34.  
adSize  除了 BANNER 外,另有其他值可填入
大小 (寬 x 高)說明適用裝置AdSize 常值
320x50標準橫幅廣告手機和平板電腦BANNER
320x100大横幅手機和平板電腦LARGE_BANNER
300x250IAB 中矩形廣告手機和平板電腦MEDIUM_RECTANGLE
468x60IAB 完整橫幅廣告平板電腦FULL_BANNER
728x90IAB 超級橫幅廣告平板電腦LEADERBOARD

                           


MainActivity.kt
  1.  
  2. class MainActivity : AppCompatActivity() {
  3.  
  4. private lateinit var binding: ActivityMainBinding
  5.  
  6. override fun onCreate(savedInstanceState: Bundle?) {
  7. super.onCreate(savedInstanceState)
  8. binding = ActivityMainBinding.inflate(layoutInflater)
  9. val view = binding.root
  10. setContentView(view)
  11.  
  12. binding.txtHello.text = "大家好"
  13.  
  14. // AdMob 初始化
  15. MobileAds.initialize(this)
  16. binding.adView.loadAd(AdRequest.Builder().build())
  17. }
  18. }
  19.  

採用陽春型橫幅,缺點當然就是外觀顯示不夠漂亮,使用者體驗不好,因為尺寸都是固定的。

(手機直) BANNER 標準尺寸 320×50



(手機橫) BANNER 標準尺寸 320×50



大橫幅(LARGE_BANNER) 320×100



IAB 中矩形(MEDIUM_RECTANGLE) 300×250



平板 IAB 完整橫幅(FULL_BANNER) 468×60




平板(直) IAB 超級橫幅(LEADERBOARD) 728×90


平板(橫) IAB 超級橫幅(LEADERBOARD) 728×90



若希望不同尺寸螢幕的設備展示相應的橫幅,可以複製 activity_main.xml
/layout-w480dp//layout-w740dp/ 並將 adSize 屬性對應不同的橫幅。


/layout-w480dp/
  1.  
  2. <?xml version="1.0" encoding="utf-8"?>
  3. <RelativeLayout
  4. ...
  5. ...
  6. tools:context=".MainActivity">
  7. <com.google.android.gms.ads.AdView
  8. android:id="@+id/adView"
  9. android:layout_width="match_parent"
  10. android:layout_height="wrap_content"
  11. android:layout_alignParentBottom="true"
  12. android:layout_alignParentStart="true"
  13. android:layout_alignParentEnd="true"
  14. ads:adSize="FULL_BANNER"
  15. ads:adUnitId="@string/banner_ad_unit_id" />
  16.  
  17. ...
  18. ...
  19.  
  20. </RelativeLayout>
  21.  


/layout-w740dp/
  1.  
  2. <?xml version="1.0" encoding="utf-8"?>
  3. <RelativeLayout
  4. ...
  5. ...
  6. tools:context=".MainActivity">
  7. <com.google.android.gms.ads.AdView
  8. android:id="@+id/adView"
  9. android:layout_width="match_parent"
  10. android:layout_height="wrap_content"
  11. android:layout_alignParentBottom="true"
  12. android:layout_alignParentStart="true"
  13. android:layout_alignParentEnd="true"
  14. ads:adSize="LEADERBOARD"
  15. ads:adUnitId="@string/banner_ad_unit_id" />
  16.  
  17. ...
  18. ...
  19.  
  20. </RelativeLayout>
  21.  


方法二:
想到...不然自己土砲打造 "類自適應橫幅" 好了...😁

activity_main.xml
  1.  
  2. <?xml version="1.0" encoding="utf-8"?>
  3. <RelativeLayout
  4. xmlns:android="http://schemas.android.com/apk/res/android"
  5. xmlns:tools="http://schemas.android.com/tools"
  6. android:layout_width="match_parent"
  7. android:layout_height="match_parent"
  8. android:paddingBottom="0dp"
  9. android:paddingLeft="0dp"
  10. android:paddingRight="0dp"
  11. android:paddingTop="0dp"
  12. tools:context=".MainActivity">
  13.  
  14. <TextView
  15. android:id="@+id/txtHello"
  16. android:layout_width="wrap_content"
  17. android:layout_height="wrap_content"
  18. android:layout_alignParentStart="true"
  19. android:layout_alignParentTop="true"
  20. android:layout_alignParentEnd="true"
  21. android:text="Hello World!" />
  22.  
  23. <!-- 做為 自適應橫幅的 container -->
  24. <LinearLayout
  25. android:id="@+id/ad_view_container"
  26. android:layout_alignParentBottom="true"
  27. android:layout_centerInParent="true"
  28. android:layout_height="wrap_content"
  29. android:layout_width="match_parent"
  30. android:orientation="horizontal" />
  31.  
  32. </RelativeLayout>
  33.  


MainActivity.kt
  1.  
  2.  
  3. ...
  4. ...
  5.  
  6. class MainActivity : AppCompatActivity() {
  7.  
  8. private lateinit var binding: ActivityMainBinding
  9.  
  10. override fun onCreate(savedInstanceState: Bundle?) {
  11. super.onCreate(savedInstanceState)
  12. binding = ActivityMainBinding.inflate(layoutInflater)
  13. val view = binding.root
  14. setContentView(view)
  15.  
  16. binding.txtHello.text = "大家好"
  17.  
  18. // AdMob 初始化
  19. MobileAds.initialize(this)
  20.  
  21. // 橫幅廣告
  22. // 依螢幕尺寸變更橫幅的樣式
  23. val adView = AdView(this)
  24. when(this.resources.configuration.screenLayout and Configuration.SCREENLAYOUT_SIZE_MASK) {
  25. Configuration.SCREENLAYOUT_SIZE_XLARGE -> adView.setAdSize(AdSize.LEADERBOARD)
  26. Configuration.SCREENLAYOUT_SIZE_LARGE -> adView.setAdSize(AdSize.FULL_BANNER)
  27. Configuration.SCREENLAYOUT_SIZE_NORMAL -> adView.setAdSize(AdSize.LARGE_BANNER)
  28. else -> adView.setAdSize(AdSize.BANNER)
  29. }
  30. val lp = LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT)
  31. lp.gravity = Gravity.CENTER
  32. adView.adUnitId = getString(R.string.banner_ad_unit_id)
  33. binding.adViewContainer.addView(adView,lp) // 注意這裡 ad_view_container 的命名方式是 "駝峰式命名"
  34. adView.loadAd(AdRequest.Builder().build())
  35.  
  36. }
  37. }
  38.  


相關筆記 ----


沒有留言:

張貼留言