I want to implement Google Play's billing for my android app's in-app purchase, which is written in kotlin. I am following this tutorial.
Here is my code:
private lateinit var billingClient: BillingClient
private lateinit var productsAdapter: ProductsAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setupBillingClient()
}
private fun setupBillingClient() {
billingClient = BillingClient
.newBuilder(this)
.setListener(this)
.build()
billingClient.startConnection(object : BillingClientStateListener {
override fun onBillingSetupFinished(@BillingClient.BillingResponse billingResponseCode: Int) {
if (billingResponseCode == BillingClient.BillingResponse.OK) {
println("BILLING | startConnection | RESULT OK")
} else {
println("BILLING | startConnection | RESULT: $billingResponseCode")
}
}
override fun onBillingServiceDisconnected() {
println("BILLING | onBillingServiceDisconnected | DISCONNECTED")
}
})
}
fun onLoadProductsClicked(view: View) {
if (billingClient.isReady) {
val params = SkuDetailsParams
.newBuilder()
.setSkusList(skuList)
.setType(BillingClient.SkuType.INAPP)
.build()
billingClient.querySkuDetailsAsync(params) { responseCode, skuDetailsList ->
if (responseCode == BillingClient.BillingResponse.OK) {
println("querySkuDetailsAsync, responseCode: $responseCode")
initProductAdapter(skuDetailsList)
} else {
println("Can't querySkuDetailsAsync, responseCode: $responseCode")
}
}
} else {
println("Billing Client not ready")
}
}
private fun initProductAdapter(skuDetailsList: List<SkuDetails>) {
productsAdapter = ProductsAdapter(skuDetailsList) {
val billingFlowParams = BillingFlowParams
.newBuilder()
.setSkuDetails(it)
.build()
billingClient.launchBillingFlow(this, billingFlowParams)
}
//products.adapter = productsAdapter
}
override fun onPurchasesUpdated(responseCode: Int, purchases: MutableList<Purchase>?) {
println("onPurchasesUpdated: $responseCode")
allowMultiplePurchases(purchases)
}
private fun allowMultiplePurchases(purchases: MutableList<Purchase>?) {
val purchase = purchases?.first()
if (purchase != null) {
billingClient.consumeAsync(purchase.purchaseToken) { responseCode, purchaseToken ->
if (responseCode == BillingClient.BillingResponse.OK && purchaseToken != null) {
println("AllowMultiplePurchases success, responseCode: $responseCode")
} else {
println("Can't allowMultiplePurchases, responseCode: $responseCode")
}
}
}
}
private fun clearHistory() {
billingClient.queryPurchases(BillingClient.SkuType.INAPP).purchasesList
.forEach {
billingClient.consumeAsync(it.purchaseToken) { responseCode, purchaseToken ->
if (responseCode == BillingClient.BillingResponse.OK && purchaseToken != null) {
println("onPurchases Updated consumeAsync, purchases token removed: $purchaseToken")
} else {
println("onPurchases some troubles happened: $responseCode")
}
}
}
}
companion object {
private val skuList = listOf("get_5_coins", "get_10_coins")
}
I also added implementation 'com.android.billingclient:billing:1.2.2'
in my build.gradle
and also added com.android.vending.BILLING
and Internet uses-permission in my menifest file.
When I'm running this code, it is showing that billing client isn't ready.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With