android開發步步為營之68:Facebook原生廣告接入總結
開發應用的目的是幹嘛?一方面當然是提供優質服務給使用者,另一方面最重要的還是需要有盈利,不然誰還有動力花錢花時間去開發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; } }