使用计费客户端进行应用内计费.响应代码 = -1.服务连接已断开



在我的应用程序中,创建了一个捐赠函数。(具有在应用程序内购买权限的应用程序在谷歌播放和下载版本中可用,此功能有效)我使用anjlab的简单库做到了。我开始更新应用程序,并同时在Kotlin上重写了它。多纳特出于某种原因停止了工作。我决定将anjlab库中的代码重做到 google 的新计费库。当我尝试购买时,我得到

响应代码 = -1(服务连接已断开)。

我尝试使用startConnection(this)恢复连接,尝试更改gradle中的版本,将新版本加载到库apk中。旧的和新的都不起作用(如果您从 google play 下载,已发布的那个,它可以工作)。代码根据谷歌的指南编写。我测试在真实设备上签名的应用程序

SettingsFramgent.kt(僅限聖餐代碼)

package *
import android.content.Intent
import androidx.preference.PreferenceFragmentCompat
import android.os.Bundle
import android.widget.Toast
import androidx.preference.Preference
import com.starikov.datecalc.R
class SettingsFragment : PreferenceFragmentCompat(), SettingsContract.View {
private lateinit var presenter: SettingsContract.Presenter
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.preferences, rootKey)
presenter = SettingsPresenter(activity!!)
presenter.attachView(this)
val makeDonatePref: Preference = findPreference(MAKE_DONATE_KEY)!!
makeDonatePref.setOnPreferenceClickListener { presenter.makeDonateClicked(); true }
presenter.viewIsReady()
}
override fun showToast(resId: Int) {
Toast.makeText(activity, resId, Toast.LENGTH_LONG).show()
}
override fun startActivity(intent: Intent) {
activity!!.startActivity(intent)
}
override fun onDestroy() {
super.onDestroy()
presenter.detachView()
if (activity!!.isFinishing) {
presenter.destroy()
}
}
companion object {
private const val MAKE_DONATE_KEY = "make_donate"
}
}

SettingsPresenter.kt

package *
import android.app.Activity
import android.content.ActivityNotFoundException
import android.content.Intent
import android.net.Uri
import com.android.billingclient.api.*
import com.starikov.datecalc.common.PresenterBase
import com.android.billingclient.api.BillingClient
import com.android.billingclient.api.SkuDetailsParams
import com.android.billingclient.api.BillingFlowParams
import com.starikov.datecalc.R
import java.util.*

internal class SettingsPresenter internal constructor(private val activity: Activity)
: PresenterBase<SettingsContract.View>(), SettingsContract.Presenter {
private lateinit var billingClient: BillingClient
private var skuDetailsMap: HashMap<String, SkuDetails> = HashMap()
override fun makeDonateClicked() {
initBillingProcessor()
launchBilling(DONATE_PRODUCT_ID)
}
override fun destroy() {
billingClient.endConnection()
}
override fun viewIsReady() {}
private fun initBillingProcessor() {
billingClient = BillingClient.newBuilder(activity)
.enablePendingPurchases()
.setListener {
billingResult, purchases ->
if (billingResult?.responseCode == BillingClient.BillingResponseCode.OK && purchases != null) {
//purchase done
view!!.showToast(R.string.thanks_for_donate)
}
}.build()
billingClient.startConnection(object : BillingClientStateListener {
override fun onBillingSetupFinished(billingResult: BillingResult?) {
if (billingResult?.responseCode == BillingClient.BillingResponseCode.OK) {
// **place of logs**
querySkuDetails() 
}
}
override fun onBillingServiceDisconnected() {
//if wrong
}
})
}
private fun launchBilling(skuId: String) {
val billingFlowParams = BillingFlowParams.newBuilder()
.setSkuDetails(skuDetailsMap[skuId])
.build()
billingClient.launchBillingFlow(activity, billingFlowParams)
}
private fun querySkuDetails() {
val skuDetailsParamsBuilder = SkuDetailsParams.newBuilder()
val skuList = ArrayList<String>()
skuList.add(DONATE_PRODUCT_ID)
skuDetailsParamsBuilder.setSkusList(skuList).setType(BillingClient.SkuType.INAPP)
billingClient.querySkuDetailsAsync(skuDetailsParamsBuilder.build()) { billingResult, skuDetailsList ->
if (billingResult?.responseCode ==  BillingClient.BillingResponseCode.OK) {
for (skuDetails in skuDetailsList!!) {
skuDetailsMap[skuDetails.sku] = skuDetails
}
}
}
}
companion object {
private const val DONATE_PRODUCT_ID = "donate"
}
}

在">日志的位置",我检查了billingResult.responseCode = -1; debugMessage ="服务连接已断开连接">

我不知道该怎么办。 提前感谢您的帮助

就我而言,我使用的是延迟初始化。

这样,Google 结算设置就在launchBillingFlow方法调用之前立即启动。

这导致服务断开连接,并且尚未准备好计费流启动的确切时刻。

我现在启动 BillingClient 连接,因为活动已启动,并且流在用户请求时按预期工作。

不确定您是否仍然遇到此问题,但我遇到了它,调试显示计费客户端仍在使用一些我尚未在旧的 com.android.vending 包中删除的旧 AIDL 内容。 一旦我删除了所有这些代码并破坏了我的应用程序对旧东西的支持,我就可以继续购买而不会出错。

面对这样的问题。 我的决定是添加到应用程序 XML 节点中

<!-- GOOGLE PLAY BILLING -->
<activity
android:name="com.android.billingclient.api.ProxyBillingActivity"
android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />

最新更新