【Kotlin】Google Play Billing Library 6 でアプリ内課金を実装し直したお話

  • このエントリーをはてなブックマークに追加

毎年恒例のアップデート

Androidアプリでアプリ内課金をするにはGoogle Play Billing Libraryを使う必要があるのですが、これは毎年メジャーアップデートされており、現在はバージョン6まで出ています。

これだけであれば別にいいのですが、過去のバージョンを使っているとアプリのアップデートができないという決まりが…

具体的には

注: 2023 年 8 月 2 日以降、すべての新規アプリでは Billing Library バージョン 5 以降を使用する必要があります。また既存のアプリのアップデートについては、2023 年 11 月 1 日より Billing Library バージョン 5 以降の使用が必須となります

というように、一つ前のバージョンまでは許容されますが、2つ前、つまりバージョン4を使っているアプリはアップデートできなくなります。

事実上2年しか持たないライブラリとなるわけで、毎年対応する必要がある感じですね。
と言うわけで今回はバージョン5からバージョン6への対応をまとめたいと思います。

詳しくは下記のURLから確認していただくのが手っ取り早いかつ確実です。

(外部サイト)Google Play Billing Library 4 または 5 からバージョン 6 に移行する
https://developer.android.com/google/play/billing/migrate-gpblv6?hl=ja

ということで、ここでは実際にこんなケースの場合にどう対応したかまとめたいと思います。

ちなみに以下のような設定というか環境になってます

  • 言語はKotlinで記述
  • 定期購入(いわゆるサブスク)かつ2種類の購入アイテムがあり、購入済みアイテムを切り替えるとただちにアップグレードまたはダウングレードされる
まぁよくある形ですね。
これが消費型アイテムだったりするとまた変わるのかもしれませんが、今回は割愛します。

実際にバージョンアップしてみた

Android Studioでライブラリのアップデートをしてみると案の定エラーがありました。
ただバージョン4→5よりかははるかに少ないです。(SKUが非推奨になったりしていたので)
今回はそこを取り上げてきます。

Purchase.PurchaseState.PENDINGの時のOrderIdがnull

真っ先にエラーが出たのはこの部分です。実はPENDINGの時も処理を入れていたのですが、おそらくバージョン6から

The order ID will be null if the purchase is in the Purchase.PurchaseState.PENDING state and populated if the purchase has transitioned to the Purchase.PurchaseState.PURCHASED state.
(購入が Purchase.PurchaseState.PENDING 状態にある場合、注文 ID は null になり、購入が Purchase.PurchaseState.PURCHASED 状態に移行した場合に設定されます。)

となり、PENDINGにOrderIdは取れなくなりました。
なので、PENDING時はOrderIdを使った処理を書かないようにしましょう。(普通はしないか…)

実はエラーはこれだけで、実はこの状態でも動くのですが、非推奨の指摘が1カ所あったので潰したいと思います。

setReplaceProrationMode とかは非推奨

「これを使え」と言われてすぐに非推奨になる微妙な感じがありますが、非推奨と言われたら直すしかない

これは「定期購入中に違うプランを申し込んだときにどうするか(この場合は直ちにアップグレードまたはダウングレードする)」という処理ですが、今回のバージョンでは2カ所の非推奨ポイントがあります。

簡単に言うと

  • setReplaceProrationMode(Int) は使わないでね
  • BillingFlowParams.ProrationModeも使わないでね
といった感じです。

ドキュメントにもそれぞれ

This method is deprecated.
Use setSubscriptionReplacementMode(int) instead.

https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.ProrationMode

This @interface is deprecated.
use BillingFlowParams.SubscriptionUpdateParams.ReplacementMode instead.

https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.Builder#setReplaceProrationMode(int)

と書かれていました。

って事で推奨される記述の変更します。

これでバージョン6に対応するようになりました。やったね!

ちなみに…

今回は影響はなかったですが、実は「BillingClient.BillingResponseCode.SERVICE_TIMEOUT」も非推奨になりました。

This constant is deprecated. See SERVICE_UNAVAILABLE which will be used instead of this code.

[BillingClient.BillingResponseCode.SERVICE_UNAVAILABLE]を代わりに使ってくれと言うことですので、もし使っている方がいたらここも注意しましょう。

最後に

基本的に今はKotlinで記述しており、Javaで書くことは昔のアプリをアップデートする場合以外はほぼ無くなりましたが、ライブラリのアップデートなどを行う事を考えると、JavaのままでいいのかKotlinで書き直した方がいいのか迷ったりします。

まぁ2年の猶予があるので未来の自分に任せる方法もアリですが、他のライブラリの件などもあったりするので、随時修正した方が負担も少ないかなと思ったりします。

(最初からKotlinで書いておけば…)

 

執筆者:松本[ エンジニア ]

関連記事

マークアップ

コーポレートサイトのアクセシビリティ、どこまで対応すべき?

コーポレートサイトにおける。 重要だと分かっていても、コーポレートサイトにどこまで反映すべきかは悩みどころではないですか? 今回は、現実的に取り組みやすい部分と、対応が難しい部分を整理してご紹介します。 一概にこれが正解、というわけではありませんが、悩んでいる方の参考になればと思います。 目次1 コーポレートサイトでの達成基準は?2 比較的対応しやすい部分2.1 画像に代替テキストを設定する2.2 見出し構造の整理(h1~h6の適切な使用)をする2.3 色や形だけに依存しない […]

Webサイト制作

はじめてのShraePoint 実践的活用事例3選【業務効率化・DX】

目次1 SharePointとは?1.1 高い機密性が特長2 SharePointの活用法2.1 1.社内マニュアルや手順書を整備する2.2 2.営業資料や契約書の保管と共有に活用する2.3 3.情報の回覧やアンケート、意見収集の場として活用3 SharePointで作成したポータルサイト4 まとめ5 8bit公式 YouTube Channelのご紹介 SharePointとは? SharePointはMicrosoftが提供する情報共有サービスです。WordやExcel、 […]

Webデザイン

【Premiere Pro】動画素材の音声を自動で文字起こしする方法

Premiere Proの機能を使って、動画素材の音声を自動で文字起こししてみましょう。起こしたテキストは、発話タイミングに合わせて字幕として表示することもできます。とても簡単にできるので、ぜひ試してみてください。 目次1 自動文字起こし機能の使い方1.1 1.テキストパネルから文字起こしを行う1.2 2.文字スタイルの変更2 8bit公式 YouTube Channelのご紹介 自動文字起こし機能の使い方 1.テキストパネルから文字起こしを行う 音声データを含んだ動画をタイ […]

株式会社8bit (エイトビット)

東京都目黒区でWebサイト制作、Webシステム開発などを行っております。
コーポレートサイトやWebサービスの企画・提案を得意としており、自社での経験を元にアイデアをカタチにするお手伝いをさせていただいております。

Web制作に関するご相談はお気軽にどうぞ

弊社に制作をご依頼いただく際の費用感をご確認いただける、
見積りシミュレーションをご用意いたしました。