Android

Android1.6などへのAdMob設置方法

 最新のAdMob SDKをAndroidアプリに組み込もうとした所、Android1.6や2.1などにAdMobを設置する時にエラーが出てしまいました。解決したので、解決までの経緯をここに記録しておきます。
 なお、これらの内容は公式のドキュメントに書いてある事を元にし、エラーに関して調査した記事です。


ビルドターゲットを1.6にした状態でAdMobを設定すると、AndroidManifest.xmlのこの行がエラーとなった。
<activity android:name="com.google.ads.AdActivity"
	android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>

エラー内容はこちら
エラー: String types not allowed (at 'configChanges' with value 'keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize').

なので、Android1.6でも動くように以下のように設定する。
<activity android:name="com.google.ads.AdActivity"
	android:configChanges="keyboard|keyboardHidden|orientation"/>

すると今度はこのエラーとなった。
You must have AdActivity declared in AndroidManifest.xml with configChanges


解決策は、ビルドターゲットをAndroid3.2以上にし、android:minSdkVersionを適切なものにすること(Android1.6に対応させるなら4にする)。

公式のドキュメントにちゃんと書いてありますね。
The Google AdMob Ads SDK for Android requires Android 1.5 or later. Make sure you have the latest copy of the Android SDK and that you're compiling against at least Android v3.2 (set target in default.properties to android-13). 
(適当意訳:AdMob SDKはAndroid1.5以降が必要です。Android SDKを少なくともAndroid v3.2(default.propertiesをandroid-13にセット)のAndroid SDKにして下さい。)


ちなみにこの状態だとこのような警告が出るが、まあ問題無いだろう。
Attribute minSdkVersion (4) is lower than the project target API level (13)	AndroidManifest.xml

Android MarketがGoogle Playになった事での開発者の注意点

 Android Marketは3月6日にGoogle Playとなりました。映画や電子書籍のマーケットが統合されたものです。これに伴い、開発者は何に気をつければ良いのでしょうか。色々と調べた結果をまとめました。

この記事のまとめ
・アプリの登録方法はAndroid Marketと同じ。
・URLも今までと同じだが、PC版のURLは変更した方が良い。
・アプリの管理画面から見られる事が増えた。
・アプリや記事に使われているロゴやリンクの「Android Market」の文字を「Google Play」に変更する必要がある。



アプリの登録方法
こちらがGoogle Playのアプリ登録画面のスクリーンショットです。項目に変化が無いのがわかります(無いですよね?)。公開手順は今までと変わりません。
左が登録前、右が登録後です(この画面は、Google Playにプレゼンカンペという新しいアプリを登録した時のものです)。
appeditorplace01    appeditorplace02


アプリの公開URL
自分のアプリのURLは、以下のどれもが使用可能です。play.google.com関係が追加されました。

・今まで
特定のアプリ
market://details?id=jp.tattyamm.android.checktrend
http://market.android.com/details?id=jp.tattyamm.android.checktrend
開発者
http://market.android.com/search?q=pub:Entatsu
market://search?q=pub:Entatsu
検索
http://market.android.com/search?q=trend
market://search?q=trend

・今回追加されたもの
特定のアプリ
http://play.google.com/store/apps/details?id=jp.tattyamm.android.checktrend
開発者
http://play.google.com/store/apps/developer?id=Entatsu
検索
http://play.google.com/store/search?q=trend

今まで使えたURLは現在の所は全て使用可能です。market.android.comにアクセスするとplay.google.comに飛ばされます。しかしこの転送がいつまで行われるのかわからないので、play.google.comの方にリンクを変更しておくと良いでしょう。これらのURLについてはここに詳細があります。
Android - Brand Guidelines


アプリの管理画面
アプリの管理画面にある「Developer Console」で見られる事が増え、UIが改良された。
詳細はこちら。
New App Stats for Publishers on Android Market | Android Developers Blog
csvダウンロード機能がついた他、項目が増えました。増えた項目は「Carrier」と「App Version」です。このスクリーンショットのように、Carrierでは世界のキャリアーの割合が、App Versionではある時点で利用者がどのアプリをどれだけ使っているかがわかります。
左がcarrier、右がApp Versionです。(このアプリは、チェックトレンドというアプリの管理画面です。バージョンアップが段々と行われている様子が見て取れます。)
Developer Console carrier    Developer Console version


「報告されている問題ページ」ができた(?)
(これはgoogle playになった事とは無関係?)
こういうのが見られます。
デベロッパー向け Google Play報告されている問題 - デベロッパー向け Google Play ヘルプ


アプリの容量制限が50MBから2GBになった
(これはgoogle playになった事とは無関係?)


その他
Android MarketがGoogle Playに変わった事で、開発者にとって何が変わるのか、こちらにFAQが掲載されています。
Google Play FAQ for Android Apps Developer - デベロッパー向け Google Play ヘルプ




コメント
・名称変更が最も影響が大きい気がします。
・Google Playになってから1つアプリを登録してみましたが、今までと同じように登録する事ができました(このプレゼンカンペというアプリです)。
・DEVELOPER CONSOLEにログインした時に表示されるメッセージがありますが、過去のものがどこにあるかわからないので、最近どのような更新があったのかの一覧が欲しいですね。


参考にさせて頂いたサイト
Taosoftware: AndroidマーケットがGoogle Playになりました

Androidアプリ「音量切替0」を公開しました

■このアプリは
 端末の主要な音量を「音量0」か「以前の音量」に切り替えるためのシンプルなアプリです。
 アプリを起動すると着信、メディア再生、アラームの音量を0にします。また、このアプリで音量を0にした後にアプリを起動すると、元の音量に戻す事ができます。
 端末の音量を素早く0にしたい時や、ちょっと音量を変更したい時にお使い下さい。


■ダウンロード
・PCから
音量切替0 - Android マーケット
・Android端末から
soundswitchqrcode


■スクリーンショット
SS-J-01  SS-J-02  SS-J-04


■コメント
・音量の調節方法を調べいたら思いのほか簡単に操作できるようだったので、アプリとして形にしました。
・通常の音量切替アプリは既にいくつもあるので、差別化の為、思い切って起動するだけで変化するという豪快な処理にしました。
・そのせいでかなりわかりづらいアプリになっているかも。
・音量関係のアプリは既に大量にリリースされており、どんなタイトル付けても似たようなものになっちゃいます…。この辺りはアイデアを作れないとダメですね。。


■今後
・もっとシンプルなアプリにしてみたいです。
・なので、変更できる音量の種類や、音量のパターンを保存する機能などの追加はあまり考えておりません。

Android開発 ホームボタン押下やアプリ切り替わりを検知する

 ホームボタンを押してアプリがバックグラウンドに回る時や、他のアプリに遷移した時に、メッセージを出したりする方法を検討しました。この記事は、その時に試したソースコードや特徴をまとめたものです。
 なお結論としては、onUserLeaveHint()を使う方法が最も良いでしょう。こちらに全体のソースコードを置きました。



 調べた所、onUserLeaveHint()を使う方法とIntent.ACTION_CLOSE_SYSTEM_DIALOGSを使う方法の2通りがあるようです。それぞれ見てきましょう。

■onUserLeaveHint()を使う方法
・Activityがバックグラウンドに行くと呼ばれます。
・ホームボタンが押された時の他、通知領域から他のアプリに遷移した場合などにも反応します。
・他アプリ起動やActivityの切替全てに反応してしまう。
・戻るボタンが押された場合には反応しません(戻るボタンが押された事は別の方法で取得できる)。
・こちらを参考にしました:Y.A.M の 雑記帳: Android Home キーが押されたことを検知する。
package jp.sample.AndroidPressHomeKeyEventSample;

import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.Toast;

public class MainActivity extends Activity {
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
	}
	
	@Override
	public void onUserLeaveHint(){
		//ホームボタンが押された時や、他のアプリが起動した時に呼ばれる
		//戻るボタンが押された場合には呼ばれない
		Toast.makeText(getApplicationContext(), "Good bye!" , Toast.LENGTH_SHORT).show();
	}
	
}


■Intent.ACTION_CLOSE_SYSTEM_DIALOGSを使う方法
・ホームボタンが押された事自体に反応する。
・しかし、アプリがバックグラウンドにいても反応してしまう。
・戻るボタンが押された場合には反応しません(戻るボタンが押された事は別の方法で取得できる)。
・こちらを参考にしました;ビデオ再生中にホームキーが押された場合 - 日本Androidの会 | Google グループ

package jp.sample.activityFinishSample02;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends Activity {
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		//ホームボタン押された時の準備
		HomeButtonReceive m_HomeButtonReceive = new HomeButtonReceive();
		IntentFilter iFilter = new IntentFilter();
		iFilter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
		this.registerReceiver(m_HomeButtonReceive, iFilter);
	}
	
	public class HomeButtonReceive extends BroadcastReceiver{
		@Override
		public void onReceive(Context arg0, Intent arg1){
			//ここにさせたい事を書く
			Toast.makeText(getApplicationContext(), "Good bye!" , Toast.LENGTH_SHORT).show();
		}
	}
}


■これらを改良する(してみようとする)
これらが基本的な方法です。これを少し改良してみましょう。


■onUserLeaveHint()を使う方法を改良する
onUserLeaveHint()を使う方法だと、戻るボタンが押された時に反応しません。なのでonKeyDown()を追加して、戻るボタンのイベントを取得します。

package jp.sample.AndroidPressHomeKeyEventSample;

import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.Toast;

public class MainActivity extends Activity {
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
	}
	
	@Override
	public void onUserLeaveHint(){
		//ホームボタンが押された時や、他のアプリが起動した時に呼ばれる
		//戻るボタンが押された場合には呼ばれない
		Toast.makeText(getApplicationContext(), "Good bye!" , Toast.LENGTH_SHORT).show();
	}
	
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		switch(keyCode){
		case KeyEvent.KEYCODE_BACK:
			//戻るボタンが押された時の処理。
			Toast.makeText(this, "Back button!" , Toast.LENGTH_SHORT).show();
			finish();
			return true;
		}
		return false;
	}
}

 よくあるものです。これでホームボタンやバックボタンが押された時や、他のアプリに切り替えた時に反応してくれます。どういう時に反応するのかもっとテストが必要ですが、基本的にはこれで十分でしょう。
 今回の記事を書くのをきっかけにgithubアカウントを作りました。これを含めた全体のソースコードは私のgithubアカウントに置いたので、そちらを参照して下さい。


■Intent.ACTION_CLOSE_SYSTEM_DIALOGSを使う方法を改良する
 このIntent.ACTION_CLOSE_SYSTEM_DIALOGSを使う方法について、自分自身がトップにいないのにも関わらずホームボタンが押された事に反応する問題に対処してみます。しかしどうも上手く行っていません…。

・アプリがバックグラウンドに行くタイミングでfinish();やandroid.os.Process.killProcess(Process.myPid());などによりアプリを終了する方法ですが、なぜか上手くいきません。
・自分がバックグラウンドではなく、表で起動しているかをフラグにて管理する方法を試してみました。アプリが起動したらフラグはtrueに、ホームボタンが押されたらフラグはfalseに、onResume()でフラグをtrueに、といった感じでフラグを管理します。しかしonUserLeaveHint()でフラグをfalseにできれば良いのですが、onUserLeaveHint()の方がHomeButtonReceiveより後に呼ばれるようで、他のアプリに遷移した後にホームボタンを押すと反応してしまうのは防げません。
こちらのコードを参考にトップにあるパッケージネームを取得して、自分自身と一致するときだけメッセージを出すって方法が良さそうなんですが、ちょっと上手く行きません(ちゃんとわかってる人が書けばちゃんと動きそう。パーミッションも必要なので少々大げさかも。


■まとめ
 色々やってみましたが、シンプルにonUserLeaveHint()だけを使う方法が最も有効です。
 自分は上にも書いたような方法で、戻るボタン検知と組み合わせて使っています。ここに全体を置いておきます。
 (そもそもホームボタンが押された時というのは、ユーザーがアプリを消そうとした時です。そのような時にメッセージを出したりなど、何かすべきでは無いのかもしれません。どうしても必要な場合に行いましょう。)


■参考サイト
[Android]アプリを(擬似的に)シングルタスクにする方法 - chakimarの日記
Y.A.M の 雑記帳: Android Home キーが押されたことを検知する。
ホームボタンが押されたことを取得する方法 - 日本Androidの会 | Google グループ
ビデオ再生中にホームキーが押された場合 - 日本Androidの会 | Google グループ

AdMobから収益を受け取る方法・手数料比較

iPhone・AndroidアプリにAdMobなど海外の広告サービスを組み込むと、報酬はドルで受け取る事になります。今回はAdMobにおける換金手順と、手数料の比較を行いました。なおお金も関わる事ですし、参考にする際は各自調べて裏を取ってから行動するよう、よろしくお願いします。

■まとめ
・銀行振込かPayPalで受け取る事が可能。
・銀行振込は手数料が高い。
・PayPalは換金レートが悪い。

■手順
AdMobにログインして、「アカウント」→「支払い情報」へ移動。入力する情報は以下の通り。

○銀行・PayPal共通で入力
・国
日本。
・アカウントの種類
私の場合は個人、場合による。
・商号
説明に「納税申告書の氏名と一致する必要があります」とあるので、個人の場合はその人の名前。
・納税者ID
一般には記入不要。

○ACH/電信送金の場合
・受取人名
・銀行名
・銀行の住所
・受取人の口座番号/IBAN
・銀行 SWIFT コード

※SWIFTコードとは国際的な送金などに使用される銀行の識別コードのこと。全ての銀行が持っている訳では無いので注意する必要がある。
こちらのサイトによれば、日本語で入力した結果送金されず、問い合わせた所、英語で修正するよう言われたらしい。ので、英語で入力します。

○PayPalの場合
・PayPalのログイン名(ログインする時に使うメールアドレス)を入力。

○小切手の場合
・現在小切手による換金は利用出来ないはず。銀行振込開始前に存在していた。


これで登録は完了となる。しかしどの方法を取っても何らかの形で手数料が取られる。どのルートが最適か検証してみよう。


■手数料等の比較
○銀行振込の場合
・振込手数料はAdMob側が負担してくれる
・しかし日本の銀行に手数料を取られる。海外からの電信送金を入金するのに為替手数料が掛かる。2500円くらいだが銀行ごとに違うので、自分の銀行の金額を調べる必要がある。
・SWIFTコードを持っている銀行で無いといけない。たまに持っていない銀行がある。

(2012.01.18、20120.09.30追記 beepappsさん情報ありがとうございます!)
・銀行振り込みの場合、外貨で直接受け取ると手数料がかからない銀行もあるようです。beepappsさんが新生銀行で確認してくださいました。

○Paypalの場合
・ドルから円の為替レートが相場より悪い。(ドルで買い物する時はpaypalのレートかカード会社のかを選べる場合もあるのですが、この場合は関係無いはず)
・PayPalから自分の銀行口座へ入金できる最低金額は、米ドルで$10、日本円で1000円から。50000円未満の入金は、250円が手数料として引かれる。50000円以上なら手数料は無料。(なおこの銀行口座はSWIFTコードが無いものでも大丈夫。)
・支払いを受け取るには、個人ならPaypalのプレミアアカウントである必要がある。PayPalなのでクレジットカードが必要。

○小切手の場合
・現在は出来なくなったはず(銀行による送金が開始された為)。
・どのみち換金手数料が非常に高く、魅力はあまり無かった。


■まとめ
・自分がいくら換金するのかにも依存するが、Paypalの方が良いだろう。
・少々複雑なので、送金する前に自分が幾ら換金するのか一度シミュレートして計算した方が良い。
・後は何を信用するかの問題です。


■補足
・Android向けアプリ広告の比較(AdMob・AdLantis・AdMaker)は以前検討した事があるので、そちらも合わせてお読み下さい。Paypalを経由する手間と手数料を考えると、AdMob以外が魅力的に見えて来ます。これは普段PayPalを使うかそうで無いかで分かれる点だと思うので、個々人の判断でお願いします。
・(2011.12.21追記)こちらの記事に、paypalと銀行振り込みのどちらが得かの閾値について言及があります。そんな夢のような金額には到達しないですよ…。


■参考
AdMob 電信送金支払い情報の設定方法 - 技術脳塗
Paypal公式サイト 手数料について 手数料 - PayPal
引き出し手数料 - PayPal

iPhone App StoreとAndroid Marketのざっくりとした比較

スマートフォンアプリは盛り上がりを見せていますが、iPhoneとAndroidで違った成長を見せています。今回は、アプリ技術や開発についてではなく、アプリのマーケットに焦点を当て、その違いについてまとめてみましょう。


■ざっくりまとめ
どちらにも大きな問題は無いものの、多言語対応で違いあり。


■利用者にとって

○iPhone App Store
・メリット
-審査したアプリが並んでいるので、ある程度のクオリティが保証されている。
-言語毎の区分けがきちんとしている。
・デメリット
-容量の大きなアプリは3G回線でダウンロードできず、wi-fiを使う必要がある。

○Android Market
・メリット
-うーん…特筆すべき事は無い…。
-多少エロ方向のアプリがある。
・デメリット
-無審査でクオリティの保証は無い。
-Android Market以外の選択肢が広がる可能性があるが、ウイルス等のリスクがある。
-外国語のアプリも区別なく並んでいる(メリットかもしれない)。

■開発者にとって

○iPhone App Store
・メリット
-アフィリエイトがあるので、誰かがアプリをプロモーションしてくれる可能性がある
-iAdもあり、iTunes Connectがあれば全部完結させる事もできる。

・デメリット
-アプリの登録や修正の申請から反映までの間に1週間程度の時間がかかる。
-審査落ちの可能性もある。
-Primary Languageに設定した言語版を必ずリリースする必要がある(そのPrimary Languageは変更することはできない)
-アプリの合計ダウンロード数が見られない。

○Android Market
・メリット
-アプリの公開、修正がすぐに可能。
-宣伝用の画像がアイコンとスクリーンショット以外に設定できる。
-apkファイルを直接配布する事もできる。(セキュリティ上、やらない方が良いでしょう。)
-アプリの合計ダウンロード数、使用端末や国籍の一覧が見られる。

・デメリット
-アプリの容量制限が結局何MBなのか、よくわからない(→こちらのサイトによれば、まあiPhoneと同程度か。)
-開発者登録にクレジットカードが必須。
-言語毎にスクリーンショットを設定することができない。(※審査が無いので言語毎に違うアプリにする事は可能だが、ダウンロード数の面で不利になるのでは)
-全体として、有料アプリがiPhoneよりも売れていない。


■まとめ
・iPhone App Storeは審査に時間がかかる以外、大きな問題は無い。
・Android Marketは利用者にとって使いづらいのと、スクリーンショットを言語毎に設定できないのが問題。
・多言語対応に違いがあり、iPhoneは融通が効かない、Androidはマーケットでの多言語対応が不十分、という問題があります。そのようなアプリを予定している方は注意しましょう。

iPhone・AndroidアプリにGoogle Analytics for Mobileを設定して出来る事

 アプリをより良く使ってもらう為には、ユーザーが実際どのようにアプリを利用しているか調べる必要があります。Google AnalyticsはWebアクセス解析として有名ですが、スマートフォン向けアプリに組み込む事も可能です。これにより、様々な事が測定可能になります。今回は私のアプリを例に、何が調査できるのかを見てみましょう。


■この記事のまとめ
・ユーザー数などを調べるのは非常に簡単
・どのページが見られたか、どのボタンが押されたか、もきちんと設定すれば調べられる
・今すぐアプリにGoogle Analyticsを設置してみるべき


■設置方法
 設置方法はAndroidiPhoneで基本的に同じです。ライブラリの追加、必要なものをimport、トラッキングコードを追記、AndroidならAndroidManifest.xmlへの追記、iPhoneならFrameworkの追加、です。


■すぐに測定できること
 まずは、適当にトラッキングコードを書くだけで何が測定できるのかを見て行きます。ここではチェックトレンド(Android版iPhone版)を例に結果を見て行きましょう。

○ユーザー数
google_analytics_user_summary
ユニークユーザー数、訪問数、直帰率、新規訪問数、がわかります。

○画面の解像度
Android(左)とiPhone版(右)
google_analytics_android_screen_resolution google_analytics_iphone_screen_resolution
Androidならばユーザーの画面の解像度、iOSならばiPhone・iPod・iPad(多分)のどれからアクセスされたかわかります。(iPadからアクセスされた事が無いので、そこは未検証)

○サービス プロバイダ
google_analytics_iphone_service_provider
通信事業社名です。どのキャリアからアクセスされているかの他に、無線LAN経由のアクセスについてもわかります。おそらく、NTTドコモは「ntt docomo inc. 」、KDDIは「kddi corporation 」、ソフトバンクは「japan nation-wide network of softbank bb corp.」、と表示されるようです。

○アクセス元の国
google_analytics_android_country
どの国からアクセスされたかがわかります。

○総評
ウェブ版のGoogle Analyticsのように、ある程度の情報を簡単に測定する事が可能です。しかし、アプリの操作に関する情報は集められない為、この情報をアプリ開発にフィードバックするのは難しいのでは。現状把握や概要を掴むのに向いています。


■きちんとトラッキングコードを設置すると測定できること
 ここからは、自分でトラッキングコードをきちんと設定すれば測定できる項目です。基本的に、1つの画面でPVを測定、ボタンやメニューでEventを測定、と考えましょう。私のアプリを例に、いくつか例を見て行きます。

○ボタンやメニューが押された回数
google_analytics_iphone_event_tracking_category_clicks
イベントというものを測定することにより、どのボタンが何回押されたか、メニューボタンは何回押されたか、等を自由に測定可能です。

○画面が見られた回数
google_analytics_iphone_contents_summary
ページビューを測定することにより、どの画面が何回見られたかを測定可能です。
注意して欲しいのは、いつトラッキングコードが読み込まれるかを考えないと正しく測定できないという事です。この画像の例だと、iPhoneアプリでtabbarを使い、それぞれのviewDidLoadにtrackPageviewを書いた為、アプリが起動するたびに全てのtrackPageviewが記録されてしまっています。

○端末が縦か横か
カスタム変数を使う事で、取得する値を自由に設定する事ができます。先日のGoogle I/OではAndroid端末が縦か横かを調べるのに
tracker.setCustomVar(1,"Screen Orientation","orientation",2); //(Orientationにはlandscapeかportraitが入ってる)
という書き方が使われていました。このように書くと、Google Analyticsのカスタム変数の項目に「Screen Orientation」というのができ、そこにlandscapeとportraitの回数が記録されていきます。

○総評
イベントトラッキングはコードが呼ばれた回数を記録するので、これ以外にも色々と応用できます。また、カスタム変数を使えばより細かく自由な測定が可能です。これらの測定により、アプリのどの機能がよく使われているのか把握でき、開発の参考となるでしょう。


■まとめ
 全体として、このようなデータが取れます。Android(左)とiPhone版(右)。(iPhone版はgoogle Analyticsを最近組み込んだのでこのようになっています。)
 google_analytics_android google_analytics_iphone
 使ってみた感想としては、非常にシンプルに色々な情報が集められるな、というのが第一です。しかし、ボタンの押された回数等を測定するには自分で考えて設定する必要があり、複雑なアプリでは面倒な作業。何を調べたいのかを設定しておくのが大事そうです。


■補足
・プログラムがどのように動いているか、その状態遷移をきちんと把握していないと正確な測定ができません。例えばGoogle Analyticsでは平均滞在時間の測定も可能ですが、これを正確に知りたければ、いつどのような条件でアプリが終了or中断されるか、どう再開されるか、知らなければなりません。
・Google Analytics for Mobileではアプリがオフラインの時もデータを保存し、次にオンラインになった時にデータを送ってくれます。自分から通信しないアプリでも、いつ送信するか制御可能です。
・文中でGoogle I/Oに言及しましたが、先日のGoogle I/Oでも講演がありました。その後の報告会でもこのトピックが紹介されたようで、アプリへのGoogle Analyticsの導入はますます進んでいくでしょう。 該当講義のYoutubeはこちら:YouTube - Google I/O 2011: Optimizing Android Apps with Google Analytics。日本での報告会の報告はこちら: GTUG主催Google I/O報告会レポート: 一流モバイル開発者を夢見るブログ。Youtube動画は機能の紹介に終始していたので、あんまり面白く無いです。でもカスタム変数の使い方は面白かったかも。

Android向け広告、AdMob、AdLantis、AdMakerを比較

[追記]
初稿から2年以上経過し、内容が古くなっています。現状と乖離した箇所が増えてきました。
広告システムは日々進化しています。今の状況を知るには改めて調べた方が良いでしょう。
(2013.05.13追記)

スマートフォン向けの広告にその将来性を見込み様々な会社が参入して来ていますが、どれを選べば良いのでしょうか。いくつかの広告を比較してみましょう。

■AdMob
設置マニュアル:Google AdMob Ads Android Fundamentals - Google AdMob Ads SDK - Google Code

○メリット
・揺れはあるが、30~70%の表示率(google adsenseが表示されるようになり、表示率が上がった)
・まあまあ簡単に設置できる。
・広告に対して「android:layout_height="wrap_content"」が設定できるので、取得に失敗すると自動でそのレイアウトごと無かったことにできる。
・どんなジャンルの広告を出すか設定可能。
・自社広告を表示させる設定もできる(表示割合もを選択できる)
・海外向けアプリにも設置できる
・広告取得に失敗した時にonFailedToReceiveAdを呼べば色々便利。
・広告に色が設定できる。これにより、広告とアプリの雰囲気を合わせる事ができる。
例:チェックトレンドの場合
AdMobにグラデーションの色を設定した例

○デメリット
・表示率があまり高くない
・英語しか書いてない広告が出る時がある
・google adsense広告の表示ができるものの、文字だけで味気ない、ジャンプするのに2回クリックが必要、PCサイトに飛ばされる事が多い、と、良い広告とは言えないのではないか。(yahoo!モバゲーというPCからしか利用できないサイトに飛ばそうとする広告まである。これは広告出稿者にとっても損な話だ。)

○その他
・AdMobはGoogleの子会社(Google、モバイル広告大手のAdMobを7億5000万ドルで買収 - ITmedia News
・AdMobは「AdMob Mobile Analytics」というサービスもやっているが、googleも同様のGoogle Analytics for Mobileを提供しているので、今後どうなるのかはわからない。

○総評
・広告システムは優秀ですが、表示率の低さ、特に国内向け広告の表示率の低さが気になります。iPhoneとAndroidでも事情は違うようですが、Androidにおいて表示率は低いのでは。システム面の優秀さから、他の広告と組み合わせやすいのも特徴でしょう。




■AdLantis
設置方法:AdLantis Android SDK - AdLantis TechNote

○メリット
・広告の設置方法が簡単(xmlに追記は必要だが、javaのソースコードに追記が必要無い)
・広告の表示率が日本において結構高い(同じ広告が多いが、とりあえず表示される)
・横に長い広告も用意されている(特に設定しなくても自動的に表示される)

○デメリット
収益の受け取り方はどこに書いてあるんでしょう。他のサイト見ると毎月請求書を書かないといけないらしいんですけど、それすらAdLantisのサイト上に記述してないですね。今は普通に銀行口座を登録して振込してくれます。
・広告をLinearLayoutで囲っても「android:layout_height="wrap_content"」が設定できない。
・広告取得に失敗した時に何も呼ばれない(AdMobにおけるonFailedToReceiveAdのようなものがAndroid版だと無い)
・つまり、「取得できなければxmlのレイアウトごと消す」という動作ができない。
・ソースコードから広告呼び出しタイミングを制御できないので、制御しづらい。
・結構な割合で同じ広告。
・「キャッシングの広告は出したく無い」と思っても、そういった広告制限の設定はできない。(アダルト広告配信のみON/OFFが設定できる)
・インプレッション数は公表されているが、リクエスト数は公表されていないので表示率がわからない。

○その他
・AdLantisはGREEの子会社になった。ちなみにCAやDeNAもスマートフォン向けの広告会社を設立したりと、この辺りは日々変化している。(株式会社アトランティス ≫ プレスリリース ≫ グリー株式会社による当社子会社化についてサイバーエージェントとDeNA、スマートフォン向け広告会社設立 - ケータイ Watch

○総評
・端末を横にした時のレイアウトがあるなど、期待できる部分もかなりあります。が、現状ではシステム面や広告の制御があまりできず、扱いづらいです。

※補足
・AdLantis広告を一時的に消すには、AdLantisのレイアウトをLinearLayoutで囲み、android:visibility="gone"を設定してやれば良い。この時LinearLayoutにandroid:layout_height="wrap_content"を指定してしまうと、広告が画面一杯のサイズになってしまう。(AdMobのように自動で適切なサイズにはなってくれない。)
・報酬の支払いに関しては規約に「弊社は、原則として、報酬を毎月末締め、翌々月末日に媒体オーナーが別途指定する銀行口座へ振込むことにより支払います。」とあるので銀行振込だと思ったのですが、どこにも書いてありません。要するに問い合わせとかしないとわからない状況。
・画面横にした場合の広告はこのような感じになる。xmlファイルを2つ用意すれば端末の向きに合わせたレイアウトを設定できるので、そうすれば隙間無いように配置できるはず。以下にスクリーンショット。
adlantis001 adlantis002




■AdMaker (mediba ad powered by AdMaker)
設置方法:ログインしないと資料は見れません。広告設置にはjarファイルのインポート、xmlレイアウトへの追記、ソースコードへの追記、AndroidManifestへの追記、が必要。

○メリット
・日本国内において高い広告表示率(国により異なる。自社広告が表示されるのはテストの時だけ?)
・他社との業務提携により、海外配信もMojivaなどを通して行っているらしい(海外のアプリがMojivaを設置すると日本語の広告が配信されるらしいのは見た事があるが、AdMakerを設置した場合海外でどうなるかはわからない)
・設置はそれなりに簡単
・広告取得失敗時にonFailedToReceiveAdMakerを呼べば色々便利(SDK Ver1.1から実装)。(2011.05.29追記)
・自社広告も設定可能(広告掲載の審査があるので時間がかかる。どういう風に自社広告が設定できるのか不明)(審査があるのを知らずに、適当に作った画像upしてしまったが、キャンセル方法はweb上には用意されていない。後日丁寧にも「広告内容が表示されておりません」というメールが届きました、すみません・・・)

○デメリット
・登録時にメールで送られてくるパスワードの変更方法が無い、過去に収益の表記を間違えた事がある等、運営体制に疑問がある。
・アプリを申請してから広告が設定されるまでの間に人の手が入るので、登録に時間がかかる。
広告取得に失敗した時に何も呼ばれない(AdMobにおけるonFailedToReceiveAdのようなものがAndroid版だと無い)
・つまり、「取得できなければ別の広告を呼ぶ」という動作ができない。(方法はあるらしいがわからない。何かしらの工夫が必要)
SDK Ver1.1にてonFailedToReceiveAdMakerが実装されました。(2011.05.29追記)
・収益が表示されても、収益の表記が表示箇所によりずれがあり結局いくらなのかわからない時がある。
・最近は広告システムが不安定になりがち。収益表示が0になったり。(2011.05.29追記)

○総評
パスワードの件とかもあり不安な部分はあります。しかし表示率は高い為、そこは魅力と言えるでしょう。プログラム内での制御はそれなりに可能ですが、広告が呼べなかった時の扱いなどはまだ補強して欲しい部分。(2011.05.29修正)後は広告管理システムが不安定なのが不安材料か。

※補足
・名称変更がありました。「AdMaker」は「「mediba ad powered by AdMaker」」となります。(「mediba ad powered by AdMaker」をサービス展開 | 2011年 | 株式会社medibaTwitter / @kiyokb: 事業効率を高めるために、サービスの統合を進めていきま ...)(2011.09.01追記)




■まとめ
表にしてみました。
項目 AdMob AdLantis AdMaker
表示率 30~70%程度。
国・言語により異なる。国内は低い印象
高め 高め
クリック単価 $0.02~$0.14くらい
(レートにもよるが2円~11円くらい)
7.5円? 3~9円くらい?(単価は不明、平均値から推測)
収益の受け取り方法 paypal、振込(海外からの送金になるのでSWIFTコードのある銀行口座が必要) こちらから請求する?受け取り方法は不明 振込
対応地域 日本、海外
地域により表示率が異なる
日本 日本、海外(海外に配信してる会社と連携。実際どの程度表示されるかは不明)
広告の配信設定 配信する言語、広告の種類、自社広告表示割合、を設定可能 アダルト要素を含む広告配信の有無のみ設定可能 自社広告表示を設定可能(どう設定できるのかは不明)
広告自体の設定 広告の色、サイズが設定できる(AdSense等は適用外。あくまで一部の広告) 無し 無し
プログラム xmlとjavaから制御可能、エラー時に呼ばれるメソッドがある xmlのみで制御(簡単だとも言えるが制御しづらい場合もある) xmlとjavaから制御可能
xmlとjavaから制御可能、エラー時に呼ばれるメソッドがある。(2011.05.29に文章修正)


■コメント
・使ってみた感触だとAdMobが使いやすいです、それ以外のAdLantisとAdMakerではAdMakerの方が扱いやすそうですが、システム面がまだかなり不十分です不安定です。どの会社の広告も様々なアプリで使用されているようなので実績はあるようですが、不安なのも事実。(2011.05.29一部修正)
・私自身はAdMobを基本的に使っています。アプリのデザインに合わせて色を設定できるのが素晴らしいです。ただ表示率が低いのが難点。Google adsenseにはあまり魅力を感じませんが、とりあえず表示させています。
・AndroidでもiPhoneでもそうですが、何種類かの広告を組み合わせる事も可能なので、優先順位を決めて組み合わせるのが最も安定する方法なのかもしれません。

Android開発 AdMobが表示されなかった時に他の会社の広告を表示する

AdMobの表示率はあまり高く無いので、AdMobが呼ばれなかった時に他の広告を呼ぶ方法を考えます。今回はAdLantisで説明しますが、AdMakerの場合もほぼ同じです(ちょっと書く事が増える)。

○手順
やり方は以下の通りです。
1.AdLantisのXMLレイアウトをLinearLayoutで囲んでおく
2.あらかじめそのLinearLayoutを消しておく
3.java側でAdMobを普通に呼ぶ
4.AdMobを呼ぶのに失敗したら、AdLantisのXMLレイアウトを表示するよう変更する
以上です。AdMobは広告が呼ばれなかった時にonFailedToReceiveAdが呼ばれるので、ここで他の広告の呼び出しを行います。なお、この方法はAdLantisだけでなく、AdMaker等ほかの広告にも適用可能です。

○ソースコード
XML側
<LinearLayout android:id="@+id/adLantisLayout"
	android:layout_width="fill_parent"
	android:layout_height="wrap_content"
	android:orientation="vertical"
	android:layout_below="@+id/adLantisOutsideLayout"
	android:visibility="gone">
	<jp.Adlantis.Android.AdlantisView
		android:id="@+id/adView"
		android:layout_width="fill_parent" 
    		android:layout_height="50dp"
    		android:layout_centerVertical="true"
    		android:layout_centerHorizontal="true" 
    		android:gravity="center"
	/>
</LinearLayout>


そしてjava側では
public class checktrend extends ListActivity implements AdListener{
	@Override
	public void onCreate(Bundle savedInstanceState) {
		//色々書く。
	}
	@Override
	public void onReceiveAd(Ad arg0) {
		//広告が読み込まれた
	}
	@Override
	public void onFailedToReceiveAd(Ad arg0, ErrorCode arg1) {
		//広告が読み込めなかった
		//AdLantisを表示(xmlで非表示になってるのを表示に変更)
		LinearLayout layoutAdlantis = (LinearLayout)checktrend.this.findViewById(R.id.adLantisLayout);  
        layoutAdlantis.setVisibility(View.VISIBLE); 
	}
	@Override
	public void onPresentScreen(Ad arg0) {
		//画面の前に広告が出たら呼ばれる?
	}
	@Override
	public void onDismissScreen(Ad arg0) {
		//フルスクリーン広告が呼べなかった時に呼ばれる?
	}
	@Override
	public void onLeaveApplication(Ad arg0) {
		//広告により別のActivityが呼ばれると呼ばれる
	}

みたいにすれば良いのでは。適宜変更して下さい。

○コメント
・このやり方はAdMakerでも使えます。onFailedToReceiveAdにて広告レイアウトをVISIBLEにして、かつ広告を読み込めばokです(AdMaker.setActivity(this);とかを書く)。
・もっとシンプルにできそうですが、とりあえず動いてるので大丈夫ではないでしょうか。

Androidアプリを出す為にやった事まとめ

先日、チェックトレンドのAndroid版をリリースしました。私にとって初となるAndroidアプリです。この記事はそれまでにやった事や調べた事のまとめです。

続きを読む
このサイトは
 Webアプリケーション開発のことや、iPhone・Android向けアプリ開発の話題がメインです。技術情報を取り扱っています。
 管理:えんたつ。twitter: @tattyamm
mimage
カテゴリ別アーカイブ
RSS
リンク
プログラミング本
アプリを作る時などに読んだ本
iPhoneプログラミングUIKit詳解リファレンス iPhoneプログラミングUIKit詳解リファレンス Android Layout Cookbook アプリの価値を高める開発テクニック パーフェクトPHP (PERFECT SERIES 3) JavaプログラミングBlack Book 2nd Edition (Black Bookシリーズ)
表記
当サイトではGoogle Analyticsを使用しております。詳細はこちらを御覧ください