我在我的应用程序中通过 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
}
}