我根据Google的教程,使用Play Billing Library 1.0实现了应用内购买。 我只有1件商品可以购买,当它解锁时,我会显示一个Toast.LENGTH_SHORT长度的Toast消息。然而,Toast在那里呆了10秒钟,所以我认为它被多次调用。当我通过queryPurchases(如果有人先前购买并在此期间重新安装应用程序)解锁时,它不会发生。
任何人都知道为什么Toast会停留这么久/为什么会多次调用它?
在我的BillingManager课程中:
@Override
public void onPurchasesUpdated(int responseCode, @Nullable List<Purchase> purchases) {
if (responseCode == BillingClient.BillingResponse.OK) {
for (Purchase purchase : purchases) {
handlePurchases(purchase);
}
mBillingUpdatesListener.onPurchasesUpdated(mPurchases);
} else if (responseCode == BillingClient.BillingResponse.USER_CANCELED) {
} else {
}
}
public void handlePurchases(Purchase purchase) {
//here could be validation on own server
mPurchases.add(purchase);
}
主要活动实现BillingUpdatesListener:
@Override
public void onPurchasesUpdated(List<Purchase> purchases) {
for (Purchase purchase : purchases) {
switch (purchase.getSku()) {
case "premium":
unlockPremium();
break;
}
}
}
public void unlockPremium() {
mPremiumUnlocked = true;
savePremiumUnlocked();
Toast.makeText(this, getResources().getString(R.string.premium_congrats), Toast.LENGTH_SHORT).show();
mAdView.setVisibility(GONE);
}
答案 0 :(得分:5)
如果我理解正确,您说当您第一次购买应用内商品时,您会收到多个Toast?
在Billing库的当前版本(1.0)中,这是因为系统正在进行多个广播。
例如,如果您在库中onPurchaseFinishedReceiver
的第120行查看或断点BillingClientImpl.java
,则在购买后至少调用两次。两次都附上了应用内购买数据,但我注意到每个广播的意图Action
都不同。
在第一次广播中,行动是com.android.vending.billing.PURCHASES_UPDATED
,但第二次是proxy_activity_response_intent_action
。该库不会过滤掉Action值,因此所有这些广播都会导致您purchasesUpdatedListener
被调用。
我没有进一步调查,但我认为我们可以从中得到的结果是发生了某种变化,并认为有必要广播这种变化。
为避免多次敬酒,除非您的高级功能已解锁,否则请勿显示吐司。即如果它已经解锁,则只需忽略更改通知。
顺便说一句,完全有可能在Android Studio中调试购买流程。只需使用您的发布密钥签署您的调试apk,并确保apk版本不高于Play商店中的版本。
buildTypes {
debug {
minifyEnabled false
debuggable true
signingConfig signingConfigs.release
}
release {
minifyEnabled false
signingConfig signingConfigs.release
}
}
答案 1 :(得分:2)
我不知道这是否适用于您的具体情况,但我们遇到了同样的事情,这是Google最终的错误。
有关详细信息,请参阅https://issuetracker.google.com/issues/66054158。
编辑:我刚看到@goRGon发布了同样的事情:)
西班牙多人的例子与上述情况不同。在西班牙方案中,用户实际上是购买IAP的两个副本,因此它们是两个单独的收据,并且用户应该获得两份他们购买的副本。在错误情形中,一次收据会向用户显示两次,因此实际上可以捕获重复的收据。但无论哪种方式,后端验证系统都需要在代码中容纳黑客/错误,这可能导致连续两次发送相同的收据。
答案 2 :(得分:1)
很好的答案,并深入了解@Kuffs!
Google很快会修复多个来电:https://issuetracker.google.com/issues/66054158
但是,即使多次触发onPurchasesUpdate,您与结算流程的集成也应该有效,因为无论如何都可能发生。例如,如果有人在具有相同@gmail帐户的另一台设备上并行购买。一些国家(例如西班牙)的人们经常与许多朋友和家人分享他们的@gmail帐户。
请检查TrivialDrive_v2实施,以了解如何优雅地处理此类情况。