開發應用的目的是干嘛?一方面當然是提供優質服務給用戶,還有一方面最重要的還是須要有盈利。不然誰還有動力花錢花時間去開發app?
我們的應用主攻海外市場,所以主要還是接入國外的廣告提供商。本文就今天剛完畢接入facebook原生廣告功能,介紹一下怎樣接入fb的原生廣告。供大家參考。
第一步:申請接入賬號(須要翻牆)
https://developers.facebook.com/docs/audience-network/getting-started#company_info
https://developers.facebook.com/docs/audience-network?
locale=zh_CN
第二步:facebook sdk下載
https://developers.facebook.com/docs/android?locale=zh_CN
下載完畢后將AudienceNetwork.jar放入項目中的libs中
第三步:接入參考文檔
NativeAd單條廣告
https://developers.facebook.com/docs/audience-network/android/native-api?locale=zh_CN
NativeAdsManager多條廣告
https://developers.facebook.com/docs/audience-network/android/nativeadsmanager?locale=zh_CN
注意由於facebook原生廣告沒有提供廣告地址(比方app下載地址或者廣告的跳轉地址),須要使用這種方法來觸發廣告的跳轉:
nativeAd.registerViewForInteraction(view); 該方法將廣告跳轉事件傳給自己定義的view
給出demo:
/**
*
*/
package com.figo.study;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import com.figo.study.bitmapcache.core.AsynImageLoader.LoadingListener;
import com.figo.study.bitmapcache.core.AsynImageLoader.OnLoadImageCallBackListener;
import com.facebook.ads.Ad;
import com.facebook.ads.AdError;
import com.facebook.ads.AdListener;
import com.facebook.ads.NativeAd;
import com.facebook.ads.NativeAdsManager;
import com.facebook.ads.NativeAdsManager.Listener;
import com.figo.study.utils.CommonUtils;
/**
* @author figo
*
*/
public class FbAdvertisementActivity extends Activity {
private String tag = "FbAdvertisementActivity";
private ImageView imgLogo;
private TextView tvTitle, tvContent;
private LinearLayout layout_ad;
private ListView lvFbAds;
List<NativeAd> nativeAds;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_facebookad);
layout_ad = (LinearLayout) findViewById(R.id.layout_ad);
imgLogo = (ImageView) findViewById(R.id.img_logo);
tvTitle = (TextView) findViewById(R.id.tv_title);
tvContent = (TextView) findViewById(R.id.tv_content);
lvFbAds = (ListView) findViewById(R.id.lv_fbads);
loadAd("1542807559327931_1609143346027685");
}
private void loadAd(String adId) {
//載入多條廣告
final List<NativeAd> nativeAds = new ArrayList<NativeAd>();
final NativeAdsManager nam = new NativeAdsManager(FbAdvertisementActivity.this, "1542807559327931_1609143346027685", 10);
nam.setListener(new Listener() {
@Override
public void onAdsLoaded() {
int count = nam.getUniqueNativeAdCount();
while (count > 0) {
nativeAds.add(nam.nextNativeAd());
count--;
}
FbAdAdapter fba = new FbAdAdapter(nativeAds, FbAdvertisementActivity.this);
lvFbAds.setAdapter(fba);
}
@Override
public void onAdError(AdError paramAdError) {
Log.e(tag, "FbNotificationNativeAd:onError:" + paramAdError.getErrorCode() + ", " + paramAdError.getErrorMessage());
}
});
nam.loadAds();
//載入單條廣告
final NativeAd nativeAd = new NativeAd(FbAdvertisementActivity.this, adId);
nativeAd.setAdListener(new AdListener() {
@Override
public void onError(Ad ad, AdError error) {
Log.e(tag, "FbNotificationNativeAd:onError:" + error.getErrorCode() + ", " + error.getErrorMessage());
}
@Override
public void onAdLoaded(final Ad ad) {
if (ad != nativeAd)
return;
if (nativeAd.getAdIcon() == null || nativeAd.getAdIcon().getUrl() == null)
return;
tvTitle.setText(nativeAd.getAdTitle());
tvContent.setText(nativeAd.getAdSubtitle());
//通過lrucache載入圖片到內存
MainApplication.shared().asynImageLoader.getImage(nativeAd.getAdIcon().getUrl(), 200, new OnLoadImageCallBackListener() {
@Override
public void onSuccess(String key, BitmapDrawable bitmap) {
imgLogo.setImageDrawable(bitmap);
}
@Override
public void onFailure(String key, int errorType) {
}
});
nativeAd.registerViewForInteraction(layout_ad);
}
@Override
public void onAdClicked(Ad ad) {
}
});
nativeAd.loadAd();
}
class FbAdAdapter extends BaseAdapter {
List<NativeAd> nativeAds;
Context mContext;
public FbAdAdapter(List<NativeAd> fbNativeAds, Context context) {
nativeAds = fbNativeAds;
mContext = context;
}
@Override
public int getCount() {
return nativeAds.size();
}
@Override
public Object getItem(int position) {
return nativeAds.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.listitem_facebookad, parent, false);
viewHolder = new ViewHolder();
viewHolder.imgLogo = (ImageView) convertView.findViewById(R.id.img_logo);
viewHolder.tvTitle = (TextView) convertView.findViewById(R.id.tv_title);
viewHolder.tvContent = (TextView) convertView.findViewById(R.id.tv_content);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
// 將數據源中的數據填充到每一行中相應的控件
MainApplication.shared().asynImageLoader.loadImageInContainer(nativeAds.get(position).getAdIcon().getUrl(), viewHolder.imgLogo, CommonUtils.dip2px(FbAdvertisementActivity.this, 72),
getResources().getDrawable(R.drawable.ic_launcher), getResources().getDrawable(R.drawable.ic_launcher), new LoadingListener() {
@Override
public void onLoadStart() {
}
@Override
public void onLoadInProgress(int progress) {
}
@Override
public void onLoadEnd(boolean isSuccess) {
notifyDataSetChanged();
}
});
viewHolder.tvTitle.setText(nativeAds.get(position).getAdTitle());
viewHolder.tvContent.setText(nativeAds.get(position).getAdSubtitle());
nativeAds.get(position).registerViewForInteraction(convertView);
return convertView;
}
}
class ViewHolder {
ImageView imgLogo;
TextView tvTitle;
TextView tvContent;
}
}
