AndroidでのAdWhirlの実装

ぐぐっても公式サンプルしかまとまったコードがなくて、しかも内容が大変いい加減(だと思う)なので、ここにまとめてみた。
AdWhirlやAdMobなどのサービスへのアカウント登録、SDKのインストールなどは公式サイトを見て下さい。
ここでは、iMobileとAdLantisとnendについても実装します。


まず、広告を表示するアクティビティのレイアウトxml中に、広告を表示するLinearLayoutを作成します。

<LinearLayout
    android:id="@+id/ad_layout"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >
</LinearLayout>

こんな感じ。
ここでは、idにad_layoutを指定しました。


次に、広告を表示するアクティビティクラスはAdWhirlInterfaceの実装を指定して、さらに、

private AdWhirlLayout adWhirlLayout;
private jp.co.imobile.android.AdView imobileAd;
private AdlantisView adlantisAd;
private NendAdView nendAd;

のように、AdWhirlが広告を表示するレイアウトオブジェクトをインスタンス変数に持たせます。
命名法がださいけど気にしない。


次に、onCreateで、AdWhirlのレイアウトを作成します。

imobileAd = AdView.createForAdWhirl(this, <iMobileのメディアID>, <iMobileのスポットID>); //iMobileのビューを作成
adlantisAd = new AdlantisView(this); //AdLantisのビューを作成
nendAd = new NendAdView(this, <nendスポットID>, "<nend API KEY>");
LinearLayout layout = (LinearLayout) findViewById(R.id.ad_layout); //広告を表示するLinearLayoutを取得
adWhirlLayout = new AdWhirlLayout(this, "<AdWhirlのID>"); //AdWhirlのビューを作成、公式サンプルではAndroidManifest.xmlにIDを書けって書いてあるけど現状これで動く
RelativeLayout.LayoutParams adWhirlLayoutParams = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
adWhirlLayoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
adWhirlLayout.setAdWhirlInterface(this); //AdWhirlのデリゲートを自身のインスタンスに設定
int diWidth = 320;
int diHeight = 52;
float density = getResources().getDisplayMetrics().density; //公式サンプルではintになってるがfloatじゃないとダメ
adWhirlLayout.setAdWhirlInterface(this);
adWhirlLayout.setMaxWidth((int) (diWidth * density));
adWhirlLayout.setMaxHeight((int) (diHeight * density));
layout.addView(adWhirlLayout, adWhirlLayoutParams); //広告用LinearLayout内にAdWhirlの広告ビューを追加
layout.invalidate();

こんな感じです。


次に、iMobileとAdLantisとnendの広告も表示できるようにします。
AdWhirlの管理画面からCustomEventを作成します。
それぞれ、handleimobile、handleAdLantis、handleNendというFunctionNameにしたとします。
これも命名法がださいというか統一されてないけど、なんかAdWhirlの管理権限を握ってるうちの上司が勝手につけちゃったから仕方ない。

@Override
public void adWhirlGeneric() {
}

// for iMobile
public void handleimobile() {
	Log.e("Ad", "iMobile");
	imobileAd.setOnRequestListener(new AdViewRequestListener() {
		@Override
		public void onCompleted(AdRequestResult result, AdView sender) {
			adWhirlLayout.adWhirlManager.resetRollover();
			adWhirlLayout.handler.post(new ViewAdRunnable(adWhirlLayout, sender));
			adWhirlLayout.rotateThreadedDelayed();
		}
		@Override
		public void onFailed(AdRequestResult result, AdView sender) {
			adWhirlLayout.rollover();
		}
	});
	// 広告取得開始
	imobileAd.start();
}

// for AdLantis
public void handleAdLantis() {
	Log.e("Ad", "AdLantis");
	adlantisAd.showNextAd();
	adWhirlLayout.adWhirlManager.resetRollover();
	adWhirlLayout.handler.post(new ViewAdRunnable(adWhirlLayout, (ViewGroup)adlantisAd));
	adWhirlLayout.rotateThreadedDelayed();
}

// for nend
public void handleNend() {
	Log.e("Ad", "Nend");
	adWhirlLayout.adWhirlManager.resetRollover();
	adWhirlLayout.handler.post(new ViewAdRunnable(adWhirlLayout, (ViewGroup) nendAd));
	adWhirlLayout.rotateThreadedDelayed();
}

のように実装すれば、とりあえず広告が表示されます。
Log.eの行はデバッグ用です。
たまにパラパラ漫画のように広告が表示されてしまう場合があるのですが、原因は不明です。
AdWhirl側の問題のような気がしますが。
また、AdLantisとNendは、アプリ起動ごとに同じ広告しか表示されません。これも原因は不明です。


うまく広告が表示されない場合は、各SDKのインストール方法に間違いがないか、IDなどの記述を忘れてないか、マニフェスト中でパーミッションは正しくつけられてるか、あたりをチェックして下さい。