Domob Android Ad 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),只需要简单的几步:

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的方法。

如果想使用固定尺寸的横幅广告,则可通过使用AdViewsetAdSize方法来设置,在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上

获得帮助

如还有疑问,欢迎随时发邮件到support@domob.cn获得更多帮助。