目的
下記の公式リファレンスにあるように、「override fun onPurchasesUpdated」の内部で「suspend fun handlePurchase」を呼び出したいです。
公式リファレンス - 購入フローを起動する
また、購入するアイテムは「消費不可アイテム」を想定しています。
わからないこと
公式リファレンスにあるように、「onPurchasesUpdated」をoverrideで宣言し、「handlePurchase」をsuspendで宣言すると、
「onPurchasesUpdated」もsuspendに変更するべきである、とエラーが発生してしまいます。
ですが、「onPurchasesUpdated」をsuspendに変更すると、エラーは消えるのですが「onPurchasesUpdated」の文字がグレーアウトしてしまい、機能しなくなってしまいます。
「override suspend fun onPurchasesUpdated」なども試してみたのですが、変わらずエラーが発生してしまう状況です。
どのように記述すれば、公式リファレンスのようにoverride funの中からsuspend funを呼び出すことができるのでしょうか。
ご存知の方いらっしゃいましたら、ご教授いただけますと幸いです。よろしくお願いいたします。
コード
kotlin
1 // ビューが作成された際に呼ばれる 2 @RequiresApi(Build.VERSION_CODES.O) 3 override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 4 Log.i("ビュー", "作成") 5 textureView = view.findViewById(R.id.texture) // プレビュー用のビュー設定 6 button_rec_anim = view.findViewById<ImageView>(R.id.button_rec_anim).also { // 録画ボタン設定(アニメーション) 7 it.setOnClickListener(this) 8 } 9 initSoundPool() // soundpoolの初期化 10 // dataStoreという名前でpreferenceをインスタンス化しアプリ固有の領域にデータを保管できるようにする 11 dataStore = requireActivity().applicationContext.getSharedPreferences("DataStore", Context.MODE_PRIVATE) 12 checkPurchase() // 購入履歴の確認 13 setUpBillingClient() // BillingClientの作成,初期化 14 } 15 16... 17 18 // PurchasesUpdatedListenerに購入の状態を通知する(購入処理実行後googlePlayにより呼び出される) 19 override fun onPurchasesUpdated(billingResult: BillingResult, purchases: List<Purchase>?) { 20 Log.i("課金", "onPurchasesUpdated") 21 // 購入を実行していて、且つ購入できるアイテムリストが存在する場合 22 if (billingResult.responseCode == BillingClient.BillingResponseCode.OK && purchases != null) { 23 for (purchase in purchases) { // 購入できるアイテムをリストから順に取得 24 handlePurchase(purchase) // 各アイテムの購入状態を確認する 25 } 26 } else if (billingResult.responseCode == BillingClient.BillingResponseCode.USER_CANCELED) { 27 // ユーザーが購入フローをキャンセルした場合 28 } else { 29 // 購入アイテムが存在しない場合 30 } 31 } 32 33 // 購入をアプリで承認する(アイテムと購入トークン(アイテムの利用権)を紐付ける) 34 suspend fun handlePurchase(purchase: Purchase) { 35 // 購入が完了している場合 36 if (purchase.purchaseState === Purchase.PurchaseState.PURCHASED) { 37 // まだ購入が承認されていない場合 38 if (!purchase.isAcknowledged) { 39 val acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder() 40 .setPurchaseToken(purchase.purchaseToken) // アイテムと購入トークン(アイテムの利用権)を紐付ける 41 val ackPurchaseResult = withContext(Dispatchers.IO) { 42 // 消費不可アイテムの購入を承認する 43 billingClient.acknowledgePurchase(acknowledgePurchaseParams.build()) 44 } 45 // 購入完了のフラグとなる値をpreferenceに書き込む 46 dataStore!!.edit().putBoolean("purchaseSW", true).apply() 47 } 48 } 49 } 50 51... 52 53 // preferenceに保存された値を参照して購入履歴があるか確認する 54 private fun checkPurchase() { 55 // 指定したキーが存在しない場合は第二引数のfalseになる。存在する場合は保存されている値になる。 56 purchaseSW = dataStore!!.getBoolean("purchaseSW", false) 57 }
エラー内容
Suspend function 'handlePurchase' should be called only from a coroutine or another suspend function
回答1件
あなたの回答
tips
プレビュー