如何处理 BillingClient.onBillingServiceDisconnected()?

Sye*_*yex 13 android in-app-billing google-play-services

最近,我将我的一个应用程序迁移到了 Google Play In-App Billing v3。自发布以来,我三星设备上收到了一些崩溃报告,这些报告都与BillingClient.onBillingServiceDisconnected()被调用有关。

当前代码如下所示:

val billingClient = BillingClient.newBuilder(context)
            .setListener(updatedListener)
            .enablePendingPurchases()
            .build()

billingClient.startConnection(
            object : BillingClientStateListener {
                override fun onBillingSetupFinished(billingResult: BillingResult) {
                    if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) {
                        // The billing client is ready. You can query purchases here.
                        querySkuDetails()
                    }
                }

                override fun onBillingServiceDisconnected() {
                    // Try to restart the connection on the next request to
                    // Google Play by calling the startConnection() method.
                    initBilling() // all code here is wrapped in this method
                }
            }
)
Run Code Online (Sandbox Code Playgroud)

在那里我显然重新初始化BillingClientstartConnection()在错误情况下再次调用。崩溃然后是

java.lang.IllegalStateException: 
  at android.os.Parcel.createException (Parcel.java:2096)
  at android.os.Parcel.readException (Parcel.java:2056)
  at android.os.Parcel.readException (Parcel.java:2004)
  at android.app.IActivityManager$Stub$Proxy.registerReceiver (IActivityManager.java:5557)
  at android.app.ContextImpl.registerReceiverInternal (ContextImpl.java:1589)
  at android.app.ContextImpl.registerReceiver (ContextImpl.java:1550)
  at android.app.ContextImpl.registerReceiver (ContextImpl.java:1538)
  at android.content.ContextWrapper.registerReceiver (ContextWrapper.java:641)
  at com.android.billingclient.api.zze.zza (zze.java:5)
  at com.android.billingclient.api.zzd.zza (zzd.java:5)
  at com.android.billingclient.api.BillingClientImpl.startConnection (BillingClientImpl.java:58)
  at de.memorian.gzg.presentation.base.IAPHelper.initBilling (IAPHelper.java:40)
  at de.memorian.gzg.presentation.base.IAPHelper$initBilling$1.onBillingServiceDisconnected (IAPHelper.java:53)
  at com.android.billingclient.api.BillingClientImpl$zza.onServiceDisconnected (BillingClientImpl.java:11)
  at android.app.LoadedApk$ServiceDispatcher.doConnected (LoadedApk.java:2060)
  at android.app.LoadedApk$ServiceDispatcher$RunConnection.run (LoadedApk.java:2099)
  at android.os.Handler.handleCallback (Handler.java:883)
  at android.os.Handler.dispatchMessage (Handler.java:100)
  at android.os.Looper.loop (Looper.java:237)
  at android.app.ActivityThread.main (ActivityThread.java:7857)
  at java.lang.reflect.Method.invoke (Method.java)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:493)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1076)
Caused by: android.os.RemoteException: 
  at com.android.server.am.ActivityManagerService.registerReceiver (ActivityManagerService.java:16726)
  at android.app.IActivityManager$Stub.onTransact (IActivityManager.java:2250)
  at com.android.server.am.ActivityManagerService.onTransact (ActivityManagerService.java:3357)
  at android.os.Binder.execTransactInternal (Binder.java:1021)
  at android.os.Binder.execTransact (Binder.java:994)
Run Code Online (Sandbox Code Playgroud)

我想知道我做错了什么onBillingServiceDisconnected(),所以我用谷歌搜索了一段时间,但没有找到任何明确的建议// implement your own retry logic。这就是例如谷歌所说的。这里的重试逻辑究竟是什么?正如您在堆栈跟踪调用中看到的那样startConnection(),正如谷歌的评论所建议的那样,导致崩溃。谷歌在这里说我应该忽略它,因为 Play 服务onBillingSetupFinished()最终会调用。

你是如何处理这个案子的?

Sye*_*yex 8

没有找到我的问题的具体答案如何处理失败案例。我重构了我的代码,所以我基本上忽略了调用onBillingServiceDisconnected(),只向用户显示错误消息。

现在每次尝试购买的电话都会检查是否

  • BillingClient 被初始化
  • BilligClientready
  • Sku详情不为空

只有在这些成功之后才尝试进行购买。

以前,我在 app init 上做过上述所有操作。如果连接失败,现在,我将在用户再次单击购买项目时重试(使用 try catch)。这可能无法解决崩溃问题,但至少可以为用户提供更好的体验和控制。