错误:“请为购买更新提供有效的侦听器”Google Play 计费库 android

问题描述 投票:0回答:0

我在我的应用程序中通过 Google Play 计费库 为用户购买订阅

问题是我需要在两个不同的类中访问相同的BillingClient实例

1。 MainActivity: 我需要访问 BillingClient 实例来检查 onCreate 和 onResume 用户是否还有活跃购买,然后对应用程序进行一些必要的更改。

2。 BlackFragment: 在这个片段中,我还需要访问 BillingClient 实例,以便用户可以购买订阅,如果他还没有购买的话。

面对这2个问题,我想到了以下解决方案: 创建 BillingHelper 的 Singleton 以在两个类中使用 BillingClient 的单个实例。但是这里有一个问题,在我的 MainActivity 中我只想查询以检查用户的购买并查看它是否处于活动状态,也就是说,我不需要将“侦听器”传递给我的实例。 在 BlackFragment 的情况下,这将是用户实际购买的地方,我需要一个“听众”。

访问 MainActivity 时生成的错误是这样的:“java.lang.IllegalArgumentException:请为购买更新提供有效的侦听器。” 发生此错误是因为必须将“侦听器”传递给 BillingClient实例。

考虑到我需要在两个不同的类中使用这个实例,我该如何解决这个问题? 有什么解决办法吗?

如果你需要,我会在下面留下Singleton、MainActivity和BlackFragment的代码:

object BillingHelper {
    private var billingClient: BillingClient? = null

    fun getInstance(context: Context, listener: PurchasesUpdatedListener? = null): BillingClient {
        return billingClient ?: synchronized(this) {
            billingClient ?: BillingClient.newBuilder(context)
                .apply {
                    listener?.let {
                        setListener(it)
                    }
                }
                .enablePendingPurchases()
                .build().also { billingClient = it }
        }
    }
}
class MainActivity : AppCompatActivity() {
   private var billingClient: BillingClient? = null

 override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)
       
        billingClient = BillingHelper.getInstance(this) // error on this line
        lifecycleScope.launch { queryPurchase() }
    }

override fun onResume() {
        super.onResume()
        lifecycleScope.launch { queryPurchase() }
    }

 override fun onDestroy() {
        super.onDestroy()
        billingClient?.endConnection()
    }
 }
class BlackFragment : Fragment() {
   private var billingClient: BillingClient? = null
   private var purchasesUpdatedListener: PurchasesUpdatedListener? = null

override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {

        purchasesUpdatedListener = PurchasesUpdatedListener { billingResult, purchases ->
            
            if (billingResult.responseCode == BillingClient.BillingResponseCode.OK && purchases != null) {
                handlePurchases(purchases)
            } else if (billingResult.responseCode == BillingClient.BillingResponseCode.USER_CANCELED) {
                
                binding.root.showSnackbar("Purchase canceled")
            } else if (billingResult.responseCode == BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED) {
                binding.root.showSnackbar("Already bought")
            } else if (billingResult.responseCode == BillingClient.BillingResponseCode.FEATURE_NOT_SUPPORTED) {
                binding.root.showSnackbar("Erro: FEATURE_NOT_SUPPORTED")
            } else {
                
                binding.root.showSnackbar("Erro: ${billingResult.debugMessage}")
            }
        }

        if (!App.isFlameBlack) { // verify if user has not purchased the product
            
            billingClient = BillingHelper.getInstance(requireContext(), purchasesUpdatedListener)
        }

        return binding.root
    }

 }
android in-app-billing android-billing play-billing-library
© www.soinside.com 2019 - 2024. All rights reserved.