开发应用的目的是干嘛?一方面当然是提供优质服务给用户,还有一方面最重要的还是须要有盈利。不然谁还有动力花钱花时间去开发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;
}
}

android开发步步为营之68:Facebook原生广告接入总结的更多相关文章

  1. facebook原生广告添加adchoice图标

    1.在需要显示adchoice的地方添加一个textview: <LinearLayout android:id="@+id/ad_ic_action" android:la ...

  2. android开发步步为营之65:解决ScrollView和ListView触摸事件onInterceptTouchEvent相互冲突问题

    近期项目里面有个需求,一个页面放了一个ScrollView,整个页面能够向上滚动,然后ScrollView里面又嵌套了一个ListView,ListView里面的数据也是能够上下滑动的,理论上List ...

  3. android开发步步为营之67:使用android开源项目android-async-http异步下载文件

    android-async-http项目地址 https://github.com/loopj/android-async-http.android-async-http顾名思义是异步的http请求, ...

  4. 2015年Android开发新技术盘点

    又到年末. 利用中午的时间,汇总盘点一下今年Android开发方面的新技术.感觉如今Android开发没有曾经那么纯粹了,出现了非常多新的开发模式. 2015年影响比較普遍的新技术应该就是Materi ...

  5. Android H5混合开发(3):原生Android项目里嵌入Cordova

    前言 如果安卓项目已经存在了,那么如何使用Cordova做混合开发? 方案1(适用于插件会持续增加或变化的项目): 新建Cordova项目并添加Android平台,把我们的安卓项目导入Android平 ...

  6. 源码下载:74个Android开发开源项目汇总

    1. ActionBarSherlock ActionBarSherlock应该算得上是GitHub上最火的Android开源项目了,它是一个独立的库,通过一个API和主题,开发者就可以很方便地使用所 ...

  7. Android开发免费类库和工具集合

    用于Android开发的免费类库和工具集合,按目录分类. Action Bars ActionBarSherlock Extended ActionBar FadingActionBar GlassA ...

  8. 让你Android开发更简单

    转载:http://www.jianshu.com/p/22ff8b5fdadc 搭建一个新的Android项目,你会怎么做? 每个人对应用框架的理解不相同,但是最终达到的效果应该是一样: ①降低项目 ...

  9. 【Mood-12】Android开发相关书籍推荐

    新年伊始,找到Android进阶干货若干,2015拜读. 1.Android应用UI设计模式 目前,谷歌Android操作系统在移动市场中风头正劲,并且未来发展势不可挡.<Android应用UI ...

随机推荐

  1. 一个tomcat部署俩个java web项目

    2.发布的时候可以发布成war包,用项目名称右键export,选择项目名称,还有发布的路径,即tomcat下的路径,参考http://zhidao.baidu.com/link?url=imOu0Uu ...

  2. expdp 备份数据库-附带报错信息

    操作系统层面创建目录 [root@Oracle11g ~]# mkdir -p /home/oracle/db_back/ 修改目录的所属用户.所属组 [root@Oracle11g ~]# chow ...

  3. 使用第三方框架 Masonry 实现自动布局

    使用第三方框架 Masonry 实现自动布局 时间:2015-02-10 11:08:41      阅读:4595      评论:0      收藏:0      [点我收藏+] 标签: 由于前两 ...

  4. Ubuntu12.4 64位 安装 arm linux gcc 4.3.2

    一.下载arm linux gcc 4.3.2 http://pan.baidu.com/share/link?shareid=1575352696&uk=2754759285&fid ...

  5. 合(析)取范式转主合(析)取范式--》Java实现

    这次老师布置了如下上机作业,不限语言.思前想后,问了几个大神,说了一堆不知道什么鬼的算法名称.... 经过一番百度,发现Java可以包含库然后使用JavaScript的一些函数,其中eval() 函数 ...

  6. 将对象保存至文件——CArchive

    CArchive允许以一个二进制的形式保存一个对象的复杂网络,也可以再次装载它们,在内存中重新构造,这一过程叫作串行化/序列化(Serialization),简单的说,CArchive与CFile配合 ...

  7. ubuntu用户及用户组文件信息

    1.用户帐号文件 /etc/passwd中存放当前系统的用户列表及用户基本的设置信息: 文件中每一行对应一个用户信息,用户信息用":"来分隔,各项内容含义如下: 用户名:用户密码: ...

  8. Android学习----Android Studio 技巧汇总

    关于快捷键 The File Structure Popup ctrl+f12此快捷键可以调出当前文件的大纲,并通过模糊匹配快速跳转至指定的方法.勾选上“show anonymous classes” ...

  9. 初涉JavaScript模式系列 阶段总结及规划

    总结 不知不觉写初涉JavaScript模式系列已经半个月了,没想到把一个个小点进行放大,竟然可以发现这么多东西. 期间生怕对JS的理解不到位而误导各位,读了很多书(个人感觉JS是最难的oo语言),也 ...

  10. JQUERY1.9学习笔记 之内容过滤器(二) 空元素选择器

    描述:选择没有子元素(包括文本节点)的标签. jQuery(":empty") 与:parent相反. 例:找出所有为空的元素.(他们没有子元素或文本元素). <!docty ...