GooglePlayBillingLibraryを使った課金アイテムの作り方
アプリ内で何かアイテムを作ってそれを販売したい場合はGooglePlayBillingLibraryというライブラリを使います。
ライブラリの導入
まずeclipseのAndroidSDKManagerを開いて、「extra」フォルダ以下の「Google Play Billing Library」をインストールします。
もしBilling Libraryが見つからなかったらADTをアップデートしてみてください。
インストールが完了したらsdk\extras\googleディレクトリ以下にplay_billingディレクトリが作られます。
次に自分のアプリのプロジェクトのsrcディレクトリ上に次の画像のようにパッケージ「com.android.vending.billing」を作り、その中にsdk\extras\google\play_billingディレクトリにあるIInAppBillingService.aidlをコピーします。
パーミッションの追加
アプリから課金するにはAndroidManifest.xmlのapplicationタグの下に次のパーミッションを追加します。
<uses-permission android:name="com.android.vending.BILLING" />
これだけです。
課金アイテムの作成
次に課金したいアイテムをディベロッパー画面から作ります。
課金アイテムを作る場合、必ずAPKがGooglePlay上にアップロードされた上に、アプリが一度以上公開済みでなければなりません。
アプリが公開済みならhttps://play.google.com/apps/publish/を開き、そこからアプリ内アイテムを選択します。
その後、「新しいアイテムを追加」をクリックすると次のダイアログが出てくるのでそこでアイテムの種類とアイテムID(大文字不可)を入力してアイテムを追加します。
一度作成したアイテムIDは後からアイテムを削除しても再利用できないので慎重に決めてください。
また、アイテムのステータスは作成時は「無効」になっているので必ず「有効」にします。
アイテムの購入
次にアイテムの購入するための実装をしていきます。
まず初めに課金処理を行うサービスであるIInAppBillingServiceをアクティビティを結びつけます。
そのために初めにActivityで次のサービスとコネクションを宣言します。
アクティビティ内IInAppBillingService billingService; /// 課金サービス /**課金サービスをアクティビティと結びつけるコネクションクラス*/ ServiceConnection billingServiceConn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { billingService = IInAppBillingService.Stub.asInterface(service); } @Override public void onServiceDisconnected(ComponentName name) { billingService = null; } };
次にonCreateメソッド内でアクティビティとサービスを次のように結びつけます。
アクティビティ内@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /// 課金サービス開始 bindService( new Intent("com.android.vending.billing.InAppBillingService.BIND"), billingServiceConn, Context.BIND_AUTO_CREATE); }
追記 :
Android5.0以上で上記のコードを試すとIllegalArgumentExceptionで落ちてしまうことが判明しました。なので次のように変更しなくてはいけません。
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /// 課金サービス開始 Intent intent = new Intent( "com.android.vending.billing.InAppBillingService.BIND"); intent.setPackage("com.android.vending"); bindService(intent, billingServiceConn, Context.BIND_AUTO_CREATE); }
追記終了
そして課金ダイアログをアクティビティ内のボタンが押されたら表示されるような処理を作りました。
アクティビティ内Button buyItemButton = (Button) findViewById(R.id.buyItemButton); buyItemButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Bundle buyIntentBundle = billingService.getBuyIntent( 3, getPackageName(), "myapp_item_id", "inapp", "bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ"); PendingIntent buyIntent = buyIntentBundle.getParcelable("BUY_INTENT"); MainActivity.this.startIntentSenderForResult( buyIntent.getIntentSender(), 1234567, new Intent(), Integer.valueOf(0), Integer.valueOf(0), Integer.valueOf(0)); /// 課金ダイアログを表示 } });
IInAppBillingServiceのgetBuyIntentに渡している3つ目の引数が先ほど登録した課金アイテムのID、4つ目がアプリの種類、最後の文字列がdeveloper payloadという注文の補足情報で、空の文字列でも構いません。
その後はインテント(BUY_INTENT)を起動するだけで課金ダイアログが表示されます。
購入が成功したかどうかはonActivityResultメソッドから調べることができます。
アクティビティ内@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode == 1234567){ if(resultCode == RESULT_OK){ Toast.makeText(this, "アイテムを購入", Toast.LENGTH_LONG).show(); }else{ Toast.makeText(this, "アイテムの購入に失敗", Toast.LENGTH_LONG).show(); } } }
resultCodeにRESULT_OKが入っていれば購入が成功しています。
最後にアプリが終了したときは購入サービスのコネクションを切り離します。
アクティビティ内@Override public void onDestroy() { super.onDestroy(); /// 課金サービスを終了 if(billingService != null){ unbindService(billingServiceConn); } }
これが基本的な流れです。
課金テスト
テスト購入はエミュレーター上ではできず、実機が必要になります。
そしてアプリをインストールするときは署名したアプリを実機にインストールしなければ「このバージョンのアプリは、Google Playを通じたお支払いはご利用になれません。」というエラーメッセージが表示されます。
その場合はeclipse上からは署名付きアプリはインストールできないので端末とPCをつないだ状態でadbコマンドでアプリのAPKをインストールすればOKです。
また、テストアカウントを使っていない場合は「出版社はこのアイテムを購入できません」というエラーが表示されるので本アカウントとは別のアカウントを作成してください。
もしテストアカウントを端末に追加したら上の画像のように「ライセンス権のあるGmailアカウント」にアカウントを追加します。
もし複数のテストアカウントを登録したければアカウントをコンマで区切ります。
そして課金テストをする際はかならずアプリを一旦公開しなくてはならないみたいです。
公開したとしてもアプリが公開されるまで1時間以上はかかるのでそれまでは課金テストはできません。
全ての条件が整えば次の購入ダイアログが表示されます。
画像に書いてある通り、テストアカウントの場合は課金は発生しないので安心してください。
以上、長くなりましたが課金アイテムの実装方法でした。では、また!