連載
» 2011年05月13日 00時00分 公開

Android Marketアプリ内課金サービス徹底解説(2):Androidアプリにアプリ内課金を実装してみよう (1/4)

Androidアプリの新たな可能性を開拓するアプリ内課金について、概要から利用方法、アプリへの実装の仕方まで詳しく解説する特集

[緒方聡,株式会社イーフロー]

7ステップでアプリ内課金を実装

 前回の「Androidでアプリ内課金を始めるための基礎知識」では、アプリ内課金の概要とメッセージ、セキュリティの概要に関して説明しました。今回は実装方法とリファレンスに関して説明します。

 Android Marketのアプリ内課金は、課金リクエスト送信とトランザクション管理を、分かりやすくシンプルなインターフェイスで提供します。ここでは、例としてアプリ内課金サンプルアプリ「Dungeons」を使用し、主要なタスクを通じてアプリ内課金を実装する方法を説明します。

 実際にアプリ内課金を実装する前に、連載第1回の「Android Marketのアプリ内課金サービスとは」を読んでおいてください。また、次回記事の「設計・実装における8つのセキュリティ対策ポイント」も参考にしていただければと思います。これらの文章はアプリ内課金を実装するための簡単なバックグラウンド情報を提供します。

 アプリにアプリ内課金を実装するために、以下を行う必要があります(下記リストはインデックスになっています)

  1. アプリ内課金サンプルアプリのダウンロード
  2. IMarketBillingService.aidlファイルを開発者自身のプロジェクトに追加
  3. AndroidManifest.xmlの修正
  4. サービスの作成とMarketBillingServiceへの接続
  5. BroadcastReceiverの作成
  6. セキュリティコンポーネントの作成
  7. アプリ内課金サービスに対応するためにアプリのコードを修正

ステップ1:サンプルアプリのダウンロードと実行

 アプリ内課金サンプルアプリからは、すべてのAndroid Marketアプリ内課金実装で共通のいくつかの処理の実装方法を学べます。

  • Android Marketアプリへのアプリ内課金リクエスト送信
  • Android Marketアプリからの同期レスポンスのハンドリング
  • Android Marketアプリからのブロードキャストインテント非同期レスポンス)のハンドリング
  • アプリ内課金を使用して課金レスポンスの完全性検証を行うセキュリティメカニズム
  • ユーザーに商品購入を行わせるユーザーインターフェイス(以下、UI)の作成

サンプルアプリが含むもの

 サンプルアプリは、アプリケーションファイル(Dungeons.java)、Android Marketアプリ内課金サービス(MarketBillingService)のためのAIDLAndroid Interface Definition Library)ファイル(IMarketBillingSerivce.aidl)、アプリ内課金メッセージのデモを行うためのいくつかのクラスを含みます。それらには、署名検証といった基本的なセキュリティタスクをデモするクラスも含まれます。

 以下は、サンプルアプリに含まれるソース一覧です。

  • IMarketBillingService.aidl
    Android Marketアプリ内課金サービスとプロセス間通信を行うインターフェイスが定義されたAIDLファイル
  • Dungeons.java
    購入と購入履歴表示のためのUIを提供するサンプルアプリファイル
  • PurchaseDatabase.java
    購入履歴を保存するためのローカルDB
  • BillingReceiver.java
    非同期のレスポンスメッセージ(ブロードキャストインテント)をAndroid Marketから受け取るブロードキャストレシーバ(BroadcastReceiver)。BillingServiceに、すべてのメッセージを転送
  • ResponseHandler.java
    MarketBillingServiceに接続してアプリの代わりにAndroid Marketにメッセージを送信するハンドラ
  • ResponseHandler.java
    購入履歴データベースとUIを更新するメソッドを含むハンドラ
  • PurchaseObserver.java
    購入関連の変更を監視する抽象クラス
  • Security.java
    さまざまなセキュリティ関連メソッドを提供
  • Consts.java
    さまざまなAndroid Marketとサンプルアプリの定数を含む。Android Marketによって定義されたすべての定数は同様の方法でアプリに定義されなければならない
  • Base64.java、Base64DecoderException.java
    バイナリからBase64エンコード変換を行うサービスを提供する。Securityクラスは、このユーティリティを使用している

サンプルアプリのダウンロード

 アプリ内課金サンプルアプリはAndroid SDKコンポーネントとしてダウンロード可能です。ダウンロードするには、Android SDKを起動し、AVD Managerを開き、「Google Market Billing package」コンポーネント(図1)を選択し、[Install Selected]をクリックしてダウンロードを開始します。

図1 サンプルアプリを含むGoogle Market Billingパッケージ 図1 サンプルアプリを含むGoogle Market Billingパッケージ

 ダウンロード完了後、以下のディレクトリにコンポーネントが保存されます。


【Android SDKのインストールディレクトリ】/google-market_billing/

サンプルアプリのビルドと実行

 もしアプリ内課金をアプリに組み込む前に、アプリ内課金のデモが見たいのであれば、サンプルアプリをビルドして実行可能です。サンプルアプリのビルドと実行は以下の3つのタスクからなります(下記リストはインデックスになっています)

  1. サンプルアプリの設定とビルド
  2. Android Marketへサンプルアプリをアップロード
  3. テストアカウントの設定とサンプルアプリの実行

 サンプルアプリのビルドと実行はアプリ内課金のデモを見たい場合にのみ必要です。もしサンプルアプリを実行しなくてもよいなら、次章「ステップ2:プロジェクトへのAIDLファイルの追加」まで読み飛ばしてください。

【1】サンプルアプリの設定とビルド

 サンプルアプリを実行する前に、以下を設定してビルドする必要があります。

 まず、サンプルアプリのコードにAndroid Marketの公開鍵を追加します。アプリがAndroid Marketから戻されるトランザクション情報のシグネチャを検証できるようにします。サンプルアプリのコードに公開鍵を追加するには、以下のようにしてください。

  1. Android Marketの開発者アカウントにログイン
  2. ページ左上にある名前の下の[Edit Profile]をクリック
  3. [Edit Profile]ページで[Licensing]と[In-app Billing]パネルまでスクロール
  4. 公開鍵をコピー
  5. 好みのエディタで「src/com/example/dungeons/Security.java」を開く(このファイルはサンプルアプリのプロジェクト内にある)
  6. 以下のように公開鍵を記入する
    「String base64EncodedPublicKey = "コピーした公開鍵";」
  7. ファイルを保存

 次に、サンプルアプリのパッケージ名を変更します。現在のパッケージ名は「com.example.dungeons」です。Android Marketにはcom.exampleパッケージのアプリをアップロードすることはできないので、別のパッケージ名に変更してください。

 最後に、リリースモードでビルドし、署名します。

【2】サンプルアプリをアップロード

 サンプルアプリをリリースモードでビルドし署名を行った後、Android Marketの開発者サイトにドラフト版としてアップロードする必要があります。また、サンプルアプリ内で購入可能な、アプリ内の商品リストを作成する必要があります。

 まず、Android Marketにリリースバージョンのサンプルアプリをアップロードします。サンプルアプリはドラフト版としてアップロードし公開しないようにしてください。このサンプルアプリはデモ目的なので、Android Marketで公開するのは推奨されていません。

 次に、サンプルアプリの商品リストを作成します。サンプルアプリでは両手剣(sword_001)とポーション(potion_001)の2つのアイテムが購入可能です。sword_001は「アカウント単位で管理」購入タイプに、potion_001は「管理なし」購入タイプにすることで、それらの購入タイプがどのように振る舞うかを確認できるため、このように設定することを推奨します。

 商品リストのセットアップ方法については、次回の「課金する商品リストを作成するには」を参照してください。

 たとえサンプルアプリを公開していないとしても、開発者は商品リスト(sword_001とpotion_001)を公開しなければなりません。また、サンプルアプリの商品リストに項目を追加するためには、Googleチェックアウトのアカウントが別途必要です。

【3】サンプルアプリの実行

 サンプルアプリはエミュレータ上で実行できません。実行するためにはサンプルアプリを実機にインストールしなければなりません。

 サンプルアプリを実行するためには、まず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にすることでログ出力をオンにできます。

ステップ2:プロジェクトへのAIDLファイルの追加

 AIDLファイルを開発者自身のプロジェクトに追加すると、Androidビルド環境はインターフェイスファイル(IMarketBillingService.java)を生成します。開発者は、このインターフェイスを使用してプロセス間通信を行うメソッドを呼び出して課金リクエストを生成できます。

Eclipse環境の場合

 もし、EclipseADTプラグインを使用しているなら、AIDLファイルを「src」ディレクトリに追加するだけで済みます。Eclipseは自動的にプロジェクトをビルドし、インターフェイスファイルを生成します。ADTプラグインを使用していないなら、AIDLファイルをプロジェクトに追加しAntなどでプロジェクトをビルドし、IMarketBillingService.javaを生成します。

Eclipse環境ではない場合

 Eclipse以外の環境でIMarketBillingService.aidlファイルをプロジェクトに追加するには、「src」ディレクトリにディレクトリ「com/android/vending/billing/」を作成し、IMarketBillingService.aidlファイルをコピーしてアプリをビルドします。プロジェクトの「gen」フォルダ内に「IMarketBillingService.java」というファイル名でインターフェイスが生成されていることを確認してください。

ステップ3:アプリのマニフェストの修正

 アプリ内課金は、アプリと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>

       1|2|3|4 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。