Android FaceBook原生廣告與統計接入教程(精簡版)
公司專案主要做海外市場,並且是資訊類的產品,所以接入一些廣告公司的廣告是一項不錯的創收,昨天下午產品告訴我要馬上接入Facebook的原生廣告需求,於是下午就開始閱讀Facebook廣告接入的官方開發文件進行接入測試了,當然,接入的過程並沒有那麼順利,遇到了好多坑,還好有一個有接入經驗的大哥幫助加上自己堅持不懈的努力,最終成功的接入了。
FaceBook的原生廣告的文件寫的很詳細,從建立專案到接入Facebook的廣告sdk,再到自定義廣告佈局,呼叫廣告api展示廣告介紹的都非常詳細,只不過新手第一次做的話,只做這些還不夠,接下來跟你細細分析我的爬坑之路。
先把正確的接入流程寫出來:
1、註冊Facebook賬號(這個就不多說)
2、找到原生廣告整合文件(提示:先看https://developers.facebook.com/docs/audience-network/android 緊接著 再看這個
3、配置相關資訊:
使用 Facebook SDK 之前,需要先進行初始化。將呼叫新增到 Application 類中 onCreate 的 FacebookSdk.sdkInitialize: public class MyApplication extends Application { // Updated your class body: @Override public void onCreate() { super.onCreate(); // Initialize the SDK before executing any other operations, FacebookSdk.sdkInitialize(getApplicationContext()); // Facebook統計開啟 AppEventsLogger.activateApp(this); //FaceBook Ads廣告,這個addTestDevice("")中的字串是裝置的編號,第一次執行實 從log日誌裡面觀察可以看到,複製進來即可,不寫這裡會導致不出來廣告的異常 AdSettings.addTestDevice("1b0a5f0c-877d-4fe8-99df-a0322cde3a8e") } }
AndroidMainfest.xml中要配置Facebook的應用id
<application android:name=".MyApplication" android:icon="@mipmap/icon" android:label="@string/app_name" android:roundIcon="@drawable/icon_logo" android:supportsRtl="true" android:theme="@style/AppTheme"> <!-- Facebook的應用id --> <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id" /> <!-- 如果需要接入Facebook統計的話需要整合這個 --> <activity android:name="com.facebook.FacebookActivity" android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation" android:label="@string/app_name" /> </application> 注意不要忘記在AndroidMainfest.xml檔案中寫入MyApplication
4 、新增依賴
在app級別下的build.gradle下新增如下依賴,這個也是Facebook官方文件最推薦的方式
dependencies {
...
implementation 'com.facebook.android:facebook-android-sdk:4.6.0'
implementation 'com.facebook.android:audience-network-sdk:4.28.1'
...
}
5、寫主要邏輯程式碼和自定義廣告佈局部分,這裡會分步驟詳解:
第一步:先建立一個native_ad_layout.xml檔案寫自己的自定義廣告佈局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/native_ad_unit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:orientation="vertical"
android:paddingLeft="10dp"
android:paddingRight="10dp">
<LinearLayout
android:id="@+id/ll_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingBottom="10dp"
android:paddingTop="10dp">
<ImageView
android:id="@+id/native_ad_icon"
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_gravity="center_vertical"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingLeft="5dp">
<TextView
android:id="@+id/native_ad_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="2"
android:textColor="@android:color/black"
android:textSize="15sp"/>
<TextView
android:id="@+id/sponsored_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:lines="1"
android:text="Sponsored"
android:textColor="@android:color/darker_gray"
android:textSize="10sp"/>
</LinearLayout>
<LinearLayout
android:id="@+id/ad_choices_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="right"
android:orientation="horizontal"/>
</LinearLayout>
<com.facebook.ads.MediaView
android:id="@+id/native_ad_media"
android:layout_width="wrap_content"
android:layout_height="100dp"
android:gravity="center"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="5dp">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="3"
android:orientation="vertical"
android:paddingRight="10dp">
<TextView
android:id="@+id/native_ad_social_context"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:gravity="center_vertical"
android:lines="2"
android:paddingRight="5dp"
android:textColor="@android:color/darker_gray"
android:textSize="10sp"/>
<TextView
android:id="@+id/native_ad_body"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:gravity="center_vertical"
android:lines="2"
android:textColor="@android:color/black"
android:textSize="10sp"/>
</LinearLayout>
<Button
android:id="@+id/native_ad_call_to_action"
android:layout_width="100dp"
android:layout_height="30dp"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:background="#4286F4"
android:gravity="center"
android:paddingLeft="3dp"
android:paddingRight="3dp"
android:textColor="@android:color/white"
android:textSize="11sp"/>
</LinearLayout>
</LinearLayout>
第二步:在你要顯示這個廣告的佈局裡面建立一個容器,來動態新增這個廣告的佈局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:paddingTop="50dp">
...
<!--自定義Facebook ads佈局容器-->
<LinearLayout
android:id="@+id/native_ad_container"
android:layout_width="250dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="vertical"/>
...
</RelativeLayout>
第三步:寫載入廣告的函式
//宣告三個變數
private var nativeAd: NativeAd? = null
private var nativeAdContainer: LinearLayout? = null
private var adView: LinearLayout? = null
private fun showNativeAd() {
// nativeAd = NativeAd([email protected], "YOUR_PLACEMENT_ID") //加入你的廣告版位號 測試的話直接用這個"YOUR_PLACEMENT_ID"就可以,不用改寫
nativeAd = NativeAd([email protected], "1445302316225142_1445305302891510") // 正式的廣告版位號
// 手機上必須安裝並且登陸谷歌play和Facebook app,然後Facebook賬號必須在賬號中心管理者後臺新增開發者和測試者
nativeAd!!.setAdListener(object : AdListener {
override fun onAdClicked(p0: Ad?) {
Log.d(TAG, "onAdClicked")
}
override fun onError(p0: Ad?, p1: AdError?) {
Log.d(TAG, "onError")
toast("Ad onError")
}
override fun onAdLoaded(p0: Ad?) {
Log.d(TAG, "onAdLoaded")
if (nativeAd != null) {
nativeAd!!.unregisterView()
}
// Add the Ad view into the ad container.
nativeAdContainer = native_ad_container
var inflater: LayoutInflater = LayoutInflater.from([email protected])
// Inflate the Ad view. The layout referenced should be the one you created in the last step.
adView = inflater.inflate(R.layout.native_ad_layout, nativeAdContainer, false) as LinearLayout
nativeAdContainer?.addView(adView)
// Create native UI using the ad metadata.
val nativeAdIcon = adView!!.native_ad_icon as ImageView
val nativeAdTitle = adView!!.native_ad_title as TextView
val nativeAdMedia = adView!!.native_ad_media as MediaView
val nativeAdSocialContext = adView!!.native_ad_social_context as TextView
val nativeAdBody = adView!!.native_ad_body as TextView
val nativeAdCallToAction = adView!!.native_ad_call_to_action as Button
// Set the Text.
nativeAdTitle.setText(nativeAd!!.getAdTitle())
nativeAdSocialContext.setText(nativeAd!!.getAdSocialContext())
nativeAdBody.setText(nativeAd!!.getAdBody())
nativeAdCallToAction.setText(nativeAd!!.getAdCallToAction())
// Download and display the ad icon.
var adIcon: NativeAd.Image = nativeAd!!.getAdIcon()
NativeAd.downloadAndDisplayImage(adIcon, nativeAdIcon)
// Download and display the cover image.
nativeAdMedia.setNativeAd(nativeAd)
toast("成功了")
// Add the AdChoices icon
var adChoicesContainer: LinearLayout = adView!!.ad_choices_container
var adChoicesView: AdChoicesView = AdChoicesView([email protected], nativeAd, true)
adChoicesContainer.addView(adChoicesView)
// Register the Title and CTA button to listen for clicks.
var clickableViews = mutableListOf<View>()
clickableViews.add(nativeAdTitle)
clickableViews.add(nativeAdCallToAction)
nativeAd!!.registerViewForInteraction(nativeAdContainer, clickableViews)
}
override fun onLoggingImpression(p0: Ad?) {
Log.d(TAG, "onLoggingImpression")
toast("")
}
})
// Request an ad
nativeAd!!.loadAd()
}
第四步:在你的activity中onCreate方法裡面呼叫這個showNativeAd()的函式就行
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
showNativeAd()
}
其實這裡如果正常的話會正常的出來廣告,但是我這裡沒有出來,原因很簡單:
手機上沒有安裝Facebook和谷歌play,
裝上後一定要登陸上你的Facebook賬號,
並且這個賬號必須在你註冊的應用賬號中心管理者後臺新增為開發者,
然後檢查手機網路確認已經翻牆後,就可以正常的顯示廣告了。
以上這幾點也是我遇到的最坑的幾點,要不是一個接過廣告的老手幫忙除錯,我還不知道怎麼能把廣告顯示出來估計
另外這裡再介紹給大家一種新的除錯Android應用的方法,因為Facebook是認簽名的,釋出版才能正常呼叫分享,廣告等功能,跟微信一樣,以前都是打包成釋出版的apk包進行測試,這樣的壞處是不能正常看log日誌,不能正常跟蹤異常資訊,總是打包也不太方便,然後就發現了一種可以測試環境也可以直接用釋出版簽名的方法,很方便,這裡做下記錄:
在app級別的bulide.glide中的Android{}中新增或者修改為如下
signingConfigs {
release {
keyAlias 'your keyAlias'
keyPassword 'adminis'
storeFile file('C:/Users/EASY/Desktop/key/mykey.jks')
storePassword 'your storePassword '
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
signingConfig signingConfigs.release
}
}
然後這樣就可以直接debug跑專案的時候也可以直接除錯釋出版才能除錯的功能了,而且log,error資訊隨時掌握,非常方便,哈哈,感覺收穫滿滿的今天!
相關推薦
Android FaceBook原生廣告與統計接入教程(精簡版)
公司專案主要做海外市場,並且是資訊類的產品,所以接入一些廣告公司的廣告是一項不錯的創收,昨天下午產品告訴我要馬上接入Facebook的原生廣告需求,於是下午就開始閱讀Facebook廣告接入的官方開發文件進行接入測試了,當然,接入的過程並沒有那麼順利,遇到了好多
HashMap與HashTable的區別(精簡版)
對於HashMap與HashTable的區別這個老掉牙的問題,雖然平時我們在開始發都把集合用的很溜,但是要讓你講出來或者是說出它的內在原理,很多人一臉懵逼。接下來我就通過三個方面簡單概括這個問題: 背景: Hashtable是基於陳舊的Dictionary類
AdMob Android谷歌廣告接入(精簡版)
import android.app.Activity import android.util.Log import android.widget.Toast import com.google.android.gms.ads.AdListener impo
最新微信Tinker 熱修復平臺接入教程(超詳細)
目錄 Tinker接入文件 1 Tinker簡介 1.1Tinker優點 1.2 Tinker缺點 1.Tinker不支援修改AndroidManifest.xml,Tinker不支援新增四大元件(1.9.0支援新增非export的A
短視訊直播平臺第三方特效SDK接入教程(完整版)
近些年,隨著網路視訊直播行業的興起,Faceu激萌、抖音短視訊受到了使用者極度的追捧,整個行業的使用者市場與發展前景都非常不錯,已成為時下最熱門的話題,大部分企業希望在自己的移動應用上新增類似Faceu、抖音等功能需求,實現以上需求現在大部分企業是通過第三方視訊SDK來完成的
*Android 多線程下載 仿下載助手(改進版)
result 代碼 android exist delete efault dsta stat sdn 首先聲明一點: 這裏的多線程下載 並非指的 多個線程下載一個 文件。而是 每一個線程 負責一個文件。真正的多線程 希望後面能給大家帶來。 -------------
【Unity編程】歐拉角與萬向節死鎖(圖文版)
num 接頭 標記 轉發 b2c 出現 spl 探索 質量 萬向節死鎖(Gimbal Lock)問題 上文中以前說過,歐拉旋轉的順規和軸向定義,自然造就了“萬向節死鎖”問題。本文主要來探索它自然形成的原因。 陀螺儀 首先。我們來了解Gimbal
python基礎教程(第二版)---1.4數字和表達式
pan com -1 一行 img 分享 cnblogs 第二版 輸出結果 一、除法 二、取余運算 對於整數: 對於浮點數: 2.75/0.5是為了說明除法結果是5.5 取余的時候(2.75-5*0.5)==0.25就得到了第一行的輸出結果0.25啦 這
OpenAcc社區版安裝教程(Linux版)
下載 mage 操作系統 技術分享 OS tar png 鏈接 blank 下載OpenAcc社區版 1,目前為止的最新版,平臺是Linux,選擇Linux x86-64. 我的服務器系統是CentOs 下載地址鏈接:https://www.pgroup.com/produ
Visual Studio 2017 安裝使用教程(詳細版)
系統設置 -s 分享圖片 代碼 ++ 官網下載 studio 題解 微軟官網 Visual Studio 2017 安裝使用教程(詳細) 本人曾因無法使用vs編寫C語言程序痛苦一個月之久,實乃慚愧,後發現不少同學也同樣存在著相同問題,其原因歸結於網上的各種教程
多多客小程序開源版8步快速安裝教程(圖文版)
開源 小程序開發 微信小程序 1、首先我們打開 https://gitee.com/doodooke/doodoo,下載zip壓縮包 2、進入下載的代碼目錄,打開命令行 3、執行命令安裝依賴yarn 4、創建數據庫
Git 與 GitLab 環境配置(Mac版)
安裝Git 使用圖形化Git安裝工具,下載地址:https://git-scm.com/downloads 配置GitLab SSH公鑰 Git支援HTTPS和SSH兩種協議,HTTPS每次pull、push時要求輸入密碼,建議使用SSH。 1、檢視本機是否有SSH key。 $
後續遍歷--遞迴與非遞迴(java版)
先訪問左右孩子,再訪問根節點。同樣還是採用棧的形式,但是問題是,先訪問左孩子出棧,根節點不能刪除,再訪問右孩子出棧,最後訪問根節點出棧。我們的思路是這樣的: 對於某個節點p: 1)將p壓入棧中,並將p所有的左孩子,全部壓入棧中: while(stk.
用優啟通製作U盤啟動盤教程(UEFI版)
製作前準備: 1.下載優啟通uefi版到本地磁碟; 2.準備一個能正常使用的U盤,最好大於4G(製作過程會格式化U盤,請先備份好U盤資料)。 第一步:開啟優啟通uefi版,將準備好的u盤插入電腦usb介面,軟體會自動識別並選擇當前插入的u盤,點選“一鍵製作啟動U盤”: 第二步:此時彈出
美圖DPOS以太坊教程(Docker版)
一、前言 最近,需要接觸區塊鏈專案的主鏈開發,在EOS、BTC、ethereum、超級賬本這幾種區塊鏈技術當中,相互對比後,最終還是以go-ethereum為解決方案。 以ethereum為基準去找解決方案,最終找到了2個符合自己要求的方案,分別如下:美圖、gttc。本來是想用gttc的這個解決方案的,但是
百度網站收錄教程(個人版)
讓百度搜索到有兩種方法,一種是等百度主動來爬取你的網站,還有一種是你自己主動提交給百度告訴它來爬取。第一種週期太過漫長,所以本文就講第二種 1.準備網站 首先,想要做SEO的同學,需要考慮清楚所選擇的前端框架。現在主流的angularJs,Vue.js,react.js這
【RL-TCPnet網路教程】第40章 RL-TCPnet之TFTP客戶端(精簡版)
第40章 RL-TCPnet之TFTP客戶端 本章節為大家講解RL-TCPnet的TFTP客戶端應用,學習本章節前,務必要優先學習第38章的TFTP基礎知識。有了這些基礎知識之後,再搞本章節會有事半功倍的效果。 本章教程含STM32F407開發板和STM32F429開發板。 40.1 初學者重要提
基於UMeng訊息推送測試-demo教程(iOS版)
基於UMeng訊息推送測試-demo教程(iOS版) 眼看著就要過年了(2017本命年終於快過去了臨來嶄新的2018大發年),每個人的心裡就像飛了一樣,這個時候能夠在辦公間待下來的,每個人都是精英,突然想起了那首張含韻的歌《放假了》。 今天是2017年臘月25距離2018年僅有5天,依舊在外
Windows 10 + kali Linux 雙系統安裝教程(詳細版)
準備工具如下: kali Linux 映象 準備一4G以上的U盤 製作U盤啟動盤工具- Win32DiskImager 新增引導工具-EasyBCD 留出一個空的盤,哪個盤的空間比較大可以壓縮出大概20-50G的空間。 1.磁碟壓縮新建分割槽 開啟計算機管理 》 儲存
嵌入式linux基礎教程(第二版)第一章
linux已經成為很多裝置的作業系統,手機、DVD播放器、電子遊戲機、數碼相機、網路交換機和無線網路裝置、機頂盒、高清電視、藍光DVD播放器、汽車的資訊娛樂中心和很多日常使用的電器等都在使用linux作業系統。linux已經成為很多裝置的嵌入式作業系統 一.為