Androidアプリの新たな可能性を開拓するアプリ内課金について、概要から利用方法、アプリへの実装の仕方まで詳しく解説する特集
前回の「Androidでアプリ内課金を始めるための基礎知識」では、アプリ内課金の概要とメッセージ、セキュリティの概要に関して説明しました。今回は実装方法とリファレンスに関して説明します。
Android Marketのアプリ内課金は、課金リクエスト送信とトランザクション管理を、分かりやすくシンプルなインターフェイスで提供します。ここでは、例としてアプリ内課金サンプルアプリ「Dungeons」を使用し、主要なタスクを通じてアプリ内課金を実装する方法を説明します。
実際にアプリ内課金を実装する前に、連載第1回の「Android Marketのアプリ内課金サービスとは」を読んでおいてください。また、次回記事の「設計・実装における8つのセキュリティ対策ポイント」も参考にしていただければと思います。これらの文章はアプリ内課金を実装するための簡単なバックグラウンド情報を提供します。
アプリにアプリ内課金を実装するために、以下を行う必要があります(下記リストはインデックスになっています)。
アプリ内課金サンプルアプリからは、すべてのAndroid Marketアプリ内課金実装で共通のいくつかの処理の実装方法を学べます。
サンプルアプリは、アプリケーションファイル(Dungeons.java)、Android Marketアプリ内課金サービス(MarketBillingService)のためのAIDL(Android Interface Definition Library)ファイル(IMarketBillingSerivce.aidl)、アプリ内課金メッセージのデモを行うためのいくつかのクラスを含みます。それらには、署名検証といった基本的なセキュリティタスクをデモするクラスも含まれます。
以下は、サンプルアプリに含まれるソース一覧です。
アプリ内課金サンプルアプリはAndroid SDKのコンポーネントとしてダウンロード可能です。ダウンロードするには、Android SDKを起動し、AVD Managerを開き、「Google Market Billing package」コンポーネント(図1)を選択し、[Install Selected]をクリックしてダウンロードを開始します。
ダウンロード完了後、以下のディレクトリにコンポーネントが保存されます。
【Android SDKのインストールディレクトリ】/google-market_billing/
もしアプリ内課金をアプリに組み込む前に、アプリ内課金のデモが見たいのであれば、サンプルアプリをビルドして実行可能です。サンプルアプリのビルドと実行は以下の3つのタスクからなります(下記リストはインデックスになっています)。
サンプルアプリのビルドと実行はアプリ内課金のデモを見たい場合にのみ必要です。もしサンプルアプリを実行しなくてもよいなら、次章「ステップ2:プロジェクトへのAIDLファイルの追加」まで読み飛ばしてください。
サンプルアプリを実行する前に、以下を設定してビルドする必要があります。
まず、サンプルアプリのコードにAndroid Marketの公開鍵を追加します。アプリがAndroid Marketから戻されるトランザクション情報のシグネチャを検証できるようにします。サンプルアプリのコードに公開鍵を追加するには、以下のようにしてください。
次に、サンプルアプリのパッケージ名を変更します。現在のパッケージ名は「com.example.dungeons」です。Android Marketにはcom.exampleパッケージのアプリをアップロードすることはできないので、別のパッケージ名に変更してください。
最後に、リリースモードでビルドし、署名します。
サンプルアプリをリリースモードでビルドし署名を行った後、Android Marketの開発者サイトにドラフト版としてアップロードする必要があります。また、サンプルアプリ内で購入可能な、アプリ内の商品リストを作成する必要があります。
まず、Android Marketにリリースバージョンのサンプルアプリをアップロードします。サンプルアプリはドラフト版としてアップロードし公開しないようにしてください。このサンプルアプリはデモ目的なので、Android Marketで公開するのは推奨されていません。
次に、サンプルアプリの商品リストを作成します。サンプルアプリでは両手剣(sword_001)とポーション(potion_001)の2つのアイテムが購入可能です。sword_001は「アカウント単位で管理」購入タイプに、potion_001は「管理なし」購入タイプにすることで、それらの購入タイプがどのように振る舞うかを確認できるため、このように設定することを推奨します。
商品リストのセットアップ方法については、次回の「課金する商品リストを作成するには」を参照してください。
たとえサンプルアプリを公開していないとしても、開発者は商品リスト(sword_001とpotion_001)を公開しなければなりません。また、サンプルアプリの商品リストに項目を追加するためには、Googleチェックアウトのアカウントが別途必要です。
サンプルアプリはエミュレータ上で実行できません。実行するためにはサンプルアプリを実機にインストールしなければなりません。
サンプルアプリを実行するためには、まずAndroid Market開発者アカウントに最低1つのテストアカウントが登録されていることを確認します。
開発者は自分自身からアイテムを購入できないので、(Googleチェックアウトが、これを禁止しています)、サンプルアプリでアイテムを購入するために最低1つのテストアカウントを取得する必要があります。
テストアカウントを取得する方法は、次回の「テストアカウントの設定」を参考にしてください。
次に、実機にAndroid MarketアプリまたはMyAppsアプリのサポートされているバージョンがインストールされていることを確認します。もし実機のOSがAndroid 3.0の場合、アプリ内課金はMyAppsアプリのバージョン5.0.12以上が必要です。もし実機のOSがAndroid 3.0以外の場合、アプリ内課金にはAndroid Marketアプリのバージョン 2.3.4以上が必要です。
続いて、アプリを実機にインストールします。たとえAndroid Marketにアプリをアップロードしたとしても、公開されていないアプリはAndroid Marketから実機にダウンロードできません。代わりに、開発者はadbコマンドなどを使用してアプリを実機にインストールしなければいけません。
開発者の実機上でプライマリアカウントとしてテストアカウントを作成します。実機のプライマリアカウントはAndroid Marketに登録されているテストアカウントである必要があります。もし実機のプライマリアカウントがテストアカウントではない場合、実機を工場出荷時状態に戻した後、テストアカウントでサインインしなければいけません。
工場出荷時状態に戻すには、次回の「デバイスを工場出荷時状態にリセットするには」を参照してください。
最後に、アプリを実行し両手剣またはポーションを購入します。テストアカウントを使用してアイテムを購入すると、テストアカウントはGoogleチェックアウトから課金され、開発者のGoogleチェックアウトのアカウントは支払いを受けます。これはテストアカウントからの購入であるため、開発者は払い戻しをしてもよく、または購入の実際動作を確認してもいいでしょう。
なおサンプルアプリでは、デバッグログはデフォルトでオフになっています。Consts.javaのDEBUG変数をtrueにすることでログ出力をオンにできます。
AIDLファイルを開発者自身のプロジェクトに追加すると、Androidビルド環境はインターフェイスファイル(IMarketBillingService.java)を生成します。開発者は、このインターフェイスを使用してプロセス間通信を行うメソッドを呼び出して課金リクエストを生成できます。
もし、EclipseのADTプラグインを使用しているなら、AIDLファイルを「src」ディレクトリに追加するだけで済みます。Eclipseは自動的にプロジェクトをビルドし、インターフェイスファイルを生成します。ADTプラグインを使用していないなら、AIDLファイルをプロジェクトに追加しAntなどでプロジェクトをビルドし、IMarketBillingService.javaを生成します。
Eclipse以外の環境でIMarketBillingService.aidlファイルをプロジェクトに追加するには、「src」ディレクトリにディレクトリ「com/android/vending/billing/」を作成し、IMarketBillingService.aidlファイルをコピーしてアプリをビルドします。プロジェクトの「gen」フォルダ内に「IMarketBillingService.java」というファイル名でインターフェイスが生成されていることを確認してください。
アプリ内課金は、アプリとAndroid Marketサーバ間のすべての通信のハンドリングをAndroid Marketアプリに移譲します。Android Marketアプリを使うためには、アプリに適切な権限を設定しなければいけません。
「com.android.vending.BILLING」という権限を「AndroidManifest.xml」に追加します。アプリ内課金の権限を定義しないと、Android Marketサーバはリクエストを断り、RESULT_DEVELOPER_ERRORレスポンスコードを返します。
さらに課金権限に加え、Android Marketからの非同期レスポンス(ブロードバンドインテント)を受け取るためのBroadcastReceiverを定義する必要もあります。また、Android Marketへメッセージを送信するIMarketBillingServiceサービスを定義し、接続して使用する必要もあります。
Android Marketアプリから送られてくるブロードキャストインテントをハンドルする方法をAndroidシステムに知らせるためには、BroadcastReceiverのためのインテントフィルタも定義する必要があります。
例えばサンプルアプリでは、課金権限を定義するのに、ブロードキャストレシーバやサービス、インテントフィルタを使っています。このサンプルアプリでは、BillingReceiverはAndroid MarketアプリからのブロードキャストインテントをハンドルするBroadcastReceiverで、BillingServiceはAndroid Marketアプリにリクエストを送信するサービスです。
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.dungeons"
android:versionCode="1"
android:versionName="1.0">
<uses-permission android:name="com.android.vending.BILLING" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".Dungeons" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name="BillingService" />
<receiver android:name="BillingReceiver">
<intent-filter>
<action android:name="com.android.vending.billing.IN_APP_NOTIFY" />
<action android:name="com.android.vending.billing.RESPONSE_CODE" />
<action android:name="com.android.vending.billing.PURCHASE_STATE_CHANGED" />
</intent-filter>
</receiver>
</application>
</manifest>
Copyright © ITmedia, Inc. All Rights Reserved.