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.