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

7
前段时间,我在一个Flutter应用程序(Android和iOS)中添加了应用内购买功能,通过从code lab中愉快地复制和粘贴代码来实现。 它在生产环境中运行良好。然而,突然之间,在VS Code中运行Android构建时,连续快速打印出以下两条消息:
W/BillingClient(25973): Billing service disconnected.
D/InAppPurchasePlugin(25973): Tried to call onBillingSetupFinished multiple times.

在消息被记录数百次后,偶尔会出现以下的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)

这些消息的问题在于设备发热,动画变得卡顿,表明BillingClientInAppPurchasePlugin在一个无限循环中忙碌。
现在的问题是,是什么导致了这个问题?如何解决?
发生的地方: 代码实验室建议创建一个类似于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!;
  }
}

在第一次访问InAppPurchase.instance;之后不久,这些消息开始显示出来。即使in_app_purchase的api没有被使用。

有趣的是,IAPConnection.instance.purchaseStreamonError()回调函数没有被调用。

此外,在生产环境中,应用内购买正常工作,甚至在调试模式下,在消息显示之前,购买会被正确恢复。

这在一个物理的Android 13设备上发生,使用的是in_app_purchase包3.1.5到3.1.10和Flutter 3.13.6。

非常感谢任何关于导致此问题的原因、解决方法或修复方法的建议。谢谢。


你是在尝试在模拟器上运行吗? - undefined
发生在实体设备上 - 尚未在模拟器上尝试过。感谢您指出这一点。问题已更新。 - undefined
4个回答

3
你应该在问题跟踪器上开一个记录,这是谷歌的问题100%。 顺便说一下,你可以通过运行你的应用程序,然后多次更改系统语言来触发这个问题。
我自己尝试了两次打开一个问题,但它就是不出现。

非常感谢您的分享!特别是关于更改系统语言的详细信息。不幸的是,在删除Google Play服务和Google Play商店的数据/缓存后,问题已经消失了。能够重现它将会非常有帮助。再次感谢您。顺便问一下,您要在哪些语言之间切换? - undefined
顺便说一句,如果问题出现在追踪器上,请贴上链接,我会添加我的部分。 - undefined
在我这种情况下,任何语言都可以。我两周前试图提出一个问题,所以我猜它不会出现。可能是一些账户问题。 - undefined
我在in_app_purchase: ^3.1.8遇到了同样的问题。我将语言环境从英语切换到了法语@SePröbläm。 - undefined
@Fossor 自从升级计费服务到v3以来,我也遇到了同样的问题。你报告给谷歌的问题有链接吗?我想把我的情况回复到跟踪器上。 - undefined
@AlanLu,不,问题没有出现。你应该自己尝试打开一个。 - undefined

1
我已向Google报告了这个问题:问题跟踪器,并在#6中收到了“不修复”的回复。
以下是他们的建议:
引用: 可能由于系统区域设置更改触发的语言更新失败,导致服务无法使用。在这种情况下,我建议用户在更改区域设置后等待1-2分钟,看看是否可以进行购买。如果不能,用户将需要手动前往Play商店完成安装过程,以继续购买。

0
突然间,我在我的测试手机上遇到了一个类似的错误。我还没有清除Google Play的缓存。
 W/BillingClient: Exception while checking if billing is supported; try to reconnect
android.os.DeadObjectException
    at android.os.BinderProxy.transactNative(Native Method)
    at android.os.BinderProxy.transact(BinderProxy.java:605)
    at com.google.android.gms.internal.play_billing.zzp.zzs(com.android.billingclient:billing@@6.1.0:2)
    at com.google.android.gms.internal.play_billing.zzk.zzv(com.android.billingclient:billing@@6.1.0:5)
    at com.android.billingclient.api.zzao.zza(com.android.billingclient:billing@@6.1.0:7)
    at com.android.billingclient.api.zzal.call(Unknown Source:2)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at java.lang.Thread.run(Thread.java:923)

清除Google Play的数据后,问题消失了。我认为问题是在从英语切换到保加利亚语时出现的。

-1
我也碰到了同样的问题,突然间在使用flutter in_app_purchase: ^3.1.10的物理安卓设备上出现了这个错误。
奇怪的是之前它还能正常工作...
编辑:所以我发现问题的根源在于我在初始化阶段添加了恢复购买的代码。
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();
}

最后一行被注释掉的代码引起了问题。

非常感谢你的分享!我会仔细研究一下。我的应用程序正在做类似的事情,所以可能有关联。奇怪的是,一旦出现问题,只要访问InAppPurchase.instance;就足以触发这个错误。再次感谢你的帮助! - undefined
昨天,尽管没有进行任何代码更改,但是错误重新出现了。顺便说一下,我在初始化中留下了调用restorePurchases()的代码,只是将其移到了第一位置,并删除了阻塞的等待。现在,即使我将其注释掉,仍然会出现错误,所以可能是其他原因引起的。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接