Domob Android Ad SDK
必要条件
Android 2.2
或更高版本
注意
- 从3.3.0版本我们增加了广告位功能,SDK所有请求广告的接口参数都增加了广告位placementID,您需要去多盟官网手动生成placementID。
- 从4.0.0开始,新增feeds广告类型,具体请参考文档中相关目录或通过sample查看效果。
- 从4.3.0开始,插屏构造函数不再需要设置具体尺寸,如您是替换新版SDK发现原来插屏构造函数代码报错,请将尺寸参数删除即可。
- 从4.5.0开始,对广告位的类名进行修改,比如:DomobAdView --> AdView , 如您是替换新版SDK,请修改广告位的类名。
获取SDK
请前往多盟官网的SDK下载页面下载最新的SDK发行包。
注意:该页在登陆后才能访问。
SDK的嵌入
1.将SDK的发行包(一个zip文件)解压缩,将libs目录下的domob_android_sdk.jar添加到项目中,如下图:

2.将SDK需要的权限添加到AndroidManifest.xml
清单文件中,所需的权限如下:
<!-- 网络访问权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 获取网络信息状态,如当前的网络连接是否有效 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 读取手机状态 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 允许程序写入外部存储,如SD卡上写文件 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 获取错略位置 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 获取WiFi状态 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 震动权限为可选权限,主要是品牌广告会用到,如果您没有添加,需要这些效果的品牌广告将不会投放到您的应用上 -->
<uses-permission android:name="android.permission.VIBRATE" />
3.将SDK需要的Activity声明添加到AndroidManifest.xml清单文件中,所需的Activity声明如下:
<activity
android:name="cn.domob.android.ads.DmActivity"
android:theme="@android:style/Theme.Translucent" />
使用横幅广告(Banner Ad)
若要在应用中添加一个横幅广告(Banner Ad),只需要简单的几步:
1.准备好用于加载广告视图的ViewGroup(例如RelativeLayout)。
2.使用您从多盟官网获得的Publisher ID和 Placement ID以及当前的Activity,来初始化一个AdView
的实例。
3.实现一个AdEventListener
接口,并设置给Adview
的实例。
4.通过AdView
的实例设置您期望的广告尺寸(此步骤可以省略,默认是Flexible banner,这也是我们推荐的)。
5.通过AdView
的实例设置可选参数,来提高广告投放的精准性。
6.最后将AdView
的实例添加到准备好的ViewGroup中。
下面的代码片段,简要说明了这个过程:
public class BannerAdActivity extends Activity {
RelativeLayout mAdContainer;
AdView mAdview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.banner);
mAdContainer = (RelativeLayout) findViewById(R.id.adcontainer);
// Create ad view
mAdview = new AdView(BannerAdActivity.this,
DomobSampleActivity.PUBLISHER_ID, DomobSampleActivity.InlinePPID);
mAdview.setAdSize(AdView.INLINE_SIZE_FLEXIBLE);
mAdview.setKeyword("game");
mAdview.setUserGender("male");
mAdview.setUserBirthdayStr("2000-08-08");
mAdview.setUserPostcode("123456");
mAdview.setAdEventListener(new AdEventListener() {
@Override
public void onAdOverlayPresented(AdView adView) {
Log.i("DomobSDKDemo", "overlayPresented");
}
@Override
public void onAdOverlayDismissed(AdView adView) {
Log.i("DomobSDKDemo", "Overrided be dismissed");
}
@Override
public void onAdClicked(AdView arg0) {
Log.i("DomobSDKDemo", "onDomobAdClicked");
}
@Override
public void onLeaveApplication(AdView arg0) {
Log.i("DomobSDKDemo", "onDomobLeaveApplication");
}
@Override
public Context onAdRequiresCurrentContext() {
return BannerAdActivity.this;
}
@Override
public void onAdFailed(AdView arg0, ErrorCode arg1) {
Log.i("DomobSDKDemo", "onDomobAdFailed");
}
@Override
public void onEventAdReturned(AdView arg0) {
Log.i("DomobSDKDemo", "onDomobAdReturned");
}
});
RelativeLayout.LayoutParams layout = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
layout.addRule(RelativeLayout.CENTER_HORIZONTAL);
mAdview.setLayoutParams(layout);
mAdContainer.addView(mAdview);
}
}
适配横竖屏旋转的应用
当Activity添加属性android:configChanges="orientation|keyboard|keyboardHidden"
,而且您设置的不是Flexible banner,这时您需要复写Activity的onConfigurationChanged方法,调用AdView
的实例的orientationChanged
方法,如下:
@Override
public void onConfigurationChanged(Configuration configuration) {
super.onConfigurationChanged(configuration);
mAdview.orientationChanged();
}
横幅广告的尺寸
目前我们所支持的横幅广告尺寸包括
Size(逻辑像素) | Recommended |
---|---|
320x50 | android手机 |
300x250 | android手机 android平板 |
728x90 | android平板 |
600x94 | android平板 |
600x500 | android平板 |
Flexible | All Android Devices |
我们强烈建议您使用Flexible Banner,它可以适应各种类型的设备,以及进行横竖屏的自适应(Flexible Banner的高度在Android手机上为50
(逻辑像素),在平板上为90
(逻辑像素),宽度自适应)。上例中所展示的也是使用Flexible Banner的方法。
如果想使用固定尺寸的横幅广告,则可通过使用AdView
的setAdSize
方法来设置,在AdView
也定义了广告尺寸的静态变量,如下:
mAdview.setAdSize(AdView.INLINE_SIZE_320X50);
展示的是使用320x50
尺寸的横幅广告的方法。
使用插屏广告(Interstitial Ad)
插屏广告的使用,同样非常简单,只需要几步即可完成。但值得注意的是,插屏和横幅广告的使用是不同的,插屏广告在使用的时候要先调用loadInterstitialAd
方法请求到广告,在合适的时机调用showInterstitialAd
方法来展示插屏广告;在展示结束时通过loadInterstitialAd
方法请求一次广告,便于在下次使用时直接通过showInterstitialAd
方法来展示广告,减少一次广告请求时间。
1.使用您从多盟官网获得的Publisher ID和 Placement ID以及当前的Activity,来初始化一个InterstitialAd
的实例。
2.实现一个InterstitialAdListener
接口,并设置给InterstitialAd
的实例。
3.通过InterstitialAd
的实例设置可选参数,来提高广告投放的精准性。
4.在合适的时候,调用loadInterstitialAd
方法,来预加载插屏广告。
5.在合适的时候先调用isInterstitialAdReady
方法检测是否加载完毕,再调用showInterstitialAd
方法来呈现插屏广告。
6.注意
在呈现完成后,需要重新通过loadInterstitialAd
方法,加载一条新广告,用于下次呈现。
下面的代码片段,简单描述了这个过程:
public class InterstitialAdActivity extends Activity {
InterstitialAd mInterstitialAd;
Button mInterstitialBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.interstital);
mInterstitialBtn = (Button) findViewById(R.id.interstitial);
mInterstitialAd = new InterstitialAd(this, DomobSampleActivity.PUBLISHER_ID,
DomobSampleActivity.InterstitialPPID);
mInterstitialAd.setInterstitialAdListener(new InterstitialAdListener() {
@Override
public void onInterstitialAdReady() {
Log.i("DomobSDKDemo", "onAdReady");
}
@Override
public void onLandingPageOpen() {
Log.i("DomobSDKDemo", "onLandingPageOpen");
}
@Override
public void onLandingPageClose() {
Log.i("DomobSDKDemo", "onLandingPageClose");
}
@Override
public void onInterstitialAdPresent() {
Log.i("DomobSDKDemo", "onInterstitialAdPresent");
}
@Override
public void onInterstitialAdDismiss() {
// Request new ad when the previous interstitial ad was closed.
mInterstitialAd.loadInterstitialAd();
Log.i("DomobSDKDemo", "onInterstitialAdDismiss");
}
@Override
public void onInterstitialAdFailed(ErrorCode arg0) {
Log.i("DomobSDKDemo", "onInterstitialAdFailed");
}
@Override
public void onInterstitialAdLeaveApplication() {
Log.i("DomobSDKDemo", "onInterstitialAdLeaveApplication");
}
@Override
public void onInterstitialAdClicked(InterstitialAd arg0) {
Log.i("DomobSDKDemo", "onInterstitialAdClicked");
}
});
mInterstitialAd.loadInterstitialAd();
mInterstitialBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mInterstitialAd.isInterstitialAdReady()) {
mInterstitialAd.showInterstitialAd(InterstitialAdActivity.this);
} else {
Log.i("DomobSDKDemo", "Interstitial Ad is not ready");
mInterstitialAd.loadInterstitialAd();
}
}
});
}
}
使用信息流广告(Feeds Ad)
feeds广告类型适合具有列表下拉刷新场景的应用添加,当用户为了更新内容,将列表下拉,用户手势松开的时机,在列表的顶部展示广告。
信息流广告的使用,需要以下几步:
1.请将自定义的ListView用LinearLayout包裹一层。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/adcontainer"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<cn.domob.ads.sample.MyListView
android:id="@+id/listView"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>
2.使用您从多盟官网获得的Publisher ID和 Placement ID以及当前的Activity,来初始化一个FeedsAdView
的实例。
3.实现一个FeedsAdListener
接口,并设置给FeedsAdView
的实例。
4.通过FeedsAdView
的实例设置可选参数,来提高广告投放的精准性。
5.用包裹Listview的LinearLayout对象,通过addView(FeedsAdView
, 0)的方式将FeedsAdView对象插入LinearLayout最前端。
6.在合适的时候,调用loadFeedsAd
方法请求广告。
7.在用户刷新列表内容时调用showFeedsAd
方法来展示广告。
8.在展示结束时通过loadFeedsAd
方法请求下一次广告,便于在下次使用时直接通过showFeedsAd
方法来展示广告,减少一次广告请求时间。
注意
广告在展现期间被其它view遮挡时,请调用SDK提供的接口closeFeedsAd()关闭广告,广告声音会随之消失。
下面的代码片段,简单描述了这个过程:
public class FeedsAdActivity extends Activity {
private Handler mHandler = new Handler(Looper.getMainLooper());
private LinkedList<String> mDataLinkedList;
private BaseAdapter mBaseAdapter;
private FeedsAdView mFeedsAdView;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.feeds);
final LinearLayout parentLinearLayout = (LinearLayout) findViewById(R.id.adcontainer);
mFeedsAdView = new FeedsAdView(this, DomobSampleActivity.PUBLISHER_ID, DomobSampleActivity.FeedsPPID);
mFeedsAdView.setFeedsAdListener(new FeedsAdListener() {
@Override
public void onLandingPageOpen() {
Log.i("DomobSDKDemo", "onLandingPageOpen");
}
@Override
public void onLandingPageClose() {
Log.i("DomobSDKDemo", "onLandingPageClose");
}
@Override
public void onFeedsAdReady() {
Log.i("DomobSDKDemo", "onFeedsAdReady");
}
@Override
public void onFeedsAdPresent() {
Log.i("DomobSDKDemo", "onFeedsAdPresent");
}
@Override
public void onFeedsAdLeaveApplication() {
Log.i("DomobSDKDemo", "onFeedsAdLeaveApplication");
}
@Override
public void onFeedsAdFailed(ErrorCode code) {
Log.i("DomobSDKDemo", "onFeedsAdFailed");
}
@Override
public void onFeedsAdDismiss() {
Log.i("DomobSDKDemo", "onFeedsAdDismiss");
parentLinearLayout.invalidate();
mFeedsAdView.loadFeedsAd();
}
@Override
public void onFeedsAdClicked(FeedsAdView feedsAdView) {
Log.i("DomobSDKDemo", "onFeedsAdClicked");
}
});
parentLinearLayout.addView(mFeedsAdView, 0);
mFeedsAdView.loadFeedsAd();
final MyListView listView = (MyListView) findViewById(R.id.listView);
listView.setonRefreshListener(new OnRefreshListener() {
public void onRefresh() {
if (mFeedsAdView.isFeedsAdReady()) {
mFeedsAdView.showFeedsAd(FeedsAdActivity.this);
} else {
mFeedsAdView.loadFeedsAd();
}
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
listView.onRefreshComplete();
}
}, 2000);
}
});
mDataLinkedList = new LinkedList<String>();
for (int i = 0; i < 10; i++) {
mDataLinkedList.add(String.valueOf(i));
}
mBaseAdapter = new BaseAdapter() {
public View getView(int position, View convertView, ViewGroup parent) {
convertView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.item, null);
TextView textView = (TextView) convertView.findViewById(R.id.textView_item);
textView.setText(mDataLinkedList.get(position));
return convertView;
}
public long getItemId(int position) {
return position;
}
public Object getItem(int position) {
return mDataLinkedList.get(position);
}
public int getCount() {
return mDataLinkedList.size();
}
};
listView.setAdapter(mBaseAdapter);
}
}
使用开屏广告(Splash Ad)
开屏广告的使用场景是在App刚刚开启时,在SDK内分为缓存开屏
和实时开屏
两种。
缓存开屏的加载机制为,本次加载,缓存本次的广告应答以及相关资源,下次开启时展现。
实时开屏在每次开启时都会实时请求广告并加载和缓存资源,在超时时间前加载完成即自动展现。
详细使用方法可见Sample中的SplashScreenActivity类中使用的示例代码。
开屏广告类型 | 广告请求流程 | 优点 | 缺点 |
---|---|---|---|
缓存开屏 | 当次缓存,下次展现。 | 无需等待广告loading,体验好。 | 填充到展现流失率较高。 |
实时开屏 | 当次加载,当次展现,超时放弃(超时时限开发者可设)。 | 填充到展现流失率较低。 | 用户需要短暂的等待。 |
注意:
1、使用开屏广告前要确保您的应用有自己的开机画面,并且在开屏的界面上提供一个Layout作为开屏广告的容器。
2、在开屏广告被关闭或展现完成需要自动关闭时,会回调onSplashDismiss/onRTSplashDismiss方法,通知开发者开屏被关闭。在这个方法中,强烈建议开发者进行开屏页面到主页面的跳转(即Activity跳转),这样给用户带来的是开屏到主屏的无缝切换体验。
3、建议开发者在开屏界面的Activity中,通过onKeyDown方法,屏蔽开屏界面的返回键行为(KeyEvent.KEYCODE_BACK),以此来保证您的开屏和多盟的开屏广告正常显示完成。
下面的代码片段,简单描述了这个过程:
public class SplashScreenActivity extends Activity {
SplashAd splashAd;
RTSplashAd rtSplashAd;
// 缓存开屏广告:true 实时开屏广告:false
// Cache splash ad:true Real-time splash ad:false
private boolean isSplash = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 去掉Activity上面的状态栏
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
// 去掉标题栏
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.splash);
/**
*
* SplashMode.SplashModeFullScreen 请求开屏广告的尺寸为全屏
* SplashMode.SplashModeSmallEmbed 请求开屏广告的尺寸不是全屏,根据设备分辨率计算出合适的小屏尺寸
* SplashMode.SplashModeBigEmbed
* 请求开屏广告的尺寸不是全屏,更具设备分辨率计算出合适的相对SmallMode的尺寸
*
*/
if (isSplash) {
// 缓存开屏广告
// Cache splash ad
splashAd = new SplashAd(this, DomobSampleActivity.PUBLISHER_ID, DomobSampleActivity.SplashPPID,
SplashMode.SplashModeFullScreen);
// setSplashTopMargin is available when you choose non-full-screen
// splash mode.
// splashAd.setSplashTopMargin(200);
splashAd.setKeyword("game");
splashAd.setUserGender("male");
splashAd.setUserBirthdayStr("2000-08-08");
splashAd.setUserPostcode("123456");
splashAd.setSplashAdListener(new SplashAdListener() {
@Override
public void onSplashPresent() {
Log.i("DomobSDKDemo", "onSplashStart");
}
@Override
public void onSplashDismiss() {
Log.i("DomobSDKDemo", "onSplashClosed");
// 开屏回调被关闭时,立即进行界面跳转,从开屏界面到主界面。
// When splash ad is closed, jump to the next(main) Activity
// immediately.
jump();
// 如果应用没有单独的闪屏Activity,需要调用closeSplash方法去关闭开屏广告
// If you do not carry a separate advertising activity, you
// need to call closeRTSplash way to close the splash ad
// splashAd.closeSplash();
}
@Override
public void onSplashLoadFailed() {
Log.i("DomobSDKDemo", "onSplashLoadFailed");
}
});
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (splashAd.isSplashAdReady()) {
splashAd.splash(SplashScreenActivity.this,
SplashScreenActivity.this.findViewById(R.id.splash_holder));
} else {
Toast.makeText(SplashScreenActivity.this, "Splash ad is NOT ready.", Toast.LENGTH_SHORT).show();
jump();
}
}
}, 1);
} else {
// 实时开屏广告
// Real-time splash ad
rtSplashAd = new RTSplashAd(this, DomobSampleActivity.PUBLISHER_ID, DomobSampleActivity.SplashPPID,
SplashMode.SplashModeFullScreen);
// setRTSplashTopMargin is available when you choose non-full-screen
// splash mode.
// rtSplashAd.setRTSplashTopMargin(200);
rtSplashAd.setKeyword("game");
rtSplashAd.setUserGender("male");
rtSplashAd.setUserBirthdayStr("2000-08-08");
rtSplashAd.setUserPostcode("123456");
rtSplashAd.setRTSplashAdListener(new RTSplashAdListener() {
@Override
public void onRTSplashDismiss() {
Log.i("DomobSDKDemo", "onRTSplashClosed");
// 开屏回调被关闭时,立即进行界面跳转,从开屏界面到主界面。
// When rtSplash ad is closed, jump to the next(main)
// Activity immediately.
jump();
// 如果应用没有单独的闪屏Activity,需要调用closeRTSplash方法去关闭开屏广告
// If you do not carry a separate advertising activity, you
// need to call closeRTSplash way to close the splash ad
// rtSplashAd.closeRTSplash();
}
@Override
public void onRTSplashLoadFailed() {
Log.i("DomobSDKDemo", "onRTSplashLoadFailed");
}
@Override
public void onRTSplashPresent() {
Log.i("DomobSDKDemo", "onRTSplashStart");
}
});
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
rtSplashAd.splash(SplashScreenActivity.this,
SplashScreenActivity.this.findViewById(R.id.splash_holder));
}
//展现等待时间
}, 1);
}
}
@Override
protected void onPause() {
super.onPause();
Log.d("DomobSDKDemo", "Splash onPause");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("DomobSDKDemo", "Splash onDestroy");
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// 屏蔽返回键/Back key disabled
if (keyCode == KeyEvent.KEYCODE_BACK) {
return true;
}
return super.onKeyDown(keyCode, event);
}
private void jump() {
startActivity(new Intent(SplashScreenActivity.this, DomobSampleActivity.class));
finish();
}
}
获取示例
我们的实例工程都托管在Github上
- Android Ad SDK 示例工程 其中包括上述所有广告形式的使用方法。
获得帮助
如还有疑问,欢迎随时发邮件到support@domob.cn获得更多帮助。