【Android】getPurchases()メソッドで最新の購入履歴が取得できない時の対処法
こんにちわpencoです。
今回は前回の記事(「購入しようとしたアイテムが見つかりませんでした。」アプリ内課金の実機テストが出来なくなった時の対処法)同様、アプリ内課金処理を作成していたときに困った件について書いていきたいと思います。
購入履歴が取得できない
Google PlayはGoogleアカウントでログインしていると思いますが、同じアカウントで違う端末からログインも出来ますよね。
例えば、GALAXY Noteで非消費のアイテムを購入したとしましょう。
次に、同じGoogleアカウントで使用しているXperia Z2で同じアイテムを購入しようとします。これはもちろん「既に所有しています」となります。
この場合、同じアカウントで購入したアイテムなのですから、Xperia Z2でも使用できるようにしたいです。
しかし、わざわざ購入処理をして「既に所有しています」というフラグを返して貰うのは面倒だし、分かりづらい。アイテム一覧などで、購入済みのアイテムに「再ダウンロード」など分かりやすい表記をしておきたい。
ということで、アイテム一覧表示時に、購入履歴を取得することにしました。
購入履歴を取得するには、In-app Billing Version 3 のgetPurchases()メソッドを使います。
サービスのバインドなど基本的な処理は割愛させて頂いて、購入履歴の取得部分だけを書くとこんな感じになります。↓↓
Bundle ownedItems = mService.getPurchases(3, mContext.getPackageName(), itemType, continueToken);
検証は以下の手順で行いました。
① GALAXY Noteで非消費のアイテムを購入
② Xperia Z2でアイテム一覧を表示
これで②の段階で購入履歴に①で購入したアイテムがあり、アイテム一覧の項目に「再ダウンロードマーク」がつく、という予定でした。
しかし、いざ購入履歴を取得してみると、①で購入したアイテムは履歴に反映されていません。ですが、このアイテムの購入処理をXperia Z2 で行うと「既に所有しています」というレスポンスが返ってきます。
つまり、購入は正しく行えているが、購入履歴に反映されてない。という状況です。
原因はキャッシュ
原因はGoogle Playアプリのローカルキャッシュでした。
V3では購入情報についてGoogle Playアプリ側でキャッシュしています。
①で、GALAXY Note のGoogle Playアプリでは購入履歴がキャッシュされていますが、②のXperia Z2 ではキャッシュが更新されていないため、購入履歴が古いままなので、①の履歴が反映されてない、ということのようです。
試しに、Xperia Z2 のGoogle Playアプリで「マイアプリ」を開き、再びアイテム一覧を表示すると、正しい(最新の)購入履歴が取得できました。これは「マイアプリ」を開いた段階でキャッシュが更新されたからだと推測できます。
プログラム側からキャッシュ更新を促す、ということができればよかったのですが、どうやら出来そうにないので、アイテムの購入処理時に「既に所有しています」というレスポンスが返ってきたら、「再ダウンロード」ボタンを表示する、という対策を追加しました。
同一アカウントの複数端末でアプリを使用した場合、Google Playアプリのキャッシュが更新されていれば、アイテム一覧に「再ダウンロードマーク」が付き、ついていない場合でも、購入処理を行えば、データがダウンロードできる、というところで今回は落ち着きたいと思います。
追記:
Google Play Android Developer API
上記の記事を見つけたので、参考までに。
Token が必要そうですが、こういうAPIもあるそうです。
コメントをどうぞ