【Android】GooglePlay Billing Library 4 ⇒ 5 への移行を試したので手順を解説
GooglePlay Billing Libraryについて
つい最近バージョン4になったばかりです。
なのにバージョン5がもう出てきたようです。
もちろん旧バージョンはサポートされ続けるはずですが、やっぱり最新にしておくのがベストです。(Googleの気まぐれ次第…)
バージョン3未満のBilling Libraryを使ってる既存アプリの場合、バージョン3以降でないとアップデートできなくなる、というアプデもありました。
将来的にバージョン4でも起こりうる事象です。
そこでBillingLibrary5への移行を試しました。
その変更点・手順を詳しくまとめていきます。
まずバージョン5の変更点について。非破壊的
このバージョン5の変更点はこうなってます。
サブスク関連で大きな変更があった
バージョン4との互換性は保たれる
すなわち破壊的アプデではない(朗報)
非破壊的なので、バージョン4 ⇒ 5 にアップデートしたからといってAndroidStudio上でエラーが出ることはありません。実際にそうでした
ただしバージョン4の課金コードは非推奨(deprecated)として認識されます。Android Studioだったら「*** is deprecated. Deprecated in Java」みたいに表示されるってこと
非推奨なのでサポートされ続けるかはGoogle次第
恐らくサポートはされ続けるはずです。
※ 現にバージョン3以下もサポートされている
でもGoogleの気まぐれ・突如としたアプデに巻き込まれないよう、僕自身はBilling Libraryは極力最新のものを使います。
先ほども書いたようにバージョン3未満だとアプリのアプデができない実害が生じちゃうので。バージョン5への対応も急いだほうがいいかも
まずbuild.gradleでBillingLibrary5.0.0に変更
初めにbuild.gradleの修正から
※ 現時点は5.0.0が最新バージョン
これは単純にバージョンを上げるだけでOKです。
▼ 修正前のbuild.gradleの内容
/// GooglePlay Billing
def billing_version = "4.1.0"
implementation "com.android.billingclient:billing:$billing_version"
▼ 修正後のbuild.gradleの内容
/// GooglePlay Billing
def billing_version = "5.0.0"
implementation "com.android.billingclient:billing:$billing_version"
この部分はこれだけ
BillingClientの初期化処理はコード変更なし
BillingClientの初期化はコード修正必要なしです。
▼ ActivityのonStart()などで初期化…
/// Initialize Google Play Billing Library
billingClient = BillingClient.newBuilder(this)
.setListener(this)
.enablePendingPurchases()
.build()
billingClient?.startConnection(object : BillingClientStateListener {
override fun onBillingSetupFinished(billingResult: BillingResult) {
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) {
queryProductDetails()
}
}
override fun onBillingServiceDisconnected() { }
})
バージョン4から変更はありません。
上記コードの queryProductDetails() は後述します。
課金アイテム情報をqueryProductDetailsAsync()から一括取得
次は課金アイテムの情報を取得するメソッドを定義します。
※ 当然GooglePlayConsoleでアイテム作成してる前提
次のように queryProductDetails() を定義しました。
/// アイテム詳細(ProductDetails)のリスト
private lateinit var productDetailsList: List<ProductDetails>
/// 課金アイテムID
private val SKU_PREMIUM_FEATURES = "com.hoge.hoge.premium_features"
private fun queryProductDetails() {
/// 商品IDとタイプを指定してproductList生成
val productList = listOf(
QueryProductDetailsParams.Product.newBuilder()
.setProductId(SKU_PREMIUM_FEATURES)
.setProductType(BillingClient.ProductType.INAPP)
.build()
)
val params = QueryProductDetailsParams
.newBuilder()
.setProductList(productList)
billingClient!!.queryProductDetailsAsync(params.build()) {
billingResult,
productDetailsList ->
/// 必須 : productDetailsList を保存
this.productDetailsList = productDetailsList
/// 取得した商品詳細を表示
Log.d(TAG, "productDetailsList : "+productDetailsList.toString())
}
}
上記コードのように商品IDと商品タイプを指定した productList を生成し、それを BillingClient#queryProductDetailsAsync に渡す形式に変わりました。
以前は商品ID(SKU)のリストを渡してましたね。
重要なのはメンバ変数として productDetailsList を用意しておき、queryProductDetailsAsync() から返ってきた productDetailsList を「そのままアプリ・Activity終了まで保持」することです。
そうしないとBillingFlowを表示できません(後述)
ちなみにproductDetailsListを表示してみました。
▼ 返ってきたList<ProductDetails>の内容
ここから先は
¥ 298
この記事が気に入ったらサポートをしてみませんか?