1. 程式人生 > >android開發步步為營之68:Facebook原生廣告接入總結

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;
    }
}