Android 第三方廣告聚合框架:自己開發的APP怎樣收益?

Matthew_Chen發表於2019-03-11

TogetherAd

TogetherAd 封裝了多種廣告的 SDK,可以自行控制請求各種廣告次數的比例,

目前支援的廣告

百度Mob、騰訊GDT、科大訊飛

功能介紹

多種平臺隨機展示

因為各個平臺分發廣告的量實際上有可能不夠用,所以多種廣告根據一定比例隨機展示會使收益最大化

控制個平臺廣告的展示比例

因為各個平臺分發廣告的量是不一樣的,比如廣點通分配1000次,百度只有100次,那麼展示廣點通和百度廣告的次數必然是10:1才能使收益最大化

廣告失敗切換

如果某個平臺的廣告請求失敗或沒有量,會自動在其他廣告中隨機出一種再次請求,這樣可以儘可能多的展示廣告,使收益最大化

效果圖

Android 第三方廣告聚合框架:自己開發的APP怎樣收益? Android 第三方廣告聚合框架:自己開發的APP怎樣收益? Android 第三方廣告聚合框架:自己開發的APP怎樣收益? Android 第三方廣告聚合框架:自己開發的APP怎樣收益?

整合方法

第一種: Gradle 整合 專案根目錄下 build.gradle 中

allprojects {
    repositories {
        ...
        maven { url "https://jitpack.io" }
    }
}
複製程式碼

Module 目錄下 build.gradle 中

dependencies {
    implementation 'com.github.ifmvo:TogetherAd:lastest_version'
}
複製程式碼

第二種: 本地匯入 aar 整合 點選下載 TogetherAd-1.1.4.aar 檔案後,放入 Module 目錄下的 libs 資料夾中 Module 目錄下 build.gradle 中

dependencies {
    implementation(name: 'TogetherAd-1.1.4', ext: 'aar')
}
複製程式碼

使用方法

Java 呼叫姿勢

  1. 自定義廣告位 新建一個名字叫做 TogetherAdConst 的類,這個類用來定義所有廣告的位置,例:開屏廣告、列表資訊流 ... 等等
public class TogetherAdConst {
    //開屏
    public static final String AD_SPLASH = "ad_splash";
    
    //插屏
    public static final String AD_TIEPIAN_LIVE = "ad_flow_tiepian_live";
    
    //首頁資訊流
    public static final String AD_FLOW_INDEX = "ad_flow_index";
    
    //直播播放器前貼
    public static final String AD_INTER = "ad_inter";
    
    ......
}
複製程式碼

自定義的廣告位用於初始化廣告位ID,也被當做請求廣告時的引數

  1. 初始化
//初始化百度Mob廣告
Map<String, String> baiduIdMap = new HashMap<>();
baiduIdMap.put(TogetherAdConst.AD_SPLASH, "相應的廣告位ID");
baiduIdMap.put(TogetherAdConst.AD_INTER, "xxxxxx");
baiduIdMap.put(TogetherAdConst.AD_FLOW_INDEX, "xxxxxx");
baiduIdMap.put(TogetherAdConst.AD_VIDEO_PRE, "xxxxxx");
TogetherAd.INSTANCE.initBaiduAd(getApplicationContext(), "你的Baidu_MobAds的APPID", baiduIdMap);

//初始化騰訊廣點通廣告
Map<String, String> gdtIdMap = new HashMap<>();
gdtIdMap.put(TogetherAdConst.AD_SPLASH, "相應的廣告位ID");
gdtIdMap.put(TogetherAdConst.AD_INTER, "xxxxxxxxxxxx");
gdtIdMap.put(TogetherAdConst.AD_FLOW_INDEX, "xxxxxxxxxxxx");
gdtIdMap.put(TogetherAdConst.AD_VIDEO_PRE, "xxxxxxxxxxxx");
TogetherAd.INSTANCE.initGDTAd(getApplicationContext(), "你的GDT的APPID", gdtIdMap);

//初始化科大訊飛廣告
Map<String, String> iFlyIdMap = new HashMap<>();
iFlyIdMap.put(TogetherAdConst.AD_SPLASH, "相應的廣告位ID");
iFlyIdMap.put(TogetherAdConst.AD_INTER, "xxxxxxxxxxxx");
iFlyIdMap.put(TogetherAdConst.AD_FLOW_INDEX, "xxxxxxxxxxxx");
iFlyIdMap.put(TogetherAdConst.AD_VIDEO_PRE, "xxxxxxxxxxxx");
TogetherAd.INSTANCE.initXunFeiAd(getApplicationContext(), iFlyIdMap);
複製程式碼
  1. 開屏廣告的呼叫姿勢
/**
 * mContext 上下文
 * splashConfigStr: 各平臺的展示比例,會根據這個比例隨機請求某個平臺的廣告,比例越大展示的概率就越大
 * 例如: "baidu:1,gdt:1,xunfei:1" (baidu、gdt、xunfei 等key區分大小寫)
 * adConstStr: 廣告位 例如:TogetherAdConst.AD_SPLASH
 * adsParentLayout: 展示開屏廣告的容器 ( 廣告平臺要求:容器大小不低於螢幕的75% )
 * adListener: 監聽器廣告狀態回撥
 */
TogetherAdSplash.INSTANCE.showAdFull(mContext, splashConfigStr, adConstStr, adsParentLayout, new TogetherAdSplash.AdListenerSplashFull() {
    @Override
    public void onStartRequest(@NotNull String s) {
        //開始請求廣告之前,channel:gdt、baidu、xunfei
    }

    @Override
    public void onAdClick(@NotNull String s) {
        //廣告被點選之後,channel:gdt、baidu、xunfei
    }

    @Override
    public void onAdFailed(@Nullable String s) {
        //廣告載入失敗
    }

    @Override
    public void onAdDismissed() {
        //廣告倒數計時結束
    }

    @Override
    public void onAdPrepared(@NotNull String s) {
        //廣告請求成功,準備展示,channel:gdt、baidu、xunfei
    }
});
複製程式碼
  1. 資訊流廣告的呼叫姿勢
/**
 * 資訊流廣告會隨機返回其中一種平臺的廣告集合,一般用於列表中廣告的展示
 * mContext 上下文
 * listConfigStr: 各平臺的展示比例,會根據這個比例隨機請求某個平臺的廣告,比例越大展示的概率就越大
 * 例如: "baidu:1,gdt:1,xunfei:1" (baidu、gdt、xunfei 等key區分大小寫)
 * adConstStr: 廣告位 例如:TogetherAdConst.AD_FLOW_INDEX
 * adListener: 監聽器廣告狀態回撥
 */
TogetherAdFlow.INSTANCE.getAdList(mContext, "baidu:1,gdt:1,xunfei:1", adConstStr, new TogetherAdFlow.AdListenerList() {
    @Override
    public void onAdFailed(@Nullable String s) {
        //廣告載入失敗
    }

    @Override
    public void onAdLoaded(@NotNull String s, @NotNull List<?> list) {
        //廣告請求成功,準備展示
        //channel:gdt、baidu、xunfei
        //adList:某個平臺的廣告List,list裡面的object:NativeMediaADData 是廣點通,NativeResponse 是百度,NativeADDataRef 是科大訊飛
        //可以通過多型別列表進行展示,詳細可借鑑 Demo 中的 IndexFragment 
    }

    @Override
    public void onStartRequest(@NotNull String s) {
        //開始請求廣告之前,channel:gdt、baidu、xunfei
    }
    // onClick 點選事件需要自行根據各平臺的文件處理
});
複製程式碼
  1. 前貼廣告的呼叫姿勢
TogetherAdPreMovie.INSTANCE.showAdPreMovie(this, "baidu:1,gdt:1,xunfei:1", TogetherAdConst.AD_TIEPIAN_LIVE, adsParentLayout, new TogetherAdPreMovie.AdListenerPreMovie() {
    @Override
    public void onAdClick(@NotNull String s) {
        //廣告被點選之後,channel:gdt、baidu、xunfei
    }

    @Override
    public void onAdFailed(@Nullable String s) {
        //廣告載入失敗
    }

    @Override
    public void onAdDismissed() {
        //廣告倒數計時結束
    }

    @Override
    public void onAdPrepared(@NotNull String s) {
        //廣告請求成功,準備展示,channel:gdt、baidu、xunfei
    }

    @Override
    public void onStartRequest(@NotNull String s) {
        //開始請求廣告之前,channel:gdt、baidu、xunfei
    }
});
複製程式碼
  1. 插屏廣告呼叫姿勢
TogetherAdInter.INSTANCE.showAdInter(this, Config.interAdConfig(), TogetherAdConst.AD_INTER, false, mRlInterAd, new TogetherAdInter.AdListenerInter() {
    @Override
    public void onStartRequest(@NotNull String s) {
        //開始請求廣告之前,channel:gdt、baidu、xunfei
    }

    @Override
    public void onAdClick(@NotNull String s) {
        //廣告被點選之後,channel:gdt、baidu、xunfei
    }

    @Override
    public void onAdFailed(@Nullable String s) {
        //廣告載入失敗
    }

    @Override
    public void onAdDismissed() {
        //廣告倒數計時結束
    }

    @Override
    public void onAdPrepared(@NotNull String s) {
        //廣告請求成功,準備展示,channel:gdt、baidu、xunfei
    }
});
複製程式碼

Kotlin 呼叫姿勢

  1. 自定義廣告位 新建一個名字叫做 TogetherAdConst 的類,這個類用來定義所有廣告的位置,例:開屏廣告、列表資訊流 ... 等等
class TogetherAdConst {
    companion object {
        //開屏
        const val AD_SPLASH = "ad_splash"

        //插屏
        const val AD_INTER = "ad_inter"

        //首頁資訊流
        const val AD_FLOW_INDEX = "ad_flow_index"
        
        //視訊播放前貼
        const val AD_VIDEO_PRE = "ad_video_pre"

        //xxxxxxxx
        const val XXX_XXX_XXX = "xxx_xxx_xxx"
        
        ......
    }
}
複製程式碼

自定義的廣告位用於初始化廣告位ID,也被當做請求廣告時的引數

  1. 初始化
//初始化百度Mob廣告
val baiduIdMap = mutableMapOf<String, String?>(
    TogetherAdConst.AD_SPLASH to "2543740",
    TogetherAdConst.AD_INTER to "2543741",
    TogetherAdConst.AD_FLOW_INDEX to "2715031",
    TogetherAdConst.AD_TIEPIAN_LIVE to "5985131"
)
TogetherAd.initBaiduAd(applicationContext, "ee93e58e", baiduIdMap)

//初始化騰訊廣點通廣告
val gdtIdMap = mutableMapOf<String, String?>(
    TogetherAdConst.AD_SPLASH to "8030228893573270",
    TogetherAdConst.AD_INTER to "4090620883979242",
    TogetherAdConst.AD_FLOW_INDEX to "4010231735332811",
    TogetherAdConst.AD_TIEPIAN_LIVE to "4060449650093530"
)
TogetherAd.initGDTAd(applicationContext, "1106572734", gdtIdMap)

//初始化科大訊飛廣告
val xunFeiIdMap = mutableMapOf<String, String?>(
    TogetherAdConst.AD_SPLASH to "FD0AC8FDE5CE0B317A6C4077E68D34CC",
    TogetherAdConst.AD_INTER to "6FD44C667D5EFD97730CC1E3F174D965",
    TogetherAdConst.AD_FLOW_INDEX to "EE2009111A1DF0BCA9DAD3723A95602F",
    TogetherAdConst.AD_TIEPIAN_LIVE to "93D157AAFA8B7EF64165B1F0ECEE2623"
)
TogetherAd.initXunFeiAd(applicationContext, xunFeiIdMap)
複製程式碼
  1. 開屏廣告的呼叫姿勢
/**
 * mContext 上下文
 * splashConfigStr: 各平臺的展示比例,會根據這個比例隨機請求某個平臺的廣告,比例越大展示的概率就越大
 * 例如: "baidu:1,gdt:1,xunfei:1" (baidu、gdt、xunfei 等key區分大小寫)
 * adConstStr: 廣告位 例如:TogetherAdConst.AD_SPLASH
 * adsParentLayout: 展示開屏廣告的容器 ( 廣告平臺要求:容器大小不低於螢幕的75% )
 * adListener: 監聽器廣告狀態回撥
 */
TogetherAdSplash.showAdFull(mContext, splashConfigStr, adConstStr, adsParentLayout, object : TogetherAdSplash.AdListenerSplashFull {
    override fun onStartRequest(channel: String) {
        //開始請求廣告之前,channel:gdt、baidu、xunfei
    }

    override fun onAdClick(channel: String) {
        //廣告被點選之後,channel:gdt、baidu、xunfei
    }

    override fun onAdFailed(failedMsg: String?) {
        //廣告載入失敗
    }

    override fun onAdDismissed() {
        //廣告倒數計時結束
    }

    override fun onAdPrepared(channel: String) {
        //廣告請求成功,準備展示,channel:gdt、baidu、xunfei
    }
})
複製程式碼
  1. 資訊流廣告的呼叫姿勢
/**
 * 資訊流廣告會隨機返回其中一種平臺的廣告集合,一般用於列表中廣告的展示
 * mContext 上下文
 * listConfigStr: 各平臺的展示比例,會根據這個比例隨機請求某個平臺的廣告,比例越大展示的概率就越大
 * 例如: "baidu:1,gdt:1,xunfei:1" (baidu、gdt、xunfei 等key區分大小寫)
 * adConstStr: 廣告位 例如:TogetherAdConst.AD_FLOW_INDEX
 * adListener: 監聽器廣告狀態回撥
 */
TogetherAdFlow.getAdList(mContext, "baidu:1,gdt:1,xunfei:1", adConstStr, object : TogetherAdFlow.AdListenerList {
    override fun onAdFailed(failedMsg: String?) {
        //廣告載入失敗
    }

    override fun onAdLoaded(channel: String, adList: List<*>) {
        //廣告請求成功,準備展示
        //channel:gdt、baidu、xunfei
        //adList:某個平臺的廣告List,list裡面的object:NativeMediaADData 是廣點通,NativeResponse 是百度,NativeADDataRef 是科大訊飛
        //可以通過多型別列表進行展示,詳細可借鑑 Demo 中的 IndexFragment 
    }

    override fun onStartRequest(channel: String) {
        //開始請求廣告之前,channel:gdt、baidu、xunfei
    }
    
    // onClick 點選事件需要自行根據各平臺的文件處理
})

複製程式碼
  1. 前貼廣告的呼叫姿勢
TogetherAdPreMovie.showAdPreMovie(this, "baidu:1,gdt:1,xunfei:1", TogetherAdConst.AD_TIEPIAN_LIVE, adsParentLayout, object : TogetherAdPreMovie.AdListenerPreMovie {
    override fun onAdClick(channel: String) {
        //廣告被點選之後,channel:gdt、baidu、xunfei
    }

    override fun onAdFailed(failedMsg: String?) {
        //廣告載入失敗
    }

    override fun onAdDismissed() {
        //廣告倒數計時結束
    }

    override fun onAdPrepared(channel: String) {
        //廣告請求成功,準備展示,channel:gdt、baidu、xunfei
    }

    override fun onStartRequest(channel: String) {
        //開始請求廣告之前,channel:gdt、baidu、xunfei
    }
})
複製程式碼
  1. 插屏廣告呼叫姿勢
TogetherAdInter.showAdInter(this, Config.interAdConfig(), TogetherAdConst.AD_INTER, false, mRlInterAd, object : TogetherAdInter.AdListenerInter {
    override fun onStartRequest(channel: String) {
        //開始請求廣告之前,channel:gdt、baidu、xunfei
    }

    override fun onAdClick(channel: String) {
        //廣告被點選之後,channel:gdt、baidu、xunfei
    }

    override fun onAdFailed(failedMsg: String?) {
        //廣告載入失敗
    }

    override fun onAdDismissed() {
        //廣告倒數計時結束
    }

    override fun onAdPrepared(channel: String) {
        //廣告請求成功,準備展示,channel:gdt、baidu、xunfei
    }
})
複製程式碼

隨機廣告配置的規則

假如有 BAIDU,GDT,ADVIEW 這三種廣告,實際的配置字串應該是這樣的:"baidu:3,gdt:3,adview:4"

  1. 隨機廣告配置必須符合這樣的格式
    "xxx:m,yyy:n,zzz:i"

  2. AdRandomUtil 這個類只會識別特定的 key ( 例:baidu、gdt、adview )
    "baidu:2,gdt:8" <==> "baidu:2,gdt:8,abc:3" ( abc 會被忽略 )

  3. key 區分大小寫
    "BAIDU:2,GDT:8" ≠ "baidu:2,gdt:8"
    "Baidu:2,Gdt:8" ≠ "baidu:2,gdt:8"

廣告切源的邏輯以及實際實現的方式

假如有 BAIDU,GDT,ADVIEW 這三種廣告 ( 實際的配置字串:"baidu:3,gdt:3,adview:4" )

第一次隨機到了 GDT,如果 GDT 請求失敗,將 GDT 的 key 使用一個通用的字串替換,再從其他的廣告中再隨機
此時的配置字串:"baidu:3,HIDE:3,adview:4"

第二次隨機到了 BAIDU,如果 BAIDU 也請求失敗了,將 BAIDU 的 key 使用一個通用的字串替換,再從其他的廣告中再隨機
此時的配置字串:"HIDE:3,HIDE:3,adview:4"
......
直到請求某個廣告成功後停止
如果所有的廣告全部失敗,此時的配置字串:"HIDE:3,HIDE:3,HIDE:4"

對 TogetherAd 有疑問?

可以到 TogetherAd 的 Github 提交Issues ,或新增 TogetherAd 交流群 : 688291767

Android 第三方廣告聚合框架:自己開發的APP怎樣收益?

相關文章