Flutter/Android:如何修复“计费服务已断开”?

SeP*_*läm 7 android in-app-purchase flutter

不久前,我通过愉快地从代码实验室复制和粘贴代码,将应用程序内购买添加到 Flutter 应用程序(Android 和 iOS)中。它正在生产中工作。然而,突然间,从 VS Code 运行Android构建,会快速连续打印以下两条消息:

W/BillingClient(25973): Billing service disconnected.
D/InAppPurchasePlugin(25973): Tried to call onBillingSetupFinished multiple times.
Run Code Online (Sandbox Code Playgroud)

在消息被记录数百次之后,以下内容DeadObjectException偶尔会加入:

W/BillingClient(25973): Exception while checking if billing is supported; try to reconnect
W/BillingClient(25973): android.os.DeadObjectException
W/BillingClient(25973):     at android.os.BinderProxy.transactNative(Native Method)
W/BillingClient(25973):     at android.os.BinderProxy.transact(BinderProxy.java:595)
W/BillingClient(25973):     at com.google.android.gms.internal.play_billing.zzh.zzo(com.android.billingclient:billing@@6.0.1:2)
W/BillingClient(25973):     at com.google.android.gms.internal.play_billing.zzc.zzq(com.android.billingclient:billing@@6.0.1:5)
W/BillingClient(25973):     at com.android.billingclient.api.zzaf.zza(com.android.billingclient:billing@@6.0.1:13)
W/BillingClient(25973):     at com.android.billingclient.api.zzac.call(Unknown Source:2)
W/BillingClient(25973):     at java.util.concurrent.FutureTask.run(FutureTask.java:264)
W/BillingClient(25973):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137)
W/BillingClient(25973):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637)
W/BillingClient(25973):     at java.lang.Thread.run(Thread.java:1012)
Run Code Online (Sandbox Code Playgroud)

这些消息的问题是设备运行很热并且动画变得不稳定,表明 或 正BillingClient处于InAppPurchasePlugin无限循环中。

现在的简短问题是,是什么造成了这种情况?如何修复它?

发生地点:

代码实验室建议创建一个IAPConnection如下所示的类:

// Gives the option to override in tests.
class IAPConnection {
  static InAppPurchase? _instance;
  static set instance(InAppPurchase value) {
    _instance = value;
  }

  static InAppPurchase get instance {
    _instance ??= InAppPurchase.instance;
    return _instance!;
  }
}
Run Code Online (Sandbox Code Playgroud)

InAppPurchase.instance;首次访问后不久,消息开始显示。即使 in_app_purchase 的 api 未被使用。

同样有趣的是,IAPConnection.instance.purchaseStream它的onError()回调没有被调用。

除此之外,应用程序内购买在生产中运行得很好,甚至在调试模式下,购买也会在消息开始显示之前正确恢复。

它发生在具有 in_app_purchase 包 3.1.5 至 3.1.10 和 Flutter 3.13.6 的物理 Android 13 设备上。

非常感谢任何有关导致此问题的原因或如何解决或解决此问题的想法。谢谢。

小智 -1

我也有同样的情况,突然在使用 flutter in_app_purchase: ^3.1.10 的物理 Android 设备上发生了此错误。

奇怪的是,它曾经工作过一段时间......

编辑:所以我发现我的案例中问题的根源是我在初始化阶段添加了恢复购买的代码

Future<bool?> initialize(PlatformManager platformManager) async {
final Stream purchaseUpdated =
    InAppPurchase.instance.purchaseStream;
_subscription = purchaseUpdated.listen((purchaseDetailsList) {
  _listenToPurchaseUpdated(purchaseDetailsList);
  }, onDone: () {
    _subscription.cancel();
  }, onError: (error) {
    // handle error here.
  });
await _loadProducts();
//await InAppPurchase.instance.restorePurchases();
}
Run Code Online (Sandbox Code Playgroud)

被注释掉的最后一行导致了问题。