2011年12月3日土曜日

AdMob Version 4.3.1の実装

AdMob Version 4.3.1の実装

AdMobは、アプリ内に広告を表示する機能を提供する。教科書どおりに作れば良い。ここでは、難易度の高かった項目を解説する。

問題意識
現在、androidのplatform 2.2 API level 8で稼働するアプリを開発している。
教科書では、AndroidManifest.xmlに次の1行を挿入するように指示がされている。
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
ところが、screenSize及びsmallestScreenSizeは、platform 3.2 API level 13以上が必要とされるため、Error: String Types not allowedというコンパイルエラーが発生する。

screenSize及びsmallestScreenSizeを削除すると、次の趣旨の実行時エラーが発生する。
E/Ads(11952): The android:configChanges value of the com.google.ads.AdActivity must include screenSize.
E/Ads(11952): The android:configChanges value of the com.google.ads.AdActivity must include smallestScreenSize.
E/Ads(11952): You must have AdActivity declared in AndroidManifest.xml with configChanges.
どのようにすれば良いのか。

結論
回答はAdmob in Android 2.2にあった。この問答から、次のような手順を講じれば良いことがわかった。
  1. Eclipseを最新版にする。(必須では無い)
  2. Android SDKを最新版にする。
  3. (重要)Eclipseのメニューコマンド>Project>Properties>Android>Project Build Target>platform 4.0 API level 14(最新版)を選択する。このコマンドはJava Build Path>Librariesに連動している。
  4. AndroidManifest.xmlに次の1行を追加する。
    <uses-sdk android:minSdkVersion="8"/>
  5. Project>Cleanを実行する。
Project>Properties>Java Build Path>Librariesの設定は手作業で行うのではなく、上記3の操作を行えば、自動的にJava Build Path>Librariesの設定が行われる。

この手順によって作成されたアプリは、platform 2.2 API level 8で無事稼働する。
上記の各手順の値を具体的にどうするかは、各プログラマーの置かれた立場によって異なる。

参考:AdMob
教科書:Google AdMob Ads SDK

実機をテスト用端末に設定する方法
開発者は、広告をクリックしてはいけない。広告を誤ってクリックしてしまうことを避けるため、広告を(本物の広告では無く)開発用の広告にしておかねばならない。

AndroidManifest.xmlの書き方は、教科書に掲載されているとおり、そのまま書けば良い。

layout用のxmlは、例えば、次のようにする。普通にlayoutを作成すれば良いだけだ。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    >
    <LinearLayout
        android:id="@+id/AdView"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" 
        android:layout_alignParentBottom="true"
        >
    </LinearLayout>
(以下省略)

上記layout用xmlを用いるとして、Javaにおけるsourceは、取り合えずonCreateメソッド内で次のとおり書いて、一旦、実機で実行させる。
        AdView adView;
        LinearLayout ll;
        AdRequest ar;
        
        //第三番目の引数にはAdMob publisher IDを指定する。
        adView = new AdView(this, AdSize.BANNER, "xxxxxxxx");  
        ll = (LinearLayout)findViewById(R.id.AdView);  
        ll.addView(adView);
        
        ar = new AdRequest();
        //ar.setTesting(true);//4.0.4の場合使える。4.3.1では使えない。
        ar.addTestDevice(AdRequest.TEST_EMULATOR);
        adView.loadAd(ar);

上記プログラムを実機で実行させると、LogCatに次の趣旨の行が出力される。
I/Ads(12492): To get test ads on this device, call adRequest.addTestDevice("yyyyyyyy");
この"yyyyyyyy"の部分を引用して、adView.loadAd(ar);の直前に、次の行を書き込む。
        ar.addTestDevice("yyyyyyyy");
そうすると、次回の実行時から、実機では、本物の広告を表示するのでは無く、テスト用の広告を表示する。

本番では、addTestDeviceメソッドを削除する。
もっとも、削除を忘れても実害は無い。何故なら、指定したIDの端末だけがテスト用になっているだけだからだ。(このあたりは、実際には試してはいません。)

そういう意味で、Version 4.0.4に比べて、4.3.1は進化したと言える。Ver.4.0.4では、setTesting(true)メソッドにより、全ての端末がテスト機になってしまう。このメソッドの削除を忘れて出荷した場合、喜劇悲劇が生まれる。

ここで、敢えて、Ver.4.0.4を使い、setTesting(true)を実装させたまま、出荷してしまうってのも、一興である。「削除を忘れたのではありません。敢えて、残しておいたのです」と。(-_-;)

いや、それはダメです。パブリッシャー様向けのガイドラインとポリシーには、「アプリ内広告では SDK のメソッドのみを使用し、SDK の最新のバージョンを使用する必要があります」と書かれています。

1 件のコメント:

  1. If you are looking for a reputable contextual ad company, I suggest you take a peek at ExoClick.

    返信削除