「Android Native Ads SDK8」修訂間的差異

出自TAMedia
跳至導覽 跳至搜尋
imported>Wikiuser
(新頁面: 回Android首頁<br> = SDK8 版本更新說明 = 原生廣告改用 UIView 的方式呈現,因此可自由設計排版,該 UIView 必須為 TADN...)
 
 
(未顯示由 2 位使用者於中間所作的 35 次修訂)
行 1: 行 1:
[[Android SDK Developer Guide v2|回Android首頁]]<br>
== <b>Native廣告支援內容</b> ==
 
:<span style="font-size:16px;">TAmedia Native廣告支援下列數種內容:</span>
= SDK8 版本更新說明 =
{| class="wikitable" style="width:50%"
原生廣告改用 UIView 的方式呈現,因此可自由設計排版,該 UIView 必須為 TADNativeAdView,內部的元件不一定要全部加入。<br>
例如:可以只加入 longSubjectLabel,而不加入 shortSubjectLabel。<br>
 
= 原生廣告說明 =
通常您會在 TADNativeAdView 裡面加入 TADNativeMediaView,用以顯示大圖或影片。<br>
 
*顯示圖片或影片邏輯:
:-如果原生廣告內容包含影音和圖片,SDK 將使用影音來展示廣告。<br>
:-而 [https://iportal.mybook.taiwanmobile.com/TAmedia/ios/downloadPage/8.0.0/docs/Classes/TADNativeAdOptions.html#/c:@M@TAMediaAdsFramework@objc(cs)TADNativeAdOptions(py)mediaPreferImage TADAdOptions.mediaPreferImage] 設置為 true時,則 SDK 將始終使用圖片來展示廣告。<br>
:-可從 [https://iportal.mybook.taiwanmobile.com/TAmedia/ios/downloadPage/8.0.0/docs/Classes/TADNativeAdMediaContent.html#/c:@M@TAMediaAdsFramework@objc(cs)TADNativeAdMediaContent(py)isVideoContent TADNativeAdMediaContent.isVideoContent] 得知顯示影片或圖片。<br>
 
*TADNativeMediaView 在螢幕的可視範圍自動播放影片,反之則自動暫停。<br>
*更多原生廣告客製化功能,詳見:[https://iportal.mybook.taiwanmobile.com/TAmedia/ios/downloadPage/8.0.0/docs/Classes/TADNativeAdOptions.html TADNativeAdOptions]
 
*原生廣告物件關係圖:
[[檔案: TADNativeAd Releationship.png |600px]]<br>
*UML:
[[檔案: NativeAdUML.png |800px]]<br>
 
= 舊版本升級 SDK8 =
<b><span style="color:#ff0000">※TADNativeAd 裡的 getNativeAdContent、handleClick 已被棄用</span></b><br>
<b>說明:</b><br>
*原本 <b>getNativeAdContent</b> 取得的 NSDictionary,改以 <b> adContent (TADNativeAdContent)</b> 物件存取<br>
*新增 <b>callToAction</b><br>
{| class="wikitable"
!
!<b>SDK8 之前</b>
!<b>SDK8</b>
!<b>說明</b>
|-
|-
|<b>來源</b>
! 廣告內容 !! 內容細節 !! 資料型別
|getNativeAdContent
|adContent
|
|-
|-
|<b>格式</b>
| align="center"| ShortSubject || align="center"| 短標題 || align="center"| String
|NSDictionary
|TADNativeAdContent
|
|-
|-
|rowspan="11"|<b>內部參數</b>
| align="center"| LongSubject || align="center"| 長標題 || align="center"| String
|LONGSUBJECT
|longSubject
|長標題 long subject  ,※預設值為空字串
|-
|-
|SHORTSUBJECT
| align="center"| Body || align="center"| 內文 || align="center"| String
|shortSubject
|短標題  short subject ,※預設值為空字串
|-
|-
|BODY
| align="center"| CTA || align="center"| 行動呼籲 || align="center"| String
|body
|內文 body ,※預設值為空字串
|-
|-
|ICONSQUARE
| align="center"| iconRect || align="center"| 小圖 (長) || align="center"| TWMNativeAd.Image
|iconSquare
|小圖示 方 icon square ,※預設值為空字串
|-
|-
|ICONRECTANGLE
| align="center"| iconSquare || align="center"| 小圖 (方) || align="center"| TWMNativeAd.Image
|iconRect
|小圖示 長 icon rectangle,※預設值為空字串
|-
|-
|VIDEO
| align="center"| image960_640 || align="center"| 大圖 (960x640) || align="center"| TWMNativeAd.Image
|mediaContent.videoUrl
|影片 video,※預設值為空字串
|-
|-
|IMAGE960X640
| align="center"| image1200_627 || align="center"| 大圖 (1200x627) || align="center"| TWMNativeAd.Image
|mediaContent.image960x640
|大圖 960x640,※預設值為空字串
|-
|IMAGE1200X627
|mediaContent.image1200x627
|大圖 1200x627,※預設值為空字串
|-
|IMAGE1280X720
|N/A
|大圖 1280x720,※預設值為空字串
|-
|nurl
|N/A
|廣告檔次Target URL, 當廣告發生點擊時回報的url
|-
|N/A
|callToAction
|外開廣告網頁的文字, ※預設值為空字串
|-
|-
| align="center"| mediaContent || align="center"| 多媒體素材(影音或主要圖片) || align="center"| TWMMediaContent
|}
|}
*<b>handleClick</b> 不需實作,改由 TADNativeAdView 內處理廣告點擊事件<br>
<br><br>
 
== <b>SDK Document</b> ==
[http://wiki.tamedia.com.tw/androidDoc/library/com.taiwanmobile.pt.adp.view/-t-w-m-native-ad-view/index.html NativeAd]
<br><br>
 
== <b>實作方式</b> ==
 
:步驟1
: 產生一個TWMNativeAd物件, 設定廣告版位adUnitId, 並呼叫load()請求原生廣告
: 監聽TWMAdListener, 透過onReceivedAd()取得原生廣告資訊TWMNativeAd.nativeAdContent
<source>
        // Native ad assets.
        var body: String? = null
        var shortSubject: String? = null
        var longSubject: String? = null
        var callToAction:String? = null
        var iconRect: TWMNativeAd.Image? = null
        var iconSquare: TWMNativeAd.Image? = null
        var image960x640: TWMNativeAd.Image? = null
        var image1200x627: TWMNativeAd.Image? = null
        var mediaContent: TWMMediaContent? = null


= SDK8串接 =
        fun loadAd(context: Context,
請依照  開始使用Getting Started 章節進行SDK 的安裝<br>
                  adUnitId: String) {
並以下述描述串接 原生廣告 SDK 到 APP<br><br>
            nativeAd = TWMNativeAd(context, adUnitId)
            nativeAd?.setAdListener(this)
            nativeAd?.loadAd(TWMAdRequest())
        }


== 設計廣告排版 ==
        override fun onReceiveAd(ad: TWMAd) {
可以依照想要的樣子,設計原生廣告的排版<br>
            this.body = nativeAd?.nativeAdContent?.body
此處以 xib 為例 (也可以用程式碼的方式產生 View)<br>
            this.shortSubject = nativeAd?.nativeAdContent?.shortSubject
<br>
            this.longSubject = nativeAd?.nativeAdContent?.longSubject
新增一個含有 View 的 xib 檔,並取名為 TestNativeAdView<br>
            this.callToAction = nativeAd?.nativeAdContent?.callToAction
[[檔案: TestNativeAdView CreateFile.png |450px]]<br><br><br>
            this.iconRect = nativeAd?.nativeAdContent?.iconRect
            this.iconSquare = nativeAd?.nativeAdContent?.iconSquare
            this.image960x640 = nativeAd?.nativeAdContent?.image960_640
            this.image1200x627 = nativeAd?.nativeAdContent?.image1200_627
            this.mediaContent = nativeAd?.nativeAdContent?.mediaContent
        }
</source>
 
:步驟2
: 使用TWMNativeAdView作為廣告佈局容器, 開發者可在容器中可自行排列文字(TextView)圖形(ImageView)甚至影片(TWMMediaView)等原生廣告
: 下面以短標題, 小圖 (長), Call To Action, 及多媒體素材當範例
<source>
<?xml version="1.0" encoding="utf-8"?>
<com.taiwanmobile.pt.adp.view.TWMNativeAdView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/nativeAdView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@android:color/holo_orange_light">
 
    <LinearLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:minHeight="50dp"
        android:orientation="vertical"
        android:paddingLeft="20dp"
        android:paddingRight="20dp">
 
        <TextView
            android:id="@+id/tv_short_subject"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp" />
 
        <ImageView
            android:id="@+id/iv_icon_rect"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"/>


將內部 UIView 的 custom class 指定為 TADNativeAdView<br>
        <TextView
[[檔案: TestNativeAdView class.png |600px]]<br><br><br>
            android:id="@+id/tv_call_to_action"
加入要顯示的 UILabel,UIImageView<br>
            android:layout_width="wrap_content"
<b>Media View 為 custom class TADNativeMediaView 的 UIView</b><br>
            android:layout_height="wrap_content"
[[檔案: TestNativeAdView TADNativeMediaView.png |600px]]<br><br><br>
            android:layout_marginTop="10dp" />
連結 outlet<br>
[[檔案: TestNativeAdView outlet.png |600px]]<br>


== 新增頁面並導入 SDK ==
        <com.taiwanmobile.pt.adp.nativead.TWMMediaView
新增一個 swift 檔案,檔案名稱為 NativeAdViewController.swift<br>
            android:id="@+id/ad_media"
import TAMediaAdsFramework,並繼承 UIViewController
            android:layout_width="150dp"
            android:layout_height="120dp"
            android:layout_marginTop="10dp"/>


== 建立廣告物件 ==
    </LinearLayout>
新增 resultLabel 的 IBOutlet,與 xib 連結,用來顯示請求廣告的結果訊息(非必要)<br>
</com.taiwanmobile.pt.adp.view.TWMNativeAdView>
新增 TADNativeAd,TADNativeAdView 變數


    import UIKit
</source>
    import TAMediaAdsFramework
   
    class NativeAdViewController: UIViewController {
        @IBOutlet weak var resultLabel: UILabel!
        var nativeAd: TADNativeAd?
        var nativeAdView: TADNativeAdView?
    }


== 請求廣告 ==
:步驟3
實作 RequestAd,並完成 requestAd、clearAd<br>
: 將TWMNativeAd.nativeAdContent的廣告資訊套用在上述廣告佈局中
在 '''YOUR_AD_UNIT_ID''' 填入您的廣告 ID
: 並於TWMNativeAdView進行填充(ex. setShortSubjectView()), 賦予點擊後開啟廣告之功能
<source>
        val adContent: TWMNativeAdContent? = ad?.nativeAdContent


    class NativeAdViewController: UIViewController {
        // shortSubject
         ....
         adContent?.shortSubject.let { subject ->
       
            // 顯示短標題於TextView之中
        override func viewDidLoad() {
            vb.tvShortSubject.text = subject
             super.viewDidLoad()
            // 於TWMNativeAdView進行填充, 賦予點擊後開啟廣告之功能
            requestAd()
             vb.nativeAdView.setShortSubjectView(vb.tvShortSubject)
         }
         }
          
 
         private func requestAd() {
         // rect icon
             clearAd()
         adContent?.iconRect?.getDrawable().let { rectDrawable ->
             self.resultLabel.text = "Loading..."
             // 顯示小圖 ()於ImageView之中
           
             vb.ivIconRect.setImageDrawable(rectDrawable)
            let request = TADRequest()
             vb.ivIconRect.adjustViewBounds = true
             nativeAd = TADNativeAd(adUnitId: "YOUR_AD_UNIT_ID")
             // 於TWMNativeAdView進行填充, 賦予點擊後開啟廣告之功能
             nativeAd?.delegate = self
             vb.nativeAdView.setRectangleIconView(vb.ivIconRect)
             nativeAd?.load(request)
         }
         }
          
 
         private func clearAd() {
         // call to action
             if nativeAd != nil {
         adContent?.callToAction?.let { cta ->
                nativeAd?.delegate = nil
             // 顯示行動呼籲於TextView之中
                nativeAd = nil
            vb.tvCallToAction.text = cta
             }
            // 於TWMNativeAdView進行填充, 賦予點擊後開啟廣告之功能
             vb.nativeAdView.setCallToActionView(vb.tvCallToAction)
         }
         }
    }


== 接收廣告事件 ==
</source>
實作 TADNativeAdDelegate,可以在收到原生廣告事件後,做相對應的處理


:步驟4
: 如欲顯示影片廣告, 將mediaContent指派給TWMMediaView, 用TWMMediaView來顯示影片
<source>
<source>
    extension NativeAdViewController: TADNativeAdDelegate {
         // MediaContent
         // 廣告取得成功
         adContent?.mediaContent?.let { content ->
         func nativeAdDidReceive(_ ad: TADNativeAd!) {
             // 顯示TWMMediaContent於TWMMediaView
             self.resultLabel.text = "Received AD"
            vb.adMedia.setMediaContent(content)
             setupNativeAdView(ad: ad)
            // 於TWMNativeAdView進行填充, 賦予點擊後開啟廣告之功能(前往了解)
             vb.nativeAdView.setMediaView(vb.adMedia)
         }
         }
       
 
        // 廣告取得失敗
</source>
        func nativeAd(_ ad: TADNativeAd!, didFailToReceiveAdWithError error: TADRequestError!) {
 
            self.resultLabel.text = "Error:\(error.localizedDescription)"
:步驟5
        }
: 完成上述後, TWMNativeAd物件指派給TWMNativeAdView, 啟動原生廣告顯示 (重要!!!)
       
<source>
        // 廣告已有效曝光
         // nativeAd
        func nativeAdDidImpression(_ ad: TADNativeAd!) {
         vb.nativeAdView.setNativeAd(nativeAd)
            print("nativeAdDidImpression")
        }
       
        // 點擊廣告
        func nativeAdDidClick(_ ad: TADNativeAd!) {
            print("nativeAdDidClick")
        }
       
         // 應用程式即將進入背景執行或中止運作前被呼叫
         func nativeAdWillLeaveApplication(_ ad: TADNativeAd!) {
            print("nativeAdWillLeaveApplication")
        }
    }
</source>
</source>


<br>
<br>
== <b>TWMNativeAdOptions</b> ==
TWMAdRequest.setNativeAdOptions()供開發者相關功能, 調整原生廣告屬性<br>


== 顯示廣告 ==
:<span style="font-size:16px;">TAmedia Native廣告支援下列數種內容:</span>
在 NativeAdViewController 加入 func setupNativeAdView(ad: TADNativeAd)<br>
{| class="wikitable" style="width:50%"
以將廣告內容顯示在畫面上
|-
! 廣告內容 !! 內容細節
|-
| align="center"| DISABLE_IMAGE_LOADING || align="center"| TWMNativeAdContent.Image不含Drawable物件, 加速廣告下載速度
|-
| align="center"| VIDEO_START_UNMUTED || align="center"| TWMMediaView影片初始為有聲音, 預設為靜音
|-
| align="center"| VIDEO_CUSTOM_CONTROLS_REQUESTED || align="center"| TWMMediaView不提供影片控制項, 預設為提供
|-
| align="center"| MEDIA_PREFER_IMAGE || align="center"| TWMMediaView總是顯示圖片, 預設為影片
|}


: 下面例子為影片初始即有聲音
<source>
<source>
     class NativeAdViewController: UIViewController {
     val adRequest = TWMAdRequest()
        ....
    adRequest.setNativeAdOptions(arrayOf(TWMNativeAdOptions.VIDEO_START_UNMUTED))
       
    nativeAd?.loadAd(adRequest)
        private func setupNativeAdView(ad: TADNativeAd) {
            // 如果是用 addSubview 的方式加入 nativeAdView, 則先移除掉之前加的 view
            nativeAdView?.removeFromSuperview()
            // 使用 loadNib 引入 TADNativeAdView, 並從裡面取得 TADNativeMediaView
            guard let adView: TADNativeAdView = Bundle.main.loadNibNamed("TestNativeAdView", owner: nil, options: nil)?.first as? TADNativeAdView, let mediaView = adView.mediaView else {
                return
            }
            // 從原生廣告物件取得文字, 填入畫面裡的 UILabel
            adView.longSubjectLabel?.text = ad.adContent.longSubject
            adView.shortSubjectLabel?.text = ad.adContent.shortSubject
            adView.bodyLabel?.text = ad.adContent.body
            // 從原生廣告物件取得圖片, 填入畫面裡的 UIImageView
            adView.squareImgeView?.image = ad.adContent.iconSquare?.image
            adView.rectangleImgeView?.image = ad.adContent.iconSquare?.image
            // 從原生廣告物件取得外開廣告網頁的文字, 填入畫面裡的 UIView (可以為 UILabel/UIButton等..)
            (adView.callToActionView as? UILabel)?.text = ad.adContent.callToAction
            // 使用 UIImage 設定 media view 裡的 main image
            mediaView.setMainImage(image: ad.adContent.mediaContent?.image1200x627?.image)
           
            // 設定 main image 的圖片顯示方式
            mediaView.setMainImage(contentMode: .scaleAspectFit)
            // 從原生廣告物件取得 media content, 填入 media view, 由 media content 內部決定該顯示圖片或影音廣告
            mediaView.mediaContent = ad.adContent.mediaContent
            adView.nativeAd = ad
           
            // 將原生廣告加到畫面上
            adView.center = CGPoint(x: self.view.center.x, y: self.view.center.y)
            nativeAdView = adView
            self.view.addSubview(adView)
        }
    }
</source>
</source>


= 客製化選項(可選) =
<br>
<br>


== TADRequest ==
== <b>釋放廣告</b> ==
設置請求廣告的可選控制項,參考[https://iportal.mybook.taiwanmobile.com/TAmedia/ios/downloadPage/8.0.0/docs/Classes/TADRequest.html#/c:objc(cs)TADRequest(py)testDevices TADRequest]<br>
<b><span style="color:#ff0000">請在Activity的生命週期中加入下述的呼叫, 正確釋放TWMNativeAd物件</span></b>
<b>範例:</b><br>
  override fun onDestroy() {
    class NativeAdViewController: UIViewController {
        super.onDestroy()
        ....
        nativeAd?.destroy()
       
  }
        private func requestAd() {
 
            ....
 
            let request = TADRequest()
<br><br>
            request.showLog = true
 
            request.gender = .unknown
== <b>廣告畫面展示</b> ==
            ....
{| border="1"
        }
|-
       
| align="center" | 文字
        ....
| align="center" | 影片
    }
|-
| align="center" | [[image:SDK8 nativead1.png | 300px]]
| align="center" | [[image:SDK8 nativead2.png | 300px]]
|}
 
<br>
<br>
 
== <b>進階. 客製化影片撥放元件(選擇性實作, 非必要)</b> ==
當TWMAdRequest.setNativeAdOptions()使用VIDEO_CUSTOM_CONTROLS_REQUESTED
TWMVideoController / TWMMediaContent包含了下列功能, 提供影片相關資訊, 提供開發者客製化自己的影片控制項
<br>
 
{| class="wikitable" style="width:50%"
|-
! 函式名稱 !! 功能
|-
| align="center"| TWMVideoController.isMuted() || align="center"| 影片是否靜音中
|-
| align="center"| TWMVideoController.mute(boolean)|| align="center"| 影片靜音
|-
| align="center"| TWMVideoController.setVideoLifecycleCallback(callback) || align="center"| 影片生命週期(VideoLifecycleCallback)
|-
| align="center"| TWMMediaContent.getCurrentTime() || align="center"| 取得目前撥放進度
|-
| align="center"| TWMMediaContent.getDuration() || align="center"| 取得影片長度
|}
 
== <b>進階. TWMMediaView 預設UI項目客製化(選擇性實作, 非必要)</b> ==
SDK8支援TWMMediaView UI項目客製化
<br>
開發者可透過TWMMediaView下列函式對預設UI控制項進行客製化
<br>
{| class="wikitable" style="width:50%"
|-
! 函式名稱 !! 功能
|-
| align="center"| TWMMediaView.setCTAVisible(visible: Boolean) || align="center"| 設定CTA是否顯示
|-
| align="center"| TWMMediaView.setCTATextSize(textSize: Float)|| align="center"| 設定CTA文字大小
|-
| align="center"| TWMMediaView.setVideoCountdownTextSize(textSize: Float) || align="center"| 設定影片倒數文字大小
|-
| align="center"| TWMMediaView.setVolumeImageSize(imageSize: Int) || align="center"| 設定靜音圖示大小
|}
[[image:TWMMediaView_CustomUI_Demo.png | 300px]]


== TADNativeAdOptions ==
== <b>進階. 支援Open-Measurement友善障礙物(選擇性實作, 非必要)</b> ==
用於NativeAd的可選控制項,參考[https://iportal.mybook.taiwanmobile.com/TAmedia/ios/downloadPage/8.0.0/docs/Classes/TADNativeAdOptions.html TADNativeAdOptions]<br>
SDK8支援Open-Measurement友善障礙物事件處理
<b>範例:</b><br>
<br>
    class NativeAdViewController: UIViewController {
https://interactiveadvertisingbureau.github.io/Open-Measurement-SDKAndroid/
        ....
       
        private func requestAd() {
            ....
            let request = TADRequest()
            let option = TADNativeAdOptions()
            option.mediaPreferImage = true
            ....   
            nativeAd?.load(request, withOption: option)
            ....
        }
       
        ....
    }


== TADVideoStatusDelegate ==
開發者可透過TWMNativeAdView.addFriendlyObstruction(view, purpose)將與原生廣告相關的控制元件設定為友善障礙物
影片播放事件回報,如有需要收到原生影音廣告的播放事件,參考[https://iportal.mybook.taiwanmobile.com/TAmedia/ios/downloadPage/8.0.0/docs/Protocols/TADVideoStatusDelegate.html TADVideoStatusDelegate]<br>
<br>
<b>範例:</b><br>
下面以FloatingActionButton為例子, 按鈕本身為影片靜音設定,使用FriendlyObstructionPurpose.VIDEO_CONTROLS為障礙物目的
<br>
於TWMNativeAd.setNativeAd()之前完成障礙物添加


<source>
<source>
    class NativeAdViewController: UIViewController {
        // friendlyObstruction
         ....
         vb.nativeAdView.addFriendlyObstruction(vb.fab, TWMNativeAdView.FriendlyObstructionPurpose.VIDEO_CONTROLS)
          
         vb.fab.setOnClickListener {
        private func setupNativeAdView(ad: TADNativeAd) {
            adContent?.mediaContent?.getVideoController()?.let { videoController ->
            ....
                val isMute = videoController.isMuted()
       
                // 設定影片靜音
            if ad.adContent.mediaContent?.isVideoContent == true {
                videoController.mute(!isMute)
                 mediaView.statusDelegate = self
                when (videoController.isMuted()) {
                    true -> { vb.fab.setImageResource(R.drawable.ic_baseline_volume_up_24) }
                    false -> { vb.fab.setImageResource(R.drawable.ic_baseline_volume_mute_24) }
                 }
             }
             }
            ....
         }
         }
    }
 
   
        // nativeAd
    extension NativeAdViewController: TADVideoStatusDelegate {
         vb.nativeAdView.setNativeAd(nativeAd)
         func didStartVideo() {
 
            print("didStartVideo")
</source>
        }
 
        ....
{| class="wikitable" style="width:50%"
     }
|-
! 元件總類 !! 描述
|-
| align="center"| FriendlyObstructionPurpose.VIDEO_CONTROLS || align="center"| 影音控制項
|-
| align="center"| FriendlyObstructionPurpose.CLOSE_AD || align="center"| 關閉廣告
|-
| align="center"| FriendlyObstructionPurpose.NOT_VISIBLE || align="center"| 透明元件
|-
| align="center"| FriendlyObstructionPurpose.OTHER || align="center"| 非上述三種類別
|}
 
== <b>將應用程式的廣告請求標記為兒童導向內容(13 歲以下)</b> ==
<br>
[http://wiki.tamedia.com.tw/androidDoc/library/com.taiwanmobile.pt.adp.view/-t-w-m-ad-request/index.html TWMAdRequest]
<br>
<br>
 
:請於廣告請求時透過TWMAdRequest.setChildDirectedTreatment()告知SDK該廣告標記為兒童導向內容
:Android裝置的Google廣告ID (AAID) 於此模式時不會被存取與紀錄
 
<source>
    val nativeAd: TWMNativeAd = TWMNativeAd(context, adUnitId)
    nativeAd.setAdListener(this)
    nativeAd.loadAd(TWMAdRequest().apply {
        setChildDirectedTreatment(true)
     })
</source>
</source>
[[SDK8_Android_SDK_Developer_Guide | 回首頁]]

於 2022年4月29日 (五) 22:24 的最新修訂

Native廣告支援內容

TAmedia Native廣告支援下列數種內容:
廣告內容 內容細節 資料型別
ShortSubject 短標題 String
LongSubject 長標題 String
Body 內文 String
CTA 行動呼籲 String
iconRect 小圖 (長) TWMNativeAd.Image
iconSquare 小圖 (方) TWMNativeAd.Image
image960_640 大圖 (960x640) TWMNativeAd.Image
image1200_627 大圖 (1200x627) TWMNativeAd.Image
mediaContent 多媒體素材(影音或主要圖片) TWMMediaContent



SDK Document

NativeAd

實作方式

步驟1
產生一個TWMNativeAd物件, 設定廣告版位adUnitId, 並呼叫load()請求原生廣告
監聽TWMAdListener, 透過onReceivedAd()取得原生廣告資訊TWMNativeAd.nativeAdContent
        // Native ad assets.
        var body: String? = null
        var shortSubject: String? = null
        var longSubject: String? = null
        var callToAction:String? = null
        var iconRect: TWMNativeAd.Image? = null
        var iconSquare: TWMNativeAd.Image? = null
        var image960x640: TWMNativeAd.Image? = null
        var image1200x627: TWMNativeAd.Image? = null
        var mediaContent: TWMMediaContent? = null

        fun loadAd(context: Context,
                   adUnitId: String) {
            nativeAd = TWMNativeAd(context, adUnitId)
            nativeAd?.setAdListener(this)
            nativeAd?.loadAd(TWMAdRequest())
        }

        override fun onReceiveAd(ad: TWMAd) {
            this.body = nativeAd?.nativeAdContent?.body
            this.shortSubject = nativeAd?.nativeAdContent?.shortSubject
            this.longSubject = nativeAd?.nativeAdContent?.longSubject
            this.callToAction = nativeAd?.nativeAdContent?.callToAction
            this.iconRect = nativeAd?.nativeAdContent?.iconRect
            this.iconSquare = nativeAd?.nativeAdContent?.iconSquare
            this.image960x640 = nativeAd?.nativeAdContent?.image960_640
            this.image1200x627 = nativeAd?.nativeAdContent?.image1200_627
            this.mediaContent = nativeAd?.nativeAdContent?.mediaContent
        }
步驟2
使用TWMNativeAdView作為廣告佈局容器, 開發者可在容器中可自行排列文字(TextView)圖形(ImageView)甚至影片(TWMMediaView)等原生廣告
下面以短標題, 小圖 (長), Call To Action, 及多媒體素材當範例
<?xml version="1.0" encoding="utf-8"?>
<com.taiwanmobile.pt.adp.view.TWMNativeAdView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/nativeAdView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@android:color/holo_orange_light">

    <LinearLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:minHeight="50dp"
        android:orientation="vertical"
        android:paddingLeft="20dp"
        android:paddingRight="20dp">

        <TextView
            android:id="@+id/tv_short_subject"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp" />

        <ImageView
            android:id="@+id/iv_icon_rect"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"/>

        <TextView
            android:id="@+id/tv_call_to_action"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp" />

        <com.taiwanmobile.pt.adp.nativead.TWMMediaView
            android:id="@+id/ad_media"
            android:layout_width="150dp"
            android:layout_height="120dp"
            android:layout_marginTop="10dp"/>

    </LinearLayout>
</com.taiwanmobile.pt.adp.view.TWMNativeAdView>
步驟3
將TWMNativeAd.nativeAdContent的廣告資訊套用在上述廣告佈局中
並於TWMNativeAdView進行填充(ex. setShortSubjectView()), 賦予點擊後開啟廣告之功能
        val adContent: TWMNativeAdContent? = ad?.nativeAdContent

        // shortSubject
        adContent?.shortSubject.let { subject ->
            // 顯示短標題於TextView之中
            vb.tvShortSubject.text = subject
            // 於TWMNativeAdView進行填充, 賦予點擊後開啟廣告之功能
            vb.nativeAdView.setShortSubjectView(vb.tvShortSubject)
        }

        // rect icon
        adContent?.iconRect?.getDrawable().let { rectDrawable ->
            // 顯示小圖 (長)於ImageView之中
            vb.ivIconRect.setImageDrawable(rectDrawable)
            vb.ivIconRect.adjustViewBounds = true
            // 於TWMNativeAdView進行填充, 賦予點擊後開啟廣告之功能
            vb.nativeAdView.setRectangleIconView(vb.ivIconRect)
        }

        // call to action
        adContent?.callToAction?.let { cta ->
            // 顯示行動呼籲於TextView之中
            vb.tvCallToAction.text = cta
            // 於TWMNativeAdView進行填充, 賦予點擊後開啟廣告之功能
            vb.nativeAdView.setCallToActionView(vb.tvCallToAction)
        }
步驟4
如欲顯示影片廣告, 將mediaContent指派給TWMMediaView, 用TWMMediaView來顯示影片
        // MediaContent
        adContent?.mediaContent?.let { content ->
            // 顯示TWMMediaContent於TWMMediaView
            vb.adMedia.setMediaContent(content)
            // 於TWMNativeAdView進行填充, 賦予點擊後開啟廣告之功能(前往了解)
            vb.nativeAdView.setMediaView(vb.adMedia)
        }
步驟5
完成上述後, TWMNativeAd物件指派給TWMNativeAdView, 啟動原生廣告顯示 (重要!!!)
        // nativeAd
        vb.nativeAdView.setNativeAd(nativeAd)



TWMNativeAdOptions

TWMAdRequest.setNativeAdOptions()供開發者相關功能, 調整原生廣告屬性

TAmedia Native廣告支援下列數種內容:
廣告內容 內容細節
DISABLE_IMAGE_LOADING TWMNativeAdContent.Image不含Drawable物件, 加速廣告下載速度
VIDEO_START_UNMUTED TWMMediaView影片初始為有聲音, 預設為靜音
VIDEO_CUSTOM_CONTROLS_REQUESTED TWMMediaView不提供影片控制項, 預設為提供
MEDIA_PREFER_IMAGE TWMMediaView總是顯示圖片, 預設為影片


下面例子為影片初始即有聲音
    val adRequest = TWMAdRequest()
    adRequest.setNativeAdOptions(arrayOf(TWMNativeAdOptions.VIDEO_START_UNMUTED))
    nativeAd?.loadAd(adRequest)



釋放廣告

請在Activity的生命週期中加入下述的呼叫, 正確釋放TWMNativeAd物件

 override fun onDestroy() {
       super.onDestroy()
       nativeAd?.destroy()
 }




廣告畫面展示

文字 影片
SDK8 nativead1.png SDK8 nativead2.png



進階. 客製化影片撥放元件(選擇性實作, 非必要)

當TWMAdRequest.setNativeAdOptions()使用VIDEO_CUSTOM_CONTROLS_REQUESTED TWMVideoController / TWMMediaContent包含了下列功能, 提供影片相關資訊, 提供開發者客製化自己的影片控制項

函式名稱 功能
TWMVideoController.isMuted() 影片是否靜音中
TWMVideoController.mute(boolean) 影片靜音
TWMVideoController.setVideoLifecycleCallback(callback) 影片生命週期(VideoLifecycleCallback)
TWMMediaContent.getCurrentTime() 取得目前撥放進度
TWMMediaContent.getDuration() 取得影片長度

進階. TWMMediaView 預設UI項目客製化(選擇性實作, 非必要)

SDK8支援TWMMediaView UI項目客製化
開發者可透過TWMMediaView下列函式對預設UI控制項進行客製化

函式名稱 功能
TWMMediaView.setCTAVisible(visible: Boolean) 設定CTA是否顯示
TWMMediaView.setCTATextSize(textSize: Float) 設定CTA文字大小
TWMMediaView.setVideoCountdownTextSize(textSize: Float) 設定影片倒數文字大小
TWMMediaView.setVolumeImageSize(imageSize: Int) 設定靜音圖示大小

TWMMediaView CustomUI Demo.png

進階. 支援Open-Measurement友善障礙物(選擇性實作, 非必要)

SDK8支援Open-Measurement友善障礙物事件處理
https://interactiveadvertisingbureau.github.io/Open-Measurement-SDKAndroid/

開發者可透過TWMNativeAdView.addFriendlyObstruction(view, purpose)將與原生廣告相關的控制元件設定為友善障礙物
下面以FloatingActionButton為例子, 按鈕本身為影片靜音設定,使用FriendlyObstructionPurpose.VIDEO_CONTROLS為障礙物目的
於TWMNativeAd.setNativeAd()之前完成障礙物添加

        // friendlyObstruction
        vb.nativeAdView.addFriendlyObstruction(vb.fab, TWMNativeAdView.FriendlyObstructionPurpose.VIDEO_CONTROLS)
        vb.fab.setOnClickListener {
            adContent?.mediaContent?.getVideoController()?.let { videoController ->
                val isMute = videoController.isMuted()
                // 設定影片靜音
                videoController.mute(!isMute)
                when (videoController.isMuted()) {
                    true -> { vb.fab.setImageResource(R.drawable.ic_baseline_volume_up_24) }
                    false -> { vb.fab.setImageResource(R.drawable.ic_baseline_volume_mute_24) }
                }
            }
        }

        // nativeAd
        vb.nativeAdView.setNativeAd(nativeAd)
元件總類 描述
FriendlyObstructionPurpose.VIDEO_CONTROLS 影音控制項
FriendlyObstructionPurpose.CLOSE_AD 關閉廣告
FriendlyObstructionPurpose.NOT_VISIBLE 透明元件
FriendlyObstructionPurpose.OTHER 非上述三種類別

將應用程式的廣告請求標記為兒童導向內容(13 歲以下)


TWMAdRequest

請於廣告請求時透過TWMAdRequest.setChildDirectedTreatment()告知SDK該廣告標記為兒童導向內容
Android裝置的Google廣告ID (AAID) 於此模式時不會被存取與紀錄
    val nativeAd: TWMNativeAd = TWMNativeAd(context, adUnitId)
    nativeAd.setAdListener(this)
    nativeAd.loadAd(TWMAdRequest().apply {
        setChildDirectedTreatment(true)
    })

回首頁