先日からアプリ内課金が行えるようになったので、現在開発中のアプリに仕込んでみました。
今回は導入からアプリ課金ページ表示の所まで簡単に書き残しておきます。
概要
だいたいの説明は android developers ページに載っています。
英文読んでから気づいたんですが、日本語訳ページがあるようです。訳された方に感謝しながら、英語に自信無い方はこっち見た方が分かりやすそうです。
だいたいの課金のやりとり
- アプリ側でアイテム購入のボタンを押下
- アプリ側からアプリ内サービスIDをキーに、AndroidMarketアプリに対してアイテム購入リクエスト送信
- AndroidMarketアプリが、デベロッパーコンソール上に登録されたアプリに紐付くアイテムの中からアプリ内サービスIDと一致したデータステータス情報を取得
- データステータス情報がアイテム未購入で該当アイテムが購入できる状態にあれば、AndroidMarket側がアイテム購入ページを表示
- アイテム購入ページで購入ボタン押下
- 購入処理されて、アプリ側へ結果を返す
間違ってる箇所があるかもしれませんが、だいたいこんな感じ。
ちゃんとこのページ読んで理解した方がいいかも。
実装方法
このページに全部書いてあるので、こちら参考に実装していけば良いだけ。
あえてざっくり説明すると以下のようになります。
- 「google-market_billing」というアプリ内課金サンプルをDL
- AndroidManifest.xmlの中身で必要そうな箇所をコピー
- com.android.vending.billing.IMarketBillingService.aidl をパッケージごとコピー
- サンプルコードをほぼまるごとコピー。パッケージ名は変更してOK
アイテム課金するためのキー実装は、Dungeons.java の mBillingService.requestPurchase(mSku, mPayloadContents) 箇所。
mSku はアプリ内サービスIDで、ここでAndroidMarketに対してアプリ内課金リクエストを送信してる。
アプリ内サービスIDに「android.test.purchased」設定して、テストすると課金ページが表示されたらここまでの実装はOK。
「なんでこのID使ってるの?」って思った方はここらへん読んでください。
課金アイテム登録
ここまでの実装で発生しそうなエラー
自分で設定したアプリ内サービスIDでテストすると、「アイテム購入不可/Item Unavailable」ダイアログが表示される場合。
アプリ側は非公開でもOKですが、アイテム側は公開しないと上記エラーが発生します。
課金ページで放置してたらANRが発生する。
今のところ解決方法が見つからない。。。
次に向けて
ここまでは確認できたので、次はリリースする際にトラブらないか確認してみます。
ただこのアプリリリースできるのいつになるんだろうか。。。