見出し画像

【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>の内容

ここから先は

4,247字 / 2画像

¥ 298

この記事が気に入ったらサポートをしてみませんか?